github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/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 12:09:45</date>
    10  //</624342663868452864>
    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