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