github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/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:43</date>
    10  //</624450114336854016>
    11  
    12  
    13  package simulation_test
    14  
    15  import (
    16  	"context"
    17  	"fmt"
    18  	"sync"
    19  	"time"
    20  
    21  	"github.com/ethereum/go-ethereum/log"
    22  	"github.com/ethereum/go-ethereum/node"
    23  	"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
    24  	"github.com/ethereum/go-ethereum/swarm/network"
    25  	"github.com/ethereum/go-ethereum/swarm/network/simulation"
    26  )
    27  
    28  //每个节点都可以使用下面的节点bucket关联一个kademlia。
    29  //BucketkeyKademlia键。这允许使用waittillhealthy在
    30  //所有节点的花环都是健康的。
    31  func ExampleSimulation_WaitTillHealthy() {
    32  
    33  	sim := simulation.New(map[string]simulation.ServiceFunc{
    34  		"bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) {
    35  			addr := network.NewAddr(ctx.Config.Node())
    36  			hp := network.NewHiveParams()
    37  			hp.Discovery = false
    38  			config := &network.BzzConfig{
    39  				OverlayAddr:  addr.Over(),
    40  				UnderlayAddr: addr.Under(),
    41  				HiveParams:   hp,
    42  			}
    43  			kad := network.NewKademlia(addr.Over(), network.NewKadParams())
    44  //将kademlia存储在bucketkeykademlia下的节点桶中
    45  //这样就可以通过waittillhealthy方法找到它。
    46  			b.Store(simulation.BucketKeyKademlia, kad)
    47  			return network.NewBzz(config, kad, nil, nil, nil), nil, nil
    48  		},
    49  	})
    50  	defer sim.Close()
    51  
    52  	_, err := sim.AddNodesAndConnectRing(10)
    53  	if err != nil {
    54  //正确处理错误…
    55  		panic(err)
    56  	}
    57  
    58  	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
    59  	defer cancel()
    60  	ill, err := sim.WaitTillHealthy(ctx)
    61  	if err != nil {
    62  //检查最新检测到的不健康花环
    63  		for id, kad := range ill {
    64  			fmt.Println("Node", id)
    65  			fmt.Println(kad.String())
    66  		}
    67  //处理错误…
    68  	}
    69  
    70  //继续测试
    71  
    72  }
    73  
    74  //观看模拟网络中的所有对等事件,从一个频道购买接收。
    75  func ExampleSimulation_PeerEvents() {
    76  	sim := simulation.New(nil)
    77  	defer sim.Close()
    78  
    79  	events := sim.PeerEvents(context.Background(), sim.NodeIDs())
    80  
    81  	go func() {
    82  		for e := range events {
    83  			if e.Error != nil {
    84  				log.Error("peer event", "err", e.Error)
    85  				continue
    86  			}
    87  			log.Info("peer event", "node", e.NodeID, "peer", e.PeerID, "type", e.Event.Type)
    88  		}
    89  	}()
    90  }
    91  
    92  //检测节点何时丢弃对等节点。
    93  func ExampleSimulation_PeerEvents_disconnections() {
    94  	sim := simulation.New(nil)
    95  	defer sim.Close()
    96  
    97  	disconnections := sim.PeerEvents(
    98  		context.Background(),
    99  		sim.NodeIDs(),
   100  		simulation.NewPeerEventsFilter().Drop(),
   101  	)
   102  
   103  	go func() {
   104  		for d := range disconnections {
   105  			if d.Error != nil {
   106  				log.Error("peer drop", "err", d.Error)
   107  				continue
   108  			}
   109  			log.Warn("peer drop", "node", d.NodeID, "peer", d.PeerID)
   110  		}
   111  	}()
   112  }
   113  
   114  //观看多种类型的事件或消息。在这种情况下,它们只是不同的
   115  //通过msgcode,但是过滤器也可以为不同的类型或协议设置。
   116  func ExampleSimulation_PeerEvents_multipleFilters() {
   117  	sim := simulation.New(nil)
   118  	defer sim.Close()
   119  
   120  	msgs := sim.PeerEvents(
   121  		context.Background(),
   122  		sim.NodeIDs(),
   123  //当收到BZZ消息1和4时,请注意。
   124  		simulation.NewPeerEventsFilter().ReceivedMessages().Protocol("bzz").MsgCode(1),
   125  		simulation.NewPeerEventsFilter().ReceivedMessages().Protocol("bzz").MsgCode(4),
   126  	)
   127  
   128  	go func() {
   129  		for m := range msgs {
   130  			if m.Error != nil {
   131  				log.Error("bzz message", "err", m.Error)
   132  				continue
   133  			}
   134  			log.Info("bzz message", "node", m.NodeID, "peer", m.PeerID)
   135  		}
   136  	}()
   137  }
   138