bitbucket.org/number571/tendermint@v0.8.14/light/example_test.go (about) 1 package light_test 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 stdlog "log" 8 "os" 9 "time" 10 11 dbm "github.com/tendermint/tm-db" 12 13 "bitbucket.org/number571/tendermint/abci/example/kvstore" 14 "bitbucket.org/number571/tendermint/libs/log" 15 "bitbucket.org/number571/tendermint/light" 16 "bitbucket.org/number571/tendermint/light/provider" 17 httpp "bitbucket.org/number571/tendermint/light/provider/http" 18 dbs "bitbucket.org/number571/tendermint/light/store/db" 19 rpctest "bitbucket.org/number571/tendermint/rpc/test" 20 ) 21 22 // Automatically getting new headers and verifying them. 23 func ExampleClient_Update() { 24 ctx, cancel := context.WithCancel(context.Background()) 25 defer cancel() 26 conf := rpctest.CreateConfig("ExampleClient_Update") 27 28 // Start a test application 29 app := kvstore.NewApplication() 30 _, closer, err := rpctest.StartTendermint(ctx, conf, app, rpctest.SuppressStdout) 31 if err != nil { 32 stdlog.Fatal(err) 33 } 34 defer func() { _ = closer(ctx) }() 35 36 // give Tendermint time to generate some blocks 37 time.Sleep(5 * time.Second) 38 39 dbDir, err := ioutil.TempDir("", "light-client-example") 40 if err != nil { 41 stdlog.Fatal(err) 42 } 43 defer os.RemoveAll(dbDir) 44 45 chainID := conf.ChainID() 46 47 primary, err := httpp.New(chainID, conf.RPC.ListenAddress) 48 if err != nil { 49 stdlog.Fatal(err) 50 } 51 52 block, err := primary.LightBlock(ctx, 2) 53 if err != nil { 54 stdlog.Fatal(err) 55 } 56 57 db, err := dbm.NewGoLevelDB("light-client-db", dbDir) 58 if err != nil { 59 stdlog.Fatal(err) 60 } 61 62 c, err := light.NewClient( 63 ctx, 64 chainID, 65 light.TrustOptions{ 66 Period: 504 * time.Hour, // 21 days 67 Height: 2, 68 Hash: block.Hash(), 69 }, 70 primary, 71 []provider.Provider{primary}, // NOTE: primary should not be used here 72 dbs.New(db), 73 light.Logger(log.TestingLogger()), 74 ) 75 if err != nil { 76 stdlog.Fatal(err) 77 } 78 defer func() { 79 if err := c.Cleanup(); err != nil { 80 stdlog.Fatal(err) 81 } 82 }() 83 84 time.Sleep(2 * time.Second) 85 86 h, err := c.Update(ctx, time.Now()) 87 if err != nil { 88 stdlog.Fatal(err) 89 } 90 91 if h != nil && h.Height > 2 { 92 fmt.Println("successful update") 93 } else { 94 fmt.Println("update failed") 95 } 96 } 97 98 // Manually getting light blocks and verifying them. 99 func ExampleClient_VerifyLightBlockAtHeight() { 100 ctx, cancel := context.WithCancel(context.Background()) 101 defer cancel() 102 conf := rpctest.CreateConfig("ExampleClient_VerifyLightBlockAtHeight") 103 104 // Start a test application 105 app := kvstore.NewApplication() 106 107 _, closer, err := rpctest.StartTendermint(ctx, conf, app, rpctest.SuppressStdout) 108 if err != nil { 109 stdlog.Fatal(err) 110 } 111 defer func() { _ = closer(ctx) }() 112 113 // give Tendermint time to generate some blocks 114 time.Sleep(5 * time.Second) 115 116 dbDir, err := ioutil.TempDir("", "light-client-example") 117 if err != nil { 118 stdlog.Fatal(err) 119 } 120 defer os.RemoveAll(dbDir) 121 122 chainID := conf.ChainID() 123 124 primary, err := httpp.New(chainID, conf.RPC.ListenAddress) 125 if err != nil { 126 stdlog.Fatal(err) 127 } 128 129 block, err := primary.LightBlock(ctx, 2) 130 if err != nil { 131 stdlog.Fatal(err) 132 } 133 134 db, err := dbm.NewGoLevelDB("light-client-db", dbDir) 135 if err != nil { 136 stdlog.Fatal(err) 137 } 138 139 c, err := light.NewClient(ctx, 140 chainID, 141 light.TrustOptions{ 142 Period: 504 * time.Hour, // 21 days 143 Height: 2, 144 Hash: block.Hash(), 145 }, 146 primary, 147 []provider.Provider{primary}, // NOTE: primary should not be used here 148 dbs.New(db), 149 light.Logger(log.TestingLogger()), 150 ) 151 if err != nil { 152 stdlog.Fatal(err) 153 } 154 defer func() { 155 if err := c.Cleanup(); err != nil { 156 stdlog.Fatal(err) 157 } 158 }() 159 160 _, err = c.VerifyLightBlockAtHeight(context.Background(), 3, time.Now()) 161 if err != nil { 162 stdlog.Fatal(err) 163 } 164 165 h, err := c.TrustedLightBlock(3) 166 if err != nil { 167 stdlog.Fatal(err) 168 } 169 170 fmt.Println("got header", h.Height) 171 }