github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/rpc/client_example_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:42</date> 10 //</624450108527742976> 11 12 13 package rpc_test 14 15 import ( 16 "context" 17 "fmt" 18 "math/big" 19 "time" 20 21 "github.com/ethereum/go-ethereum/rpc" 22 ) 23 24 //在本例中,我们的客户希望跟踪最新的“块编号” 25 //服务器已知。服务器支持两种方法: 26 // 27 //eth_getBlockByNumber(“最新”,) 28 //返回最新的块对象。 29 // 30 //ETH订阅(“newblocks”) 31 //创建在新块到达时激发块对象的订阅。 32 33 type Block struct { 34 Number *big.Int 35 } 36 37 func ExampleClientSubscription() { 38 //连接客户端。 39 client, _ := rpc.Dial("ws://127.0.0.1:8485“) 40 subch := make(chan Block) 41 42 //确保Subch接收到最新的块。 43 go func() { 44 for i := 0; ; i++ { 45 if i > 0 { 46 time.Sleep(2 * time.Second) 47 } 48 subscribeBlocks(client, subch) 49 } 50 }() 51 52 //到达时打印订阅中的事件。 53 for block := range subch { 54 fmt.Println("latest block:", block.Number) 55 } 56 } 57 58 //subscribeBlocks在自己的goroutine中运行并维护 59 //新块的订阅。 60 func subscribeBlocks(client *rpc.Client, subch chan Block) { 61 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) 62 defer cancel() 63 64 //订阅新块。 65 sub, err := client.EthSubscribe(ctx, subch, "newHeads") 66 if err != nil { 67 fmt.Println("subscribe error:", err) 68 return 69 } 70 71 //现在已建立连接。 72 //用当前块更新频道。 73 var lastBlock Block 74 if err := client.CallContext(ctx, &lastBlock, "eth_getBlockByNumber", "latest"); err != nil { 75 fmt.Println("can't get latest block:", err) 76 return 77 } 78 subch <- lastBlock 79 80 //订阅将向通道传递事件。等待 81 //订阅以任何原因结束,然后循环重新建立 82 //连接。 83 fmt.Println("connection lost: ", <-sub.Err()) 84 } 85