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  }