github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/pss/client/client_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 package client 26 27 import ( 28 "bytes" 29 "context" 30 "flag" 31 "fmt" 32 "math/rand" 33 "os" 34 "sync" 35 "testing" 36 "time" 37 38 "github.com/ethereum/go-ethereum/common/hexutil" 39 "github.com/ethereum/go-ethereum/log" 40 "github.com/ethereum/go-ethereum/node" 41 "github.com/ethereum/go-ethereum/p2p" 42 "github.com/ethereum/go-ethereum/p2p/discover" 43 "github.com/ethereum/go-ethereum/p2p/simulations" 44 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 45 "github.com/ethereum/go-ethereum/rpc" 46 "github.com/ethereum/go-ethereum/swarm/network" 47 "github.com/ethereum/go-ethereum/swarm/pss" 48 "github.com/ethereum/go-ethereum/swarm/state" 49 whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" 50 ) 51 52 type protoCtrl struct { 53 C chan bool 54 protocol *pss.Protocol 55 run func(*p2p.Peer, p2p.MsgReadWriter) error 56 } 57 58 var ( 59 debugdebugflag = flag.Bool("vv", false, "veryverbose") 60 debugflag = flag.Bool("v", false, "verbose") 61 w *whisper.Whisper 62 wapi *whisper.PublicWhisperAPI 63 // 64 psslogmain log.Logger 65 pssprotocols map[string]*protoCtrl 66 sendLimit = uint16(256) 67 ) 68 69 var services = newServices() 70 71 func init() { 72 flag.Parse() 73 rand.Seed(time.Now().Unix()) 74 75 adapters.RegisterServices(services) 76 77 loglevel := log.LvlInfo 78 if *debugflag { 79 loglevel = log.LvlDebug 80 } else if *debugdebugflag { 81 loglevel = log.LvlTrace 82 } 83 84 psslogmain = log.New("psslog", "*") 85 hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) 86 hf := log.LvlFilterHandler(loglevel, hs) 87 h := log.CallerFileHandler(hf) 88 log.Root().SetHandler(h) 89 90 w = whisper.New(&whisper.DefaultConfig) 91 wapi = whisper.NewPublicWhisperAPI(w) 92 93 pssprotocols = make(map[string]*protoCtrl) 94 } 95 96 // 97 func TestClientHandshake(t *testing.T) { 98 sendLimit = 3 99 100 clients, err := setupNetwork(2) 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 lpsc, err := NewClientWithRPC(clients[0]) 106 if err != nil { 107 t.Fatal(err) 108 } 109 rpsc, err := NewClientWithRPC(clients[1]) 110 if err != nil { 111 t.Fatal(err) 112 } 113 lpssping := &pss.Ping{ 114 OutC: make(chan bool), 115 InC: make(chan bool), 116 Pong: false, 117 } 118 rpssping := &pss.Ping{ 119 OutC: make(chan bool), 120 InC: make(chan bool), 121 Pong: false, 122 } 123 lproto := pss.NewPingProtocol(lpssping) 124 rproto := pss.NewPingProtocol(rpssping) 125 126 ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) 127 defer cancel() 128 err = lpsc.RunProtocol(ctx, lproto) 129 if err != nil { 130 t.Fatal(err) 131 } 132 err = rpsc.RunProtocol(ctx, rproto) 133 if err != nil { 134 t.Fatal(err) 135 } 136 topic := pss.PingTopic.String() 137 138 var loaddr string 139 err = clients[0].Call(&loaddr, "pss_baseAddr") 140 if err != nil { 141 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 142 } 143 var roaddr string 144 err = clients[1].Call(&roaddr, "pss_baseAddr") 145 if err != nil { 146 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 147 } 148 149 var lpubkey string 150 err = clients[0].Call(&lpubkey, "pss_getPublicKey") 151 if err != nil { 152 t.Fatalf("rpc get node 1 pubkey fail: %v", err) 153 } 154 var rpubkey string 155 err = clients[1].Call(&rpubkey, "pss_getPublicKey") 156 if err != nil { 157 t.Fatalf("rpc get node 2 pubkey fail: %v", err) 158 } 159 160 err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) 161 if err != nil { 162 t.Fatal(err) 163 } 164 err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) 165 if err != nil { 166 t.Fatal(err) 167 } 168 169 time.Sleep(time.Second) 170 171 roaddrbytes, err := hexutil.Decode(roaddr) 172 if err != nil { 173 t.Fatal(err) 174 } 175 err = lpsc.AddPssPeer(rpubkey, roaddrbytes, pss.PingProtocol) 176 if err != nil { 177 t.Fatal(err) 178 } 179 180 time.Sleep(time.Second) 181 182 for i := uint16(0); i <= sendLimit; i++ { 183 lpssping.OutC <- false 184 got := <-rpssping.InC 185 log.Warn("ok", "idx", i, "got", got) 186 time.Sleep(time.Second) 187 } 188 189 rw := lpsc.peerPool[pss.PingTopic][rpubkey] 190 lpsc.RemovePssPeer(rpubkey, pss.PingProtocol) 191 if err := rw.WriteMsg(p2p.Msg{ 192 Size: 3, 193 Payload: bytes.NewReader([]byte("foo")), 194 }); err == nil { 195 t.Fatalf("expected error on write") 196 } 197 } 198 199 func setupNetwork(numnodes int) (clients []*rpc.Client, err error) { 200 nodes := make([]*simulations.Node, numnodes) 201 clients = make([]*rpc.Client, numnodes) 202 if numnodes < 2 { 203 return nil, fmt.Errorf("Minimum two nodes in network") 204 } 205 adapter := adapters.NewSimAdapter(services) 206 net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ 207 ID: "0", 208 DefaultService: "bzz", 209 }) 210 for i := 0; i < numnodes; i++ { 211 nodeconf := adapters.RandomNodeConfig() 212 nodeconf.Services = []string{"bzz", "pss"} 213 nodes[i], err = net.NewNodeWithConfig(nodeconf) 214 if err != nil { 215 return nil, fmt.Errorf("error creating node 1: %v", err) 216 } 217 err = net.Start(nodes[i].ID()) 218 if err != nil { 219 return nil, fmt.Errorf("error starting node 1: %v", err) 220 } 221 if i > 0 { 222 err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) 223 if err != nil { 224 return nil, fmt.Errorf("error connecting nodes: %v", err) 225 } 226 } 227 clients[i], err = nodes[i].Client() 228 if err != nil { 229 return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) 230 } 231 } 232 if numnodes > 2 { 233 err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) 234 if err != nil { 235 return nil, fmt.Errorf("error connecting first and last nodes") 236 } 237 } 238 return clients, nil 239 } 240 241 func newServices() adapters.Services { 242 stateStore := state.NewInmemoryStore() 243 kademlias := make(map[discover.NodeID]*network.Kademlia) 244 kademlia := func(id discover.NodeID) *network.Kademlia { 245 if k, ok := kademlias[id]; ok { 246 return k 247 } 248 addr := network.NewAddrFromNodeID(id) 249 params := network.NewKadParams() 250 params.MinProxBinSize = 2 251 params.MaxBinSize = 3 252 params.MinBinSize = 1 253 params.MaxRetries = 1000 254 params.RetryExponent = 2 255 params.RetryInterval = 1000000 256 kademlias[id] = network.NewKademlia(addr.Over(), params) 257 return kademlias[id] 258 } 259 return adapters.Services{ 260 "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { 261 ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) 262 defer cancel() 263 keys, err := wapi.NewKeyPair(ctxlocal) 264 privkey, err := w.GetPrivateKey(keys) 265 psparams := pss.NewPssParams().WithPrivateKey(privkey) 266 pskad := kademlia(ctx.Config.ID) 267 ps, err := pss.NewPss(pskad, psparams) 268 if err != nil { 269 return nil, err 270 } 271 pshparams := pss.NewHandshakeParams() 272 pshparams.SymKeySendLimit = sendLimit 273 err = pss.SetHandshakeController(ps, pshparams) 274 if err != nil { 275 return nil, fmt.Errorf("handshake controller fail: %v", err) 276 } 277 return ps, nil 278 }, 279 "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { 280 addr := network.NewAddrFromNodeID(ctx.Config.ID) 281 hp := network.NewHiveParams() 282 hp.Discovery = false 283 config := &network.BzzConfig{ 284 OverlayAddr: addr.Over(), 285 UnderlayAddr: addr.Under(), 286 HiveParams: hp, 287 } 288 return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil 289 }, 290 } 291 } 292 293 // 294 type testStore struct { 295 sync.Mutex 296 297 values map[string][]byte 298 } 299 300 func newTestStore() *testStore { 301 return &testStore{values: make(map[string][]byte)} 302 } 303 304 func (t *testStore) Load(key string) ([]byte, error) { 305 return nil, nil 306 } 307 308 func (t *testStore) Save(key string, v []byte) error { 309 return nil 310 }