github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/pss/pss_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:44</date> 10 //</624450117067345920> 11 12 13 package pss 14 15 import ( 16 "bytes" 17 "context" 18 "crypto/ecdsa" 19 "encoding/binary" 20 "encoding/hex" 21 "encoding/json" 22 "flag" 23 "fmt" 24 "io/ioutil" 25 "math/rand" 26 "os" 27 "strconv" 28 "strings" 29 "sync" 30 "testing" 31 "time" 32 33 "github.com/ethereum/go-ethereum/common" 34 "github.com/ethereum/go-ethereum/common/hexutil" 35 "github.com/ethereum/go-ethereum/crypto" 36 "github.com/ethereum/go-ethereum/log" 37 "github.com/ethereum/go-ethereum/metrics" 38 "github.com/ethereum/go-ethereum/metrics/influxdb" 39 "github.com/ethereum/go-ethereum/node" 40 "github.com/ethereum/go-ethereum/p2p" 41 "github.com/ethereum/go-ethereum/p2p/enode" 42 "github.com/ethereum/go-ethereum/p2p/protocols" 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/pot" 48 "github.com/ethereum/go-ethereum/swarm/state" 49 whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" 50 ) 51 52 var ( 53 initOnce = sync.Once{} 54 loglevel = flag.Int("loglevel", 2, "logging verbosity") 55 longrunning = flag.Bool("longrunning", false, "do run long-running tests") 56 w *whisper.Whisper 57 wapi *whisper.PublicWhisperAPI 58 psslogmain log.Logger 59 pssprotocols map[string]*protoCtrl 60 useHandshake bool 61 noopHandlerFunc = func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { 62 return nil 63 } 64 ) 65 66 func init() { 67 flag.Parse() 68 rand.Seed(time.Now().Unix()) 69 70 adapters.RegisterServices(newServices(false)) 71 initTest() 72 } 73 74 func initTest() { 75 initOnce.Do( 76 func() { 77 psslogmain = log.New("psslog", "*") 78 hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) 79 hf := log.LvlFilterHandler(log.Lvl(*loglevel), hs) 80 h := log.CallerFileHandler(hf) 81 log.Root().SetHandler(h) 82 83 w = whisper.New(&whisper.DefaultConfig) 84 wapi = whisper.NewPublicWhisperAPI(w) 85 86 pssprotocols = make(map[string]*protoCtrl) 87 }, 88 ) 89 } 90 91 //测试主题转换函数是否提供可预测的结果 92 func TestTopic(t *testing.T) { 93 94 api := &API{} 95 96 topicstr := strings.Join([]string{PingProtocol.Name, strconv.Itoa(int(PingProtocol.Version))}, ":") 97 98 //bytestotopic是权威的主题转换源 99 topicobj := BytesToTopic([]byte(topicstr)) 100 101 //主题字符串和主题字节必须匹配 102 topicapiobj, _ := api.StringToTopic(topicstr) 103 if topicobj != topicapiobj { 104 t.Fatalf("bytes and string topic conversion mismatch; %s != %s", topicobj, topicapiobj) 105 } 106 107 //topichex的字符串表示法 108 topichex := topicobj.String() 109 110 //PingTopic上的ProtocolTopic包装应与TopicString相同 111 //检查是否匹配 112 pingtopichex := PingTopic.String() 113 if topichex != pingtopichex { 114 t.Fatalf("protocol topic conversion mismatch; %s != %s", topichex, pingtopichex) 115 } 116 117 //主题的json marshal 118 topicjsonout, err := topicobj.MarshalJSON() 119 if err != nil { 120 t.Fatal(err) 121 } 122 if string(topicjsonout)[1:len(topicjsonout)-1] != topichex { 123 t.Fatalf("topic json marshal mismatch; %s != \"%s\"", topicjsonout, topichex) 124 } 125 126 //主题JSON解组 127 var topicjsonin Topic 128 topicjsonin.UnmarshalJSON(topicjsonout) 129 if topicjsonin != topicobj { 130 t.Fatalf("topic json unmarshal mismatch: %x != %x", topicjsonin, topicobj) 131 } 132 } 133 134 //消息控制标志的测试位打包 135 func TestMsgParams(t *testing.T) { 136 var ctrl byte 137 ctrl |= pssControlRaw 138 p := newMsgParamsFromBytes([]byte{ctrl}) 139 m := newPssMsg(p) 140 if !m.isRaw() || m.isSym() { 141 t.Fatal("expected raw=true and sym=false") 142 } 143 ctrl |= pssControlSym 144 p = newMsgParamsFromBytes([]byte{ctrl}) 145 m = newPssMsg(p) 146 if !m.isRaw() || !m.isSym() { 147 t.Fatal("expected raw=true and sym=true") 148 } 149 ctrl &= 0xff &^ pssControlRaw 150 p = newMsgParamsFromBytes([]byte{ctrl}) 151 m = newPssMsg(p) 152 if m.isRaw() || !m.isSym() { 153 t.Fatal("expected raw=false and sym=true") 154 } 155 } 156 157 //测试是否可以插入到缓存中,匹配具有缓存和缓存到期的项 158 func TestCache(t *testing.T) { 159 var err error 160 to, _ := hex.DecodeString("08090a0b0c0d0e0f1011121314150001020304050607161718191a1b1c1d1e1f") 161 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 162 defer cancel() 163 keys, err := wapi.NewKeyPair(ctx) 164 privkey, err := w.GetPrivateKey(keys) 165 if err != nil { 166 t.Fatal(err) 167 } 168 ps := newTestPss(privkey, nil, nil) 169 pp := NewPssParams().WithPrivateKey(privkey) 170 data := []byte("foo") 171 datatwo := []byte("bar") 172 datathree := []byte("baz") 173 wparams := &whisper.MessageParams{ 174 TTL: defaultWhisperTTL, 175 Src: privkey, 176 Dst: &privkey.PublicKey, 177 Topic: whisper.TopicType(PingTopic), 178 WorkTime: defaultWhisperWorkTime, 179 PoW: defaultWhisperPoW, 180 Payload: data, 181 } 182 woutmsg, err := whisper.NewSentMessage(wparams) 183 env, err := woutmsg.Wrap(wparams) 184 msg := &PssMsg{ 185 Payload: env, 186 To: to, 187 } 188 wparams.Payload = datatwo 189 woutmsg, err = whisper.NewSentMessage(wparams) 190 envtwo, err := woutmsg.Wrap(wparams) 191 msgtwo := &PssMsg{ 192 Payload: envtwo, 193 To: to, 194 } 195 wparams.Payload = datathree 196 woutmsg, err = whisper.NewSentMessage(wparams) 197 envthree, err := woutmsg.Wrap(wparams) 198 msgthree := &PssMsg{ 199 Payload: envthree, 200 To: to, 201 } 202 203 digest := ps.digest(msg) 204 if err != nil { 205 t.Fatalf("could not store cache msgone: %v", err) 206 } 207 digesttwo := ps.digest(msgtwo) 208 if err != nil { 209 t.Fatalf("could not store cache msgtwo: %v", err) 210 } 211 digestthree := ps.digest(msgthree) 212 if err != nil { 213 t.Fatalf("could not store cache msgthree: %v", err) 214 } 215 216 if digest == digesttwo { 217 t.Fatalf("different msgs return same hash: %d", digesttwo) 218 } 219 220 //检查缓存 221 err = ps.addFwdCache(msg) 222 if err != nil { 223 t.Fatalf("write to pss expire cache failed: %v", err) 224 } 225 226 if !ps.checkFwdCache(msg) { 227 t.Fatalf("message %v should have EXPIRE record in cache but checkCache returned false", msg) 228 } 229 230 if ps.checkFwdCache(msgtwo) { 231 t.Fatalf("message %v should NOT have EXPIRE record in cache but checkCache returned true", msgtwo) 232 } 233 234 time.Sleep(pp.CacheTTL + 1*time.Second) 235 err = ps.addFwdCache(msgthree) 236 if err != nil { 237 t.Fatalf("write to pss expire cache failed: %v", err) 238 } 239 240 if ps.checkFwdCache(msg) { 241 t.Fatalf("message %v should have expired from cache but checkCache returned true", msg) 242 } 243 244 if _, ok := ps.fwdCache[digestthree]; !ok { 245 t.Fatalf("unexpired message should be in the cache: %v", digestthree) 246 } 247 248 if _, ok := ps.fwdCache[digesttwo]; ok { 249 t.Fatalf("expired message should have been cleared from the cache: %v", digesttwo) 250 } 251 } 252 253 //地址提示的匹配;消息是否可以是节点的 254 func TestAddressMatch(t *testing.T) { 255 256 localaddr := network.RandomAddr().Over() 257 copy(localaddr[:8], []byte("deadbeef")) 258 remoteaddr := []byte("feedbeef") 259 kadparams := network.NewKadParams() 260 kad := network.NewKademlia(localaddr, kadparams) 261 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 262 defer cancel() 263 keys, err := wapi.NewKeyPair(ctx) 264 if err != nil { 265 t.Fatalf("Could not generate private key: %v", err) 266 } 267 privkey, err := w.GetPrivateKey(keys) 268 pssp := NewPssParams().WithPrivateKey(privkey) 269 ps, err := NewPss(kad, pssp) 270 if err != nil { 271 t.Fatal(err.Error()) 272 } 273 274 pssmsg := &PssMsg{ 275 To: remoteaddr, 276 } 277 278 //与第一个字节不同 279 if ps.isSelfRecipient(pssmsg) { 280 t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) 281 } 282 if ps.isSelfPossibleRecipient(pssmsg, false) { 283 t.Fatalf("isSelfPossibleRecipient true but %x != %x", remoteaddr[:8], localaddr[:8]) 284 } 285 286 //8个前字节相同 287 copy(remoteaddr[:4], localaddr[:4]) 288 if ps.isSelfRecipient(pssmsg) { 289 t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) 290 } 291 if !ps.isSelfPossibleRecipient(pssmsg, false) { 292 t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) 293 } 294 295 //所有字节相同 296 pssmsg.To = localaddr 297 if !ps.isSelfRecipient(pssmsg) { 298 t.Fatalf("isSelfRecipient false but %x == %x", remoteaddr, localaddr) 299 } 300 if !ps.isSelfPossibleRecipient(pssmsg, false) { 301 t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) 302 } 303 304 } 305 306 //如果代理处理程序存在且发送方位于消息代理中,测试发送方是否处理消息。 307 func TestProxShortCircuit(t *testing.T) { 308 309 //发送方节点地址 310 localAddr := network.RandomAddr().Over() 311 localPotAddr := pot.NewAddressFromBytes(localAddr) 312 313 //成立卡德利亚 314 kadParams := network.NewKadParams() 315 kad := network.NewKademlia(localAddr, kadParams) 316 peerCount := kad.MinBinSize + 1 317 318 //设置PSS 319 privKey, err := crypto.GenerateKey() 320 pssp := NewPssParams().WithPrivateKey(privKey) 321 ps, err := NewPss(kad, pssp) 322 if err != nil { 323 t.Fatal(err.Error()) 324 } 325 326 //创建Kademlia对等点,这样我们就有了minproxlimit内外的对等点。 327 var peers []*network.Peer 328 proxMessageAddress := pot.RandomAddressAt(localPotAddr, peerCount).Bytes() 329 distantMessageAddress := pot.RandomAddressAt(localPotAddr, 0).Bytes() 330 331 for i := 0; i < peerCount; i++ { 332 rw := &p2p.MsgPipeRW{} 333 ptpPeer := p2p.NewPeer(enode.ID{}, "wanna be with me? [ ] yes [ ] no", []p2p.Cap{}) 334 protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{}) 335 peerAddr := pot.RandomAddressAt(localPotAddr, i) 336 bzzPeer := &network.BzzPeer{ 337 Peer: protoPeer, 338 BzzAddr: &network.BzzAddr{ 339 OAddr: peerAddr.Bytes(), 340 UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])), 341 }, 342 } 343 peer := network.NewPeer(bzzPeer, kad) 344 kad.On(peer) 345 peers = append(peers, peer) 346 } 347 348 //注册IT标记代理功能 349 delivered := make(chan struct{}) 350 rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { 351 log.Trace("in allowraw handler") 352 delivered <- struct{}{} 353 return nil 354 } 355 topic := BytesToTopic([]byte{0x2a}) 356 hndlrProxDereg := ps.Register(&topic, &handler{ 357 f: rawHandlerFunc, 358 caps: &handlerCaps{ 359 raw: true, 360 prox: true, 361 }, 362 }) 363 defer hndlrProxDereg() 364 365 //发送消息太远,发件人不在代理中 366 //接收此消息应超时 367 errC := make(chan error) 368 go func() { 369 err := ps.SendRaw(distantMessageAddress, topic, []byte("foo")) 370 if err != nil { 371 errC <- err 372 } 373 }() 374 375 ctx, cancel := context.WithTimeout(context.TODO(), time.Second) 376 defer cancel() 377 select { 378 case <-delivered: 379 t.Fatal("raw distant message delivered") 380 case err := <-errC: 381 t.Fatal(err) 382 case <-ctx.Done(): 383 } 384 385 //发送应在发送方代理内的消息 386 //应传递此消息 387 go func() { 388 err := ps.SendRaw(proxMessageAddress, topic, []byte("bar")) 389 if err != nil { 390 errC <- err 391 } 392 }() 393 394 ctx, cancel = context.WithTimeout(context.TODO(), time.Second) 395 defer cancel() 396 select { 397 case <-delivered: 398 case err := <-errC: 399 t.Fatal(err) 400 case <-ctx.Done(): 401 t.Fatal("raw timeout") 402 } 403 404 //使用sym和asym send尝试相同的prox消息 405 proxAddrPss := PssAddress(proxMessageAddress) 406 symKeyId, err := ps.GenerateSymmetricKey(topic, proxAddrPss, true) 407 go func() { 408 err := ps.SendSym(symKeyId, topic, []byte("baz")) 409 if err != nil { 410 errC <- err 411 } 412 }() 413 ctx, cancel = context.WithTimeout(context.TODO(), time.Second) 414 defer cancel() 415 select { 416 case <-delivered: 417 case err := <-errC: 418 t.Fatal(err) 419 case <-ctx.Done(): 420 t.Fatal("sym timeout") 421 } 422 423 err = ps.SetPeerPublicKey(&privKey.PublicKey, topic, proxAddrPss) 424 if err != nil { 425 t.Fatal(err) 426 } 427 pubKeyId := hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey)) 428 go func() { 429 err := ps.SendAsym(pubKeyId, topic, []byte("xyzzy")) 430 if err != nil { 431 errC <- err 432 } 433 }() 434 ctx, cancel = context.WithTimeout(context.TODO(), time.Second) 435 defer cancel() 436 select { 437 case <-delivered: 438 case err := <-errC: 439 t.Fatal(err) 440 case <-ctx.Done(): 441 t.Fatal("asym timeout") 442 } 443 } 444 445 //验证是否可以将节点设置为收件人,无论显式消息地址是否匹配,如果主题的至少一个处理程序被显式设置为允许它 446 //注意,在这些测试中,为了方便起见,我们在处理程序上使用原始功能 447 func TestAddressMatchProx(t *testing.T) { 448 449 //收件人节点地址 450 localAddr := network.RandomAddr().Over() 451 localPotAddr := pot.NewAddressFromBytes(localAddr) 452 453 //成立卡德利亚 454 kadparams := network.NewKadParams() 455 kad := network.NewKademlia(localAddr, kadparams) 456 nnPeerCount := kad.MinBinSize 457 peerCount := nnPeerCount + 2 458 459 //设置PSS 460 privKey, err := crypto.GenerateKey() 461 pssp := NewPssParams().WithPrivateKey(privKey) 462 ps, err := NewPss(kad, pssp) 463 if err != nil { 464 t.Fatal(err.Error()) 465 } 466 467 //创建Kademlia对等点,这样我们就有了minproxlimit内外的对等点。 468 var peers []*network.Peer 469 for i := 0; i < peerCount; i++ { 470 rw := &p2p.MsgPipeRW{} 471 ptpPeer := p2p.NewPeer(enode.ID{}, "362436 call me anytime", []p2p.Cap{}) 472 protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{}) 473 peerAddr := pot.RandomAddressAt(localPotAddr, i) 474 bzzPeer := &network.BzzPeer{ 475 Peer: protoPeer, 476 BzzAddr: &network.BzzAddr{ 477 OAddr: peerAddr.Bytes(), 478 UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])), 479 }, 480 } 481 peer := network.NewPeer(bzzPeer, kad) 482 kad.On(peer) 483 peers = append(peers, peer) 484 } 485 486 //TODO:在网络包中创建一个测试,以生成一个具有n个对等机的表,其中n-m是代理对等机 487 //同时对Kademlia进行测试回归,因为我们正在从不同的包中编译测试参数。 488 var proxes int 489 var conns int 490 depth := kad.NeighbourhoodDepth() 491 kad.EachConn(nil, peerCount, func(p *network.Peer, po int) bool { 492 conns++ 493 if po >= depth { 494 proxes++ 495 } 496 return true 497 }) 498 if proxes != nnPeerCount { 499 t.Fatalf("expected %d proxpeers, have %d", nnPeerCount, proxes) 500 } else if conns != peerCount { 501 t.Fatalf("expected %d peers total, have %d", peerCount, proxes) 502 } 503 504 //从localaddr到try的远程地址距离以及使用prox处理程序时的预期结果 505 remoteDistances := []int{ 506 255, 507 nnPeerCount + 1, 508 nnPeerCount, 509 nnPeerCount - 1, 510 0, 511 } 512 expects := []bool{ 513 true, 514 true, 515 true, 516 false, 517 false, 518 } 519 520 //首先对使用prox计算可能接收的方法进行单元测试 521 for i, distance := range remoteDistances { 522 pssMsg := newPssMsg(&msgParams{}) 523 pssMsg.To = make([]byte, len(localAddr)) 524 copy(pssMsg.To, localAddr) 525 var byteIdx = distance / 8 526 pssMsg.To[byteIdx] ^= 1 << uint(7-(distance%8)) 527 log.Trace(fmt.Sprintf("addrmatch %v", bytes.Equal(pssMsg.To, localAddr))) 528 if ps.isSelfPossibleRecipient(pssMsg, true) != expects[i] { 529 t.Fatalf("expected distance %d to be %v", distance, expects[i]) 530 } 531 } 532 533 //我们向上移动到更高的级别并测试实际的消息处理程序 534 //对于每个距离,检查在使用prox变量时,我们是否可能是接收者。 535 536 //此处理程序将为传递给处理程序的每个消息增加一个计数器。 537 var receives int 538 rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { 539 log.Trace("in allowraw handler") 540 receives++ 541 return nil 542 } 543 544 //注册IT标记代理功能 545 topic := BytesToTopic([]byte{0x2a}) 546 hndlrProxDereg := ps.Register(&topic, &handler{ 547 f: rawHandlerFunc, 548 caps: &handlerCaps{ 549 raw: true, 550 prox: true, 551 }, 552 }) 553 554 //测试距离 555 var prevReceive int 556 for i, distance := range remoteDistances { 557 remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) 558 remoteAddr := remotePotAddr.Bytes() 559 560 var data [32]byte 561 rand.Read(data[:]) 562 pssMsg := newPssMsg(&msgParams{raw: true}) 563 pssMsg.To = remoteAddr 564 pssMsg.Expire = uint32(time.Now().Unix() + 4200) 565 pssMsg.Payload = &whisper.Envelope{ 566 Topic: whisper.TopicType(topic), 567 Data: data[:], 568 } 569 570 log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr) 571 ps.handlePssMsg(context.TODO(), pssMsg) 572 if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) { 573 t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i]) 574 } 575 prevReceive = receives 576 } 577 578 //现在添加一个不支持代理的处理程序并测试 579 ps.Register(&topic, &handler{ 580 f: rawHandlerFunc, 581 caps: &handlerCaps{ 582 raw: true, 583 }, 584 }) 585 receives = 0 586 prevReceive = 0 587 for i, distance := range remoteDistances { 588 remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) 589 remoteAddr := remotePotAddr.Bytes() 590 591 var data [32]byte 592 rand.Read(data[:]) 593 pssMsg := newPssMsg(&msgParams{raw: true}) 594 pssMsg.To = remoteAddr 595 pssMsg.Expire = uint32(time.Now().Unix() + 4200) 596 pssMsg.Payload = &whisper.Envelope{ 597 Topic: whisper.TopicType(topic), 598 Data: data[:], 599 } 600 601 log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr) 602 ps.handlePssMsg(context.TODO(), pssMsg) 603 if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) { 604 t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i]) 605 } 606 prevReceive = receives 607 } 608 609 //现在取消注册支持代理的处理程序,现在不会处理任何消息 610 hndlrProxDereg() 611 receives = 0 612 613 for _, distance := range remoteDistances { 614 remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) 615 remoteAddr := remotePotAddr.Bytes() 616 617 pssMsg := newPssMsg(&msgParams{raw: true}) 618 pssMsg.To = remoteAddr 619 pssMsg.Expire = uint32(time.Now().Unix() + 4200) 620 pssMsg.Payload = &whisper.Envelope{ 621 Topic: whisper.TopicType(topic), 622 Data: []byte(remotePotAddr.String()), 623 } 624 625 log.Trace("noprox addrs", "local", localAddr, "remote", remoteAddr) 626 ps.handlePssMsg(context.TODO(), pssMsg) 627 if receives != 0 { 628 t.Fatalf("expected distance %d to not be recipient when prox is not set for handler", distance) 629 } 630 631 } 632 } 633 634 //验证消息队列是否在应该的时候发生,以及是否删除过期和损坏的消息 635 func TestMessageProcessing(t *testing.T) { 636 637 t.Skip("Disabled due to probable faulty logic for outbox expectations") 638 //设置 639 privkey, err := crypto.GenerateKey() 640 if err != nil { 641 t.Fatal(err.Error()) 642 } 643 644 addr := make([]byte, 32) 645 addr[0] = 0x01 646 ps := newTestPss(privkey, network.NewKademlia(addr, network.NewKadParams()), NewPssParams()) 647 648 //消息应该通过 649 msg := newPssMsg(&msgParams{}) 650 msg.To = addr 651 msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) 652 msg.Payload = &whisper.Envelope{ 653 Topic: [4]byte{}, 654 Data: []byte{0x66, 0x6f, 0x6f}, 655 } 656 if err := ps.handlePssMsg(context.TODO(), msg); err != nil { 657 t.Fatal(err.Error()) 658 } 659 tmr := time.NewTimer(time.Millisecond * 100) 660 var outmsg *PssMsg 661 select { 662 case outmsg = <-ps.outbox: 663 case <-tmr.C: 664 default: 665 } 666 if outmsg != nil { 667 t.Fatalf("expected outbox empty after full address on msg, but had message %s", msg) 668 } 669 670 //由于部分长度,消息应通过并排队 671 msg.To = addr[0:1] 672 msg.Payload.Data = []byte{0x78, 0x79, 0x80, 0x80, 0x79} 673 if err := ps.handlePssMsg(context.TODO(), msg); err != nil { 674 t.Fatal(err.Error()) 675 } 676 tmr.Reset(time.Millisecond * 100) 677 outmsg = nil 678 select { 679 case outmsg = <-ps.outbox: 680 case <-tmr.C: 681 } 682 if outmsg == nil { 683 t.Fatal("expected message in outbox on encrypt fail, but empty") 684 } 685 outmsg = nil 686 select { 687 case outmsg = <-ps.outbox: 688 default: 689 } 690 if outmsg != nil { 691 t.Fatalf("expected only one queued message but also had message %v", msg) 692 } 693 694 //完全地址不匹配应将消息放入队列 695 msg.To[0] = 0xff 696 if err := ps.handlePssMsg(context.TODO(), msg); err != nil { 697 t.Fatal(err.Error()) 698 } 699 tmr.Reset(time.Millisecond * 10) 700 outmsg = nil 701 select { 702 case outmsg = <-ps.outbox: 703 case <-tmr.C: 704 } 705 if outmsg == nil { 706 t.Fatal("expected message in outbox on address mismatch, but empty") 707 } 708 outmsg = nil 709 select { 710 case outmsg = <-ps.outbox: 711 default: 712 } 713 if outmsg != nil { 714 t.Fatalf("expected only one queued message but also had message %v", msg) 715 } 716 717 //应删除过期的邮件 718 msg.Expire = uint32(time.Now().Add(-time.Second).Unix()) 719 if err := ps.handlePssMsg(context.TODO(), msg); err != nil { 720 t.Fatal(err.Error()) 721 } 722 tmr.Reset(time.Millisecond * 10) 723 outmsg = nil 724 select { 725 case outmsg = <-ps.outbox: 726 case <-tmr.C: 727 default: 728 } 729 if outmsg != nil { 730 t.Fatalf("expected empty queue but have message %v", msg) 731 } 732 733 //无效消息应返回错误 734 fckedupmsg := &struct { 735 pssMsg *PssMsg 736 }{ 737 pssMsg: &PssMsg{}, 738 } 739 if err := ps.handlePssMsg(context.TODO(), fckedupmsg); err == nil { 740 t.Fatalf("expected error from processMsg but error nil") 741 } 742 743 //发件箱已满应返回错误 744 msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) 745 for i := 0; i < defaultOutboxCapacity; i++ { 746 ps.outbox <- msg 747 } 748 msg.Payload.Data = []byte{0x62, 0x61, 0x72} 749 err = ps.handlePssMsg(context.TODO(), msg) 750 if err == nil { 751 t.Fatal("expected error when mailbox full, but was nil") 752 } 753 } 754 755 //设置和生成公钥和符号键 756 func TestKeys(t *testing.T) { 757 //制作我们的密钥并用它初始化PSS 758 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 759 defer cancel() 760 ourkeys, err := wapi.NewKeyPair(ctx) 761 if err != nil { 762 t.Fatalf("create 'our' key fail") 763 } 764 ctx, cancel2 := context.WithTimeout(context.Background(), time.Second) 765 defer cancel2() 766 theirkeys, err := wapi.NewKeyPair(ctx) 767 if err != nil { 768 t.Fatalf("create 'their' key fail") 769 } 770 ourprivkey, err := w.GetPrivateKey(ourkeys) 771 if err != nil { 772 t.Fatalf("failed to retrieve 'our' private key") 773 } 774 theirprivkey, err := w.GetPrivateKey(theirkeys) 775 if err != nil { 776 t.Fatalf("failed to retrieve 'their' private key") 777 } 778 ps := newTestPss(ourprivkey, nil, nil) 779 780 //使用模拟地址、映射到模拟公共地址和模拟符号密钥设置对等机 781 addr := make(PssAddress, 32) 782 copy(addr, network.RandomAddr().Over()) 783 outkey := network.RandomAddr().Over() 784 topicobj := BytesToTopic([]byte("foo:42")) 785 ps.SetPeerPublicKey(&theirprivkey.PublicKey, topicobj, addr) 786 outkeyid, err := ps.SetSymmetricKey(outkey, topicobj, addr, false) 787 if err != nil { 788 t.Fatalf("failed to set 'our' outgoing symmetric key") 789 } 790 791 //生成一个对称密钥,我们将向对等机发送该密钥,以便对发送给我们的消息进行加密。 792 inkeyid, err := ps.GenerateSymmetricKey(topicobj, addr, true) 793 if err != nil { 794 t.Fatalf("failed to set 'our' incoming symmetric key") 795 } 796 797 //把钥匙从耳语中拿回来,检查它是否仍然一样 798 outkeyback, err := ps.w.GetSymKey(outkeyid) 799 if err != nil { 800 t.Fatalf(err.Error()) 801 } 802 inkey, err := ps.w.GetSymKey(inkeyid) 803 if err != nil { 804 t.Fatalf(err.Error()) 805 } 806 if !bytes.Equal(outkeyback, outkey) { 807 t.Fatalf("passed outgoing symkey doesnt equal stored: %x / %x", outkey, outkeyback) 808 } 809 810 t.Logf("symout: %v", outkeyback) 811 t.Logf("symin: %v", inkey) 812 813 //检查密钥是否存储在对等池中 814 psp := ps.symKeyPool[inkeyid][topicobj] 815 if !bytes.Equal(psp.address, addr) { 816 t.Fatalf("inkey address does not match; %p != %p", psp.address, addr) 817 } 818 } 819 820 //检查我们是否可以为每个主题和对等方检索以前添加的公钥实体 821 func TestGetPublickeyEntries(t *testing.T) { 822 823 privkey, err := crypto.GenerateKey() 824 if err != nil { 825 t.Fatal(err) 826 } 827 ps := newTestPss(privkey, nil, nil) 828 829 peeraddr := network.RandomAddr().Over() 830 topicaddr := make(map[Topic]PssAddress) 831 topicaddr[Topic{0x13}] = peeraddr 832 topicaddr[Topic{0x2a}] = peeraddr[:16] 833 topicaddr[Topic{0x02, 0x9a}] = []byte{} 834 835 remoteprivkey, err := crypto.GenerateKey() 836 if err != nil { 837 t.Fatal(err) 838 } 839 remotepubkeybytes := crypto.FromECDSAPub(&remoteprivkey.PublicKey) 840 remotepubkeyhex := common.ToHex(remotepubkeybytes) 841 842 pssapi := NewAPI(ps) 843 844 for to, a := range topicaddr { 845 err = pssapi.SetPeerPublicKey(remotepubkeybytes, to, a) 846 if err != nil { 847 t.Fatal(err) 848 } 849 } 850 851 intopic, err := pssapi.GetPeerTopics(remotepubkeyhex) 852 if err != nil { 853 t.Fatal(err) 854 } 855 856 OUTER: 857 for _, tnew := range intopic { 858 for torig, addr := range topicaddr { 859 if bytes.Equal(torig[:], tnew[:]) { 860 inaddr, err := pssapi.GetPeerAddress(remotepubkeyhex, torig) 861 if err != nil { 862 t.Fatal(err) 863 } 864 if !bytes.Equal(addr, inaddr) { 865 t.Fatalf("Address mismatch for topic %x; got %x, expected %x", torig, inaddr, addr) 866 } 867 delete(topicaddr, torig) 868 continue OUTER 869 } 870 } 871 t.Fatalf("received topic %x did not match any existing topics", tnew) 872 } 873 874 if len(topicaddr) != 0 { 875 t.Fatalf("%d topics were not matched", len(topicaddr)) 876 } 877 } 878 879 //转发应跳过没有匹配PSS功能的对等端 880 func TestPeerCapabilityMismatch(t *testing.T) { 881 882 //为转发器节点创建私钥 883 privkey, err := crypto.GenerateKey() 884 if err != nil { 885 t.Fatal(err) 886 } 887 888 //初始化KAD 889 baseaddr := network.RandomAddr() 890 kad := network.NewKademlia((baseaddr).Over(), network.NewKadParams()) 891 rw := &p2p.MsgPipeRW{} 892 893 //一个对等机的PSS版本不匹配 894 wrongpssaddr := network.RandomAddr() 895 wrongpsscap := p2p.Cap{ 896 Name: pssProtocolName, 897 Version: 0, 898 } 899 nid := enode.ID{0x01} 900 wrongpsspeer := network.NewPeer(&network.BzzPeer{ 901 Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(wrongpssaddr.Over()), []p2p.Cap{wrongpsscap}), rw, nil), 902 BzzAddr: &network.BzzAddr{OAddr: wrongpssaddr.Over(), UAddr: nil}, 903 }, kad) 904 905 //一个同伴甚至没有PSS(boo!) 906 nopssaddr := network.RandomAddr() 907 nopsscap := p2p.Cap{ 908 Name: "nopss", 909 Version: 1, 910 } 911 nid = enode.ID{0x02} 912 nopsspeer := network.NewPeer(&network.BzzPeer{ 913 Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(nopssaddr.Over()), []p2p.Cap{nopsscap}), rw, nil), 914 BzzAddr: &network.BzzAddr{OAddr: nopssaddr.Over(), UAddr: nil}, 915 }, kad) 916 917 //将对等点添加到Kademlia并激活它们 918 //它是安全的,所以不要检查错误 919 kad.Register(wrongpsspeer.BzzAddr) 920 kad.On(wrongpsspeer) 921 kad.Register(nopsspeer.BzzAddr) 922 kad.On(nopsspeer) 923 924 //创建PSS 925 pssmsg := &PssMsg{ 926 To: []byte{}, 927 Expire: uint32(time.Now().Add(time.Second).Unix()), 928 Payload: &whisper.Envelope{}, 929 } 930 ps := newTestPss(privkey, kad, nil) 931 932 //向前跑 933 //这就足够完成了;试图发送给不具备能力的对等方将创建segfault 934 ps.forward(pssmsg) 935 936 } 937 938 //验证仅当存在主题的至少一个处理程序(其中显式允许原始消息)时才调用原始消息的消息处理程序 939 func TestRawAllow(t *testing.T) { 940 941 //像以前那样多次设置PSS 942 privKey, err := crypto.GenerateKey() 943 if err != nil { 944 t.Fatal(err) 945 } 946 baseAddr := network.RandomAddr() 947 kad := network.NewKademlia((baseAddr).Over(), network.NewKadParams()) 948 ps := newTestPss(privKey, kad, nil) 949 topic := BytesToTopic([]byte{0x2a}) 950 951 //创建处理程序的内部目录,该处理程序在每次消息命中它时递增 952 var receives int 953 rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { 954 log.Trace("in allowraw handler") 955 receives++ 956 return nil 957 } 958 959 //用不带原始功能的处理程序包装此处理程序函数并注册它 960 hndlrNoRaw := &handler{ 961 f: rawHandlerFunc, 962 } 963 ps.Register(&topic, hndlrNoRaw) 964 965 //用原始消息测试它,应该是poo poo 966 pssMsg := newPssMsg(&msgParams{ 967 raw: true, 968 }) 969 pssMsg.To = baseAddr.OAddr 970 pssMsg.Expire = uint32(time.Now().Unix() + 4200) 971 pssMsg.Payload = &whisper.Envelope{ 972 Topic: whisper.TopicType(topic), 973 } 974 ps.handlePssMsg(context.TODO(), pssMsg) 975 if receives > 0 { 976 t.Fatalf("Expected handler not to be executed with raw cap off") 977 } 978 979 //现在用原始功能包装相同的处理程序函数并注册它 980 hndlrRaw := &handler{ 981 f: rawHandlerFunc, 982 caps: &handlerCaps{ 983 raw: true, 984 }, 985 } 986 deregRawHandler := ps.Register(&topic, hndlrRaw) 987 988 //现在应该工作 989 pssMsg.Payload.Data = []byte("Raw Deal") 990 ps.handlePssMsg(context.TODO(), pssMsg) 991 if receives == 0 { 992 t.Fatalf("Expected handler to be executed with raw cap on") 993 } 994 995 //现在注销具有原始功能的处理程序 996 prevReceives := receives 997 deregRawHandler() 998 999 //检查原始消息是否再次失败 1000 pssMsg.Payload.Data = []byte("Raw Trump") 1001 ps.handlePssMsg(context.TODO(), pssMsg) 1002 if receives != prevReceives { 1003 t.Fatalf("Expected handler not to be executed when raw handler is retracted") 1004 } 1005 } 1006 1007 //下面是使用模拟框架的测试 1008 1009 //测试API层是否可以处理边缘大小写值 1010 func TestApi(t *testing.T) { 1011 clients, err := setupNetwork(2, true) 1012 if err != nil { 1013 t.Fatal(err) 1014 } 1015 1016 topic := "0xdeadbeef" 1017 1018 err = clients[0].Call(nil, "pss_sendRaw", "0x", topic, "0x666f6f") 1019 if err != nil { 1020 t.Fatal(err) 1021 } 1022 1023 err = clients[0].Call(nil, "pss_sendRaw", "0xabcdef", topic, "0x") 1024 if err == nil { 1025 t.Fatal("expected error on empty msg") 1026 } 1027 1028 overflowAddr := [33]byte{} 1029 err = clients[0].Call(nil, "pss_sendRaw", hexutil.Encode(overflowAddr[:]), topic, "0x666f6f") 1030 if err == nil { 1031 t.Fatal("expected error on send too big address") 1032 } 1033 } 1034 1035 //验证节点是否可以发送和接收原始(逐字)消息 1036 func TestSendRaw(t *testing.T) { 1037 t.Run("32", testSendRaw) 1038 t.Run("8", testSendRaw) 1039 t.Run("0", testSendRaw) 1040 } 1041 1042 func testSendRaw(t *testing.T) { 1043 1044 var addrsize int64 1045 var err error 1046 1047 paramstring := strings.Split(t.Name(), "/") 1048 1049 addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) 1050 log.Info("raw send test", "addrsize", addrsize) 1051 1052 clients, err := setupNetwork(2, true) 1053 if err != nil { 1054 t.Fatal(err) 1055 } 1056 1057 topic := "0xdeadbeef" 1058 1059 var loaddrhex string 1060 err = clients[0].Call(&loaddrhex, "pss_baseAddr") 1061 if err != nil { 1062 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 1063 } 1064 loaddrhex = loaddrhex[:2+(addrsize*2)] 1065 var roaddrhex string 1066 err = clients[1].Call(&roaddrhex, "pss_baseAddr") 1067 if err != nil { 1068 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 1069 } 1070 roaddrhex = roaddrhex[:2+(addrsize*2)] 1071 1072 time.Sleep(time.Millisecond * 500) 1073 1074 //此时,我们已经验证了在每个对等机上保存和匹配符号键。 1075 //现在尝试向两个方向发送对称加密的消息 1076 lmsgC := make(chan APIMsg) 1077 lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) 1078 defer lcancel() 1079 lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, true, false) 1080 log.Trace("lsub", "id", lsub) 1081 defer lsub.Unsubscribe() 1082 rmsgC := make(chan APIMsg) 1083 rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) 1084 defer rcancel() 1085 rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, true, false) 1086 log.Trace("rsub", "id", rsub) 1087 defer rsub.Unsubscribe() 1088 1089 //发送并验证传递 1090 lmsg := []byte("plugh") 1091 err = clients[1].Call(nil, "pss_sendRaw", loaddrhex, topic, hexutil.Encode(lmsg)) 1092 if err != nil { 1093 t.Fatal(err) 1094 } 1095 select { 1096 case recvmsg := <-lmsgC: 1097 if !bytes.Equal(recvmsg.Msg, lmsg) { 1098 t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) 1099 } 1100 case cerr := <-lctx.Done(): 1101 t.Fatalf("test message (left) timed out: %v", cerr) 1102 } 1103 rmsg := []byte("xyzzy") 1104 err = clients[0].Call(nil, "pss_sendRaw", roaddrhex, topic, hexutil.Encode(rmsg)) 1105 if err != nil { 1106 t.Fatal(err) 1107 } 1108 select { 1109 case recvmsg := <-rmsgC: 1110 if !bytes.Equal(recvmsg.Msg, rmsg) { 1111 t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) 1112 } 1113 case cerr := <-rctx.Done(): 1114 t.Fatalf("test message (right) timed out: %v", cerr) 1115 } 1116 } 1117 1118 //在两个直接连接的对等端之间发送对称加密的消息 1119 func TestSendSym(t *testing.T) { 1120 t.Run("32", testSendSym) 1121 t.Run("8", testSendSym) 1122 t.Run("0", testSendSym) 1123 } 1124 1125 func testSendSym(t *testing.T) { 1126 1127 //地址提示大小 1128 var addrsize int64 1129 var err error 1130 paramstring := strings.Split(t.Name(), "/") 1131 addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) 1132 log.Info("sym send test", "addrsize", addrsize) 1133 1134 clients, err := setupNetwork(2, false) 1135 if err != nil { 1136 t.Fatal(err) 1137 } 1138 1139 var topic string 1140 err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") 1141 if err != nil { 1142 t.Fatal(err) 1143 } 1144 1145 var loaddrhex string 1146 err = clients[0].Call(&loaddrhex, "pss_baseAddr") 1147 if err != nil { 1148 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 1149 } 1150 loaddrhex = loaddrhex[:2+(addrsize*2)] 1151 var roaddrhex string 1152 err = clients[1].Call(&roaddrhex, "pss_baseAddr") 1153 if err != nil { 1154 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 1155 } 1156 roaddrhex = roaddrhex[:2+(addrsize*2)] 1157 1158 //从PSS实例检索公钥 1159 //互惠设置此公钥 1160 var lpubkeyhex string 1161 err = clients[0].Call(&lpubkeyhex, "pss_getPublicKey") 1162 if err != nil { 1163 t.Fatalf("rpc get node 1 pubkey fail: %v", err) 1164 } 1165 var rpubkeyhex string 1166 err = clients[1].Call(&rpubkeyhex, "pss_getPublicKey") 1167 if err != nil { 1168 t.Fatalf("rpc get node 2 pubkey fail: %v", err) 1169 } 1170 1171 time.Sleep(time.Millisecond * 500) 1172 1173 //此时,我们已经验证了在每个对等机上保存和匹配符号键。 1174 //现在尝试向两个方向发送对称加密的消息 1175 lmsgC := make(chan APIMsg) 1176 lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) 1177 defer lcancel() 1178 lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false) 1179 log.Trace("lsub", "id", lsub) 1180 defer lsub.Unsubscribe() 1181 rmsgC := make(chan APIMsg) 1182 rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) 1183 defer rcancel() 1184 rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) 1185 log.Trace("rsub", "id", rsub) 1186 defer rsub.Unsubscribe() 1187 1188 lrecvkey := network.RandomAddr().Over() 1189 rrecvkey := network.RandomAddr().Over() 1190 1191 var lkeyids [2]string 1192 var rkeyids [2]string 1193 1194 //手动设置互惠符号键 1195 err = clients[0].Call(&lkeyids, "psstest_setSymKeys", rpubkeyhex, lrecvkey, rrecvkey, defaultSymKeySendLimit, topic, roaddrhex) 1196 if err != nil { 1197 t.Fatal(err) 1198 } 1199 err = clients[1].Call(&rkeyids, "psstest_setSymKeys", lpubkeyhex, rrecvkey, lrecvkey, defaultSymKeySendLimit, topic, loaddrhex) 1200 if err != nil { 1201 t.Fatal(err) 1202 } 1203 1204 //发送并验证传递 1205 lmsg := []byte("plugh") 1206 err = clients[1].Call(nil, "pss_sendSym", rkeyids[1], topic, hexutil.Encode(lmsg)) 1207 if err != nil { 1208 t.Fatal(err) 1209 } 1210 select { 1211 case recvmsg := <-lmsgC: 1212 if !bytes.Equal(recvmsg.Msg, lmsg) { 1213 t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) 1214 } 1215 case cerr := <-lctx.Done(): 1216 t.Fatalf("test message timed out: %v", cerr) 1217 } 1218 rmsg := []byte("xyzzy") 1219 err = clients[0].Call(nil, "pss_sendSym", lkeyids[1], topic, hexutil.Encode(rmsg)) 1220 if err != nil { 1221 t.Fatal(err) 1222 } 1223 select { 1224 case recvmsg := <-rmsgC: 1225 if !bytes.Equal(recvmsg.Msg, rmsg) { 1226 t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) 1227 } 1228 case cerr := <-rctx.Done(): 1229 t.Fatalf("test message timed out: %v", cerr) 1230 } 1231 } 1232 1233 //在两个直接连接的对等端之间发送非对称加密消息 1234 func TestSendAsym(t *testing.T) { 1235 t.Run("32", testSendAsym) 1236 t.Run("8", testSendAsym) 1237 t.Run("0", testSendAsym) 1238 } 1239 1240 func testSendAsym(t *testing.T) { 1241 1242 //地址提示大小 1243 var addrsize int64 1244 var err error 1245 paramstring := strings.Split(t.Name(), "/") 1246 addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) 1247 log.Info("asym send test", "addrsize", addrsize) 1248 1249 clients, err := setupNetwork(2, false) 1250 if err != nil { 1251 t.Fatal(err) 1252 } 1253 1254 var topic string 1255 err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") 1256 if err != nil { 1257 t.Fatal(err) 1258 } 1259 1260 time.Sleep(time.Millisecond * 250) 1261 1262 var loaddrhex string 1263 err = clients[0].Call(&loaddrhex, "pss_baseAddr") 1264 if err != nil { 1265 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 1266 } 1267 loaddrhex = loaddrhex[:2+(addrsize*2)] 1268 var roaddrhex string 1269 err = clients[1].Call(&roaddrhex, "pss_baseAddr") 1270 if err != nil { 1271 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 1272 } 1273 roaddrhex = roaddrhex[:2+(addrsize*2)] 1274 1275 //从PSS实例检索公钥 1276 //互惠设置此公钥 1277 var lpubkey string 1278 err = clients[0].Call(&lpubkey, "pss_getPublicKey") 1279 if err != nil { 1280 t.Fatalf("rpc get node 1 pubkey fail: %v", err) 1281 } 1282 var rpubkey string 1283 err = clients[1].Call(&rpubkey, "pss_getPublicKey") 1284 if err != nil { 1285 t.Fatalf("rpc get node 2 pubkey fail: %v", err) 1286 } 1287 1288 time.Sleep(time.Millisecond * 500) //替换为配置单元正常代码 1289 1290 lmsgC := make(chan APIMsg) 1291 lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) 1292 defer lcancel() 1293 lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false) 1294 log.Trace("lsub", "id", lsub) 1295 defer lsub.Unsubscribe() 1296 rmsgC := make(chan APIMsg) 1297 rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) 1298 defer rcancel() 1299 rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) 1300 log.Trace("rsub", "id", rsub) 1301 defer rsub.Unsubscribe() 1302 1303 //存储对等公钥 1304 err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex) 1305 if err != nil { 1306 t.Fatal(err) 1307 } 1308 err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex) 1309 if err != nil { 1310 t.Fatal(err) 1311 } 1312 1313 //发送并验证传递 1314 rmsg := []byte("xyzzy") 1315 err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) 1316 if err != nil { 1317 t.Fatal(err) 1318 } 1319 select { 1320 case recvmsg := <-rmsgC: 1321 if !bytes.Equal(recvmsg.Msg, rmsg) { 1322 t.Fatalf("node 2 received payload mismatch: expected %v, got %v", rmsg, recvmsg.Msg) 1323 } 1324 case cerr := <-rctx.Done(): 1325 t.Fatalf("test message timed out: %v", cerr) 1326 } 1327 lmsg := []byte("plugh") 1328 err = clients[1].Call(nil, "pss_sendAsym", lpubkey, topic, hexutil.Encode(lmsg)) 1329 if err != nil { 1330 t.Fatal(err) 1331 } 1332 select { 1333 case recvmsg := <-lmsgC: 1334 if !bytes.Equal(recvmsg.Msg, lmsg) { 1335 t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg.Msg) 1336 } 1337 case cerr := <-lctx.Done(): 1338 t.Fatalf("test message timed out: %v", cerr) 1339 } 1340 } 1341 1342 type Job struct { 1343 Msg []byte 1344 SendNode enode.ID 1345 RecvNode enode.ID 1346 } 1347 1348 func worker(id int, jobs <-chan Job, rpcs map[enode.ID]*rpc.Client, pubkeys map[enode.ID]string, topic string) { 1349 for j := range jobs { 1350 rpcs[j.SendNode].Call(nil, "pss_sendAsym", pubkeys[j.RecvNode], topic, hexutil.Encode(j.Msg)) 1351 } 1352 } 1353 1354 func TestNetwork(t *testing.T) { 1355 t.Run("16/1000/4/sim", testNetwork) 1356 } 1357 1358 //运行名称中的参数: 1359 //节点/msgs/addrbytes/adaptertype 1360 //如果adaptertype为exec,则使用execadapter,否则使用simadapter 1361 func TestNetwork2000(t *testing.T) { 1362 //Enabl() 1363 1364 if !*longrunning { 1365 t.Skip("run with --longrunning flag to run extensive network tests") 1366 } 1367 t.Run("3/2000/4/sim", testNetwork) 1368 t.Run("4/2000/4/sim", testNetwork) 1369 t.Run("8/2000/4/sim", testNetwork) 1370 t.Run("16/2000/4/sim", testNetwork) 1371 } 1372 1373 func TestNetwork5000(t *testing.T) { 1374 //Enabl() 1375 1376 if !*longrunning { 1377 t.Skip("run with --longrunning flag to run extensive network tests") 1378 } 1379 t.Run("3/5000/4/sim", testNetwork) 1380 t.Run("4/5000/4/sim", testNetwork) 1381 t.Run("8/5000/4/sim", testNetwork) 1382 t.Run("16/5000/4/sim", testNetwork) 1383 } 1384 1385 func TestNetwork10000(t *testing.T) { 1386 //Enabl() 1387 1388 if !*longrunning { 1389 t.Skip("run with --longrunning flag to run extensive network tests") 1390 } 1391 t.Run("3/10000/4/sim", testNetwork) 1392 t.Run("4/10000/4/sim", testNetwork) 1393 t.Run("8/10000/4/sim", testNetwork) 1394 } 1395 1396 func testNetwork(t *testing.T) { 1397 paramstring := strings.Split(t.Name(), "/") 1398 nodecount, _ := strconv.ParseInt(paramstring[1], 10, 0) 1399 msgcount, _ := strconv.ParseInt(paramstring[2], 10, 0) 1400 addrsize, _ := strconv.ParseInt(paramstring[3], 10, 0) 1401 adapter := paramstring[4] 1402 1403 log.Info("network test", "nodecount", nodecount, "msgcount", msgcount, "addrhintsize", addrsize) 1404 1405 nodes := make([]enode.ID, nodecount) 1406 bzzaddrs := make(map[enode.ID]string, nodecount) 1407 rpcs := make(map[enode.ID]*rpc.Client, nodecount) 1408 pubkeys := make(map[enode.ID]string, nodecount) 1409 1410 sentmsgs := make([][]byte, msgcount) 1411 recvmsgs := make([]bool, msgcount) 1412 nodemsgcount := make(map[enode.ID]int, nodecount) 1413 1414 trigger := make(chan enode.ID) 1415 1416 var a adapters.NodeAdapter 1417 if adapter == "exec" { 1418 dirname, err := ioutil.TempDir(".", "") 1419 if err != nil { 1420 t.Fatal(err) 1421 } 1422 a = adapters.NewExecAdapter(dirname) 1423 } else if adapter == "tcp" { 1424 a = adapters.NewTCPAdapter(newServices(false)) 1425 } else if adapter == "sim" { 1426 a = adapters.NewSimAdapter(newServices(false)) 1427 } 1428 net := simulations.NewNetwork(a, &simulations.NetworkConfig{ 1429 ID: "0", 1430 }) 1431 defer net.Shutdown() 1432 1433 f, err := os.Open(fmt.Sprintf("testdata/snapshot_%d.json", nodecount)) 1434 if err != nil { 1435 t.Fatal(err) 1436 } 1437 jsonbyte, err := ioutil.ReadAll(f) 1438 if err != nil { 1439 t.Fatal(err) 1440 } 1441 var snap simulations.Snapshot 1442 err = json.Unmarshal(jsonbyte, &snap) 1443 if err != nil { 1444 t.Fatal(err) 1445 } 1446 err = net.Load(&snap) 1447 if err != nil { 1448 //TODO:将p2p仿真框架修复为加载32个节点时不会崩溃 1449 //致死性(Err) 1450 } 1451 1452 time.Sleep(1 * time.Second) 1453 1454 triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client, topic string) error { 1455 msgC := make(chan APIMsg) 1456 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 1457 defer cancel() 1458 sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", topic, false, false) 1459 if err != nil { 1460 t.Fatal(err) 1461 } 1462 go func() { 1463 defer sub.Unsubscribe() 1464 for { 1465 select { 1466 case recvmsg := <-msgC: 1467 idx, _ := binary.Uvarint(recvmsg.Msg) 1468 if !recvmsgs[idx] { 1469 log.Debug("msg recv", "idx", idx, "id", id) 1470 recvmsgs[idx] = true 1471 trigger <- id 1472 } 1473 case <-sub.Err(): 1474 return 1475 } 1476 } 1477 }() 1478 return nil 1479 } 1480 1481 var topic string 1482 for i, nod := range net.GetNodes() { 1483 nodes[i] = nod.ID() 1484 rpcs[nodes[i]], err = nod.Client() 1485 if err != nil { 1486 t.Fatal(err) 1487 } 1488 if topic == "" { 1489 err = rpcs[nodes[i]].Call(&topic, "pss_stringToTopic", "foo:42") 1490 if err != nil { 1491 t.Fatal(err) 1492 } 1493 } 1494 var pubkey string 1495 err = rpcs[nodes[i]].Call(&pubkey, "pss_getPublicKey") 1496 if err != nil { 1497 t.Fatal(err) 1498 } 1499 pubkeys[nod.ID()] = pubkey 1500 var addrhex string 1501 err = rpcs[nodes[i]].Call(&addrhex, "pss_baseAddr") 1502 if err != nil { 1503 t.Fatal(err) 1504 } 1505 bzzaddrs[nodes[i]] = addrhex 1506 err = triggerChecks(trigger, nodes[i], rpcs[nodes[i]], topic) 1507 if err != nil { 1508 t.Fatal(err) 1509 } 1510 } 1511 1512 time.Sleep(1 * time.Second) 1513 1514 //安装工人 1515 jobs := make(chan Job, 10) 1516 for w := 1; w <= 10; w++ { 1517 go worker(w, jobs, rpcs, pubkeys, topic) 1518 } 1519 1520 time.Sleep(1 * time.Second) 1521 1522 for i := 0; i < int(msgcount); i++ { 1523 sendnodeidx := rand.Intn(int(nodecount)) 1524 recvnodeidx := rand.Intn(int(nodecount - 1)) 1525 if recvnodeidx >= sendnodeidx { 1526 recvnodeidx++ 1527 } 1528 nodemsgcount[nodes[recvnodeidx]]++ 1529 sentmsgs[i] = make([]byte, 8) 1530 c := binary.PutUvarint(sentmsgs[i], uint64(i)) 1531 if c == 0 { 1532 t.Fatal("0 byte message") 1533 } 1534 if err != nil { 1535 t.Fatal(err) 1536 } 1537 err = rpcs[nodes[sendnodeidx]].Call(nil, "pss_setPeerPublicKey", pubkeys[nodes[recvnodeidx]], topic, bzzaddrs[nodes[recvnodeidx]]) 1538 if err != nil { 1539 t.Fatal(err) 1540 } 1541 1542 jobs <- Job{ 1543 Msg: sentmsgs[i], 1544 SendNode: nodes[sendnodeidx], 1545 RecvNode: nodes[recvnodeidx], 1546 } 1547 } 1548 1549 finalmsgcount := 0 1550 ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) 1551 defer cancel() 1552 outer: 1553 for i := 0; i < int(msgcount); i++ { 1554 select { 1555 case id := <-trigger: 1556 nodemsgcount[id]-- 1557 finalmsgcount++ 1558 case <-ctx.Done(): 1559 log.Warn("timeout") 1560 break outer 1561 } 1562 } 1563 1564 for i, msg := range recvmsgs { 1565 if !msg { 1566 log.Debug("missing message", "idx", i) 1567 } 1568 } 1569 t.Logf("%d of %d messages received", finalmsgcount, msgcount) 1570 1571 if finalmsgcount != int(msgcount) { 1572 t.Fatalf("%d messages were not received", int(msgcount)-finalmsgcount) 1573 } 1574 1575 } 1576 1577 //在A->B->C->A的网络中检查 1578 //A没有收到两次发送的消息 1579 func TestDeduplication(t *testing.T) { 1580 var err error 1581 1582 clients, err := setupNetwork(3, false) 1583 if err != nil { 1584 t.Fatal(err) 1585 } 1586 1587 var addrsize = 32 1588 var loaddrhex string 1589 err = clients[0].Call(&loaddrhex, "pss_baseAddr") 1590 if err != nil { 1591 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 1592 } 1593 loaddrhex = loaddrhex[:2+(addrsize*2)] 1594 var roaddrhex string 1595 err = clients[1].Call(&roaddrhex, "pss_baseAddr") 1596 if err != nil { 1597 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 1598 } 1599 roaddrhex = roaddrhex[:2+(addrsize*2)] 1600 var xoaddrhex string 1601 err = clients[2].Call(&xoaddrhex, "pss_baseAddr") 1602 if err != nil { 1603 t.Fatalf("rpc get node 3 baseaddr fail: %v", err) 1604 } 1605 xoaddrhex = xoaddrhex[:2+(addrsize*2)] 1606 1607 log.Info("peer", "l", loaddrhex, "r", roaddrhex, "x", xoaddrhex) 1608 1609 var topic string 1610 err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") 1611 if err != nil { 1612 t.Fatal(err) 1613 } 1614 1615 time.Sleep(time.Millisecond * 250) 1616 1617 //从PSS实例检索公钥 1618 //互惠设置此公钥 1619 var rpubkey string 1620 err = clients[1].Call(&rpubkey, "pss_getPublicKey") 1621 if err != nil { 1622 t.Fatalf("rpc get receivenode pubkey fail: %v", err) 1623 } 1624 1625 time.Sleep(time.Millisecond * 500) //替换为配置单元正常代码 1626 1627 rmsgC := make(chan APIMsg) 1628 rctx, cancel := context.WithTimeout(context.Background(), time.Second*1) 1629 defer cancel() 1630 rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) 1631 log.Trace("rsub", "id", rsub) 1632 defer rsub.Unsubscribe() 1633 1634 //存储收件人的公钥 1635 //零长度地址表示转发给所有人 1636 //我们只有两个对等机,它们将在proxbin中,并且都将接收 1637 err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, "0x") 1638 if err != nil { 1639 t.Fatal(err) 1640 } 1641 1642 //发送并验证传递 1643 rmsg := []byte("xyzzy") 1644 err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) 1645 if err != nil { 1646 t.Fatal(err) 1647 } 1648 1649 var receivedok bool 1650 OUTER: 1651 for { 1652 select { 1653 case <-rmsgC: 1654 if receivedok { 1655 t.Fatalf("duplicate message received") 1656 } 1657 receivedok = true 1658 case <-rctx.Done(): 1659 break OUTER 1660 } 1661 } 1662 if !receivedok { 1663 t.Fatalf("message did not arrive") 1664 } 1665 } 1666 1667 //具有不同消息大小的对称发送性能 1668 func BenchmarkSymkeySend(b *testing.B) { 1669 b.Run(fmt.Sprintf("%d", 256), benchmarkSymKeySend) 1670 b.Run(fmt.Sprintf("%d", 1024), benchmarkSymKeySend) 1671 b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkSymKeySend) 1672 b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkSymKeySend) 1673 b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkSymKeySend) 1674 } 1675 1676 func benchmarkSymKeySend(b *testing.B) { 1677 msgsizestring := strings.Split(b.Name(), "/") 1678 if len(msgsizestring) != 2 { 1679 b.Fatalf("benchmark called without msgsize param") 1680 } 1681 msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) 1682 if err != nil { 1683 b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) 1684 } 1685 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 1686 defer cancel() 1687 keys, err := wapi.NewKeyPair(ctx) 1688 privkey, err := w.GetPrivateKey(keys) 1689 ps := newTestPss(privkey, nil, nil) 1690 msg := make([]byte, msgsize) 1691 rand.Read(msg) 1692 topic := BytesToTopic([]byte("foo")) 1693 to := make(PssAddress, 32) 1694 copy(to[:], network.RandomAddr().Over()) 1695 symkeyid, err := ps.GenerateSymmetricKey(topic, to, true) 1696 if err != nil { 1697 b.Fatalf("could not generate symkey: %v", err) 1698 } 1699 symkey, err := ps.w.GetSymKey(symkeyid) 1700 if err != nil { 1701 b.Fatalf("could not retrieve symkey: %v", err) 1702 } 1703 ps.SetSymmetricKey(symkey, topic, to, false) 1704 1705 b.ResetTimer() 1706 for i := 0; i < b.N; i++ { 1707 ps.SendSym(symkeyid, topic, msg) 1708 } 1709 } 1710 1711 //具有不同消息大小的非对称发送性能 1712 func BenchmarkAsymkeySend(b *testing.B) { 1713 b.Run(fmt.Sprintf("%d", 256), benchmarkAsymKeySend) 1714 b.Run(fmt.Sprintf("%d", 1024), benchmarkAsymKeySend) 1715 b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkAsymKeySend) 1716 b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkAsymKeySend) 1717 b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkAsymKeySend) 1718 } 1719 1720 func benchmarkAsymKeySend(b *testing.B) { 1721 msgsizestring := strings.Split(b.Name(), "/") 1722 if len(msgsizestring) != 2 { 1723 b.Fatalf("benchmark called without msgsize param") 1724 } 1725 msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) 1726 if err != nil { 1727 b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) 1728 } 1729 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 1730 defer cancel() 1731 keys, err := wapi.NewKeyPair(ctx) 1732 privkey, err := w.GetPrivateKey(keys) 1733 ps := newTestPss(privkey, nil, nil) 1734 msg := make([]byte, msgsize) 1735 rand.Read(msg) 1736 topic := BytesToTopic([]byte("foo")) 1737 to := make(PssAddress, 32) 1738 copy(to[:], network.RandomAddr().Over()) 1739 ps.SetPeerPublicKey(&privkey.PublicKey, topic, to) 1740 b.ResetTimer() 1741 for i := 0; i < b.N; i++ { 1742 ps.SendAsym(common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey)), topic, msg) 1743 } 1744 } 1745 func BenchmarkSymkeyBruteforceChangeaddr(b *testing.B) { 1746 for i := 100; i < 100000; i = i * 10 { 1747 for j := 32; j < 10000; j = j * 8 { 1748 b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceChangeaddr) 1749 } 1750 //b.run(fmt.sprintf(“%d”,i),BenchmarkSymkeyBruteforceChangeAddr) 1751 } 1752 } 1753 1754 //使用symkey缓存解密性能,最坏情况下 1755 //(解密密钥始终位于缓存中) 1756 func benchmarkSymkeyBruteforceChangeaddr(b *testing.B) { 1757 keycountstring := strings.Split(b.Name(), "/") 1758 cachesize := int64(0) 1759 var ps *Pss 1760 if len(keycountstring) < 2 { 1761 b.Fatalf("benchmark called without count param") 1762 } 1763 keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) 1764 if err != nil { 1765 b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) 1766 } 1767 if len(keycountstring) == 3 { 1768 cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) 1769 if err != nil { 1770 b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) 1771 } 1772 } 1773 pssmsgs := make([]*PssMsg, 0, keycount) 1774 var keyid string 1775 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 1776 defer cancel() 1777 keys, err := wapi.NewKeyPair(ctx) 1778 privkey, err := w.GetPrivateKey(keys) 1779 if cachesize > 0 { 1780 ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) 1781 } else { 1782 ps = newTestPss(privkey, nil, nil) 1783 } 1784 topic := BytesToTopic([]byte("foo")) 1785 for i := 0; i < int(keycount); i++ { 1786 to := make(PssAddress, 32) 1787 copy(to[:], network.RandomAddr().Over()) 1788 keyid, err = ps.GenerateSymmetricKey(topic, to, true) 1789 if err != nil { 1790 b.Fatalf("cant generate symkey #%d: %v", i, err) 1791 } 1792 symkey, err := ps.w.GetSymKey(keyid) 1793 if err != nil { 1794 b.Fatalf("could not retrieve symkey %s: %v", keyid, err) 1795 } 1796 wparams := &whisper.MessageParams{ 1797 TTL: defaultWhisperTTL, 1798 KeySym: symkey, 1799 Topic: whisper.TopicType(topic), 1800 WorkTime: defaultWhisperWorkTime, 1801 PoW: defaultWhisperPoW, 1802 Payload: []byte("xyzzy"), 1803 Padding: []byte("1234567890abcdef"), 1804 } 1805 woutmsg, err := whisper.NewSentMessage(wparams) 1806 if err != nil { 1807 b.Fatalf("could not create whisper message: %v", err) 1808 } 1809 env, err := woutmsg.Wrap(wparams) 1810 if err != nil { 1811 b.Fatalf("could not generate whisper envelope: %v", err) 1812 } 1813 ps.Register(&topic, &handler{ 1814 f: noopHandlerFunc, 1815 }) 1816 pssmsgs = append(pssmsgs, &PssMsg{ 1817 To: to, 1818 Payload: env, 1819 }) 1820 } 1821 b.ResetTimer() 1822 for i := 0; i < b.N; i++ { 1823 if err := ps.process(pssmsgs[len(pssmsgs)-(i%len(pssmsgs))-1], false, false); err != nil { 1824 b.Fatalf("pss processing failed: %v", err) 1825 } 1826 } 1827 } 1828 1829 func BenchmarkSymkeyBruteforceSameaddr(b *testing.B) { 1830 for i := 100; i < 100000; i = i * 10 { 1831 for j := 32; j < 10000; j = j * 8 { 1832 b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceSameaddr) 1833 } 1834 } 1835 } 1836 1837 //使用symkey缓存解密性能,最佳情况 1838 //(解密密钥总是在缓存中的第一个) 1839 func benchmarkSymkeyBruteforceSameaddr(b *testing.B) { 1840 var keyid string 1841 var ps *Pss 1842 cachesize := int64(0) 1843 keycountstring := strings.Split(b.Name(), "/") 1844 if len(keycountstring) < 2 { 1845 b.Fatalf("benchmark called without count param") 1846 } 1847 keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) 1848 if err != nil { 1849 b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) 1850 } 1851 if len(keycountstring) == 3 { 1852 cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) 1853 if err != nil { 1854 b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) 1855 } 1856 } 1857 addr := make([]PssAddress, keycount) 1858 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 1859 defer cancel() 1860 keys, err := wapi.NewKeyPair(ctx) 1861 privkey, err := w.GetPrivateKey(keys) 1862 if cachesize > 0 { 1863 ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) 1864 } else { 1865 ps = newTestPss(privkey, nil, nil) 1866 } 1867 topic := BytesToTopic([]byte("foo")) 1868 for i := 0; i < int(keycount); i++ { 1869 copy(addr[i], network.RandomAddr().Over()) 1870 keyid, err = ps.GenerateSymmetricKey(topic, addr[i], true) 1871 if err != nil { 1872 b.Fatalf("cant generate symkey #%d: %v", i, err) 1873 } 1874 1875 } 1876 symkey, err := ps.w.GetSymKey(keyid) 1877 if err != nil { 1878 b.Fatalf("could not retrieve symkey %s: %v", keyid, err) 1879 } 1880 wparams := &whisper.MessageParams{ 1881 TTL: defaultWhisperTTL, 1882 KeySym: symkey, 1883 Topic: whisper.TopicType(topic), 1884 WorkTime: defaultWhisperWorkTime, 1885 PoW: defaultWhisperPoW, 1886 Payload: []byte("xyzzy"), 1887 Padding: []byte("1234567890abcdef"), 1888 } 1889 woutmsg, err := whisper.NewSentMessage(wparams) 1890 if err != nil { 1891 b.Fatalf("could not create whisper message: %v", err) 1892 } 1893 env, err := woutmsg.Wrap(wparams) 1894 if err != nil { 1895 b.Fatalf("could not generate whisper envelope: %v", err) 1896 } 1897 ps.Register(&topic, &handler{ 1898 f: noopHandlerFunc, 1899 }) 1900 pssmsg := &PssMsg{ 1901 To: addr[len(addr)-1][:], 1902 Payload: env, 1903 } 1904 for i := 0; i < b.N; i++ { 1905 if err := ps.process(pssmsg, false, false); err != nil { 1906 b.Fatalf("pss processing failed: %v", err) 1907 } 1908 } 1909 } 1910 1911 //使用bzz/discovery和pss服务设置模拟网络。 1912 //连接圆中的节点 1913 //如果设置了allowraw,则启用了省略内置PSS加密(请参阅PSSPARAMS) 1914 func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, err error) { 1915 nodes := make([]*simulations.Node, numnodes) 1916 clients = make([]*rpc.Client, numnodes) 1917 if numnodes < 2 { 1918 return nil, fmt.Errorf("Minimum two nodes in network") 1919 } 1920 adapter := adapters.NewSimAdapter(newServices(allowRaw)) 1921 net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ 1922 ID: "0", 1923 DefaultService: "bzz", 1924 }) 1925 for i := 0; i < numnodes; i++ { 1926 nodeconf := adapters.RandomNodeConfig() 1927 nodeconf.Services = []string{"bzz", pssProtocolName} 1928 nodes[i], err = net.NewNodeWithConfig(nodeconf) 1929 if err != nil { 1930 return nil, fmt.Errorf("error creating node 1: %v", err) 1931 } 1932 err = net.Start(nodes[i].ID()) 1933 if err != nil { 1934 return nil, fmt.Errorf("error starting node 1: %v", err) 1935 } 1936 if i > 0 { 1937 err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) 1938 if err != nil { 1939 return nil, fmt.Errorf("error connecting nodes: %v", err) 1940 } 1941 } 1942 clients[i], err = nodes[i].Client() 1943 if err != nil { 1944 return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) 1945 } 1946 } 1947 if numnodes > 2 { 1948 err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) 1949 if err != nil { 1950 return nil, fmt.Errorf("error connecting first and last nodes") 1951 } 1952 } 1953 return clients, nil 1954 } 1955 1956 func newServices(allowRaw bool) adapters.Services { 1957 stateStore := state.NewInmemoryStore() 1958 kademlias := make(map[enode.ID]*network.Kademlia) 1959 kademlia := func(id enode.ID) *network.Kademlia { 1960 if k, ok := kademlias[id]; ok { 1961 return k 1962 } 1963 params := network.NewKadParams() 1964 params.NeighbourhoodSize = 2 1965 params.MaxBinSize = 3 1966 params.MinBinSize = 1 1967 params.MaxRetries = 1000 1968 params.RetryExponent = 2 1969 params.RetryInterval = 1000000 1970 kademlias[id] = network.NewKademlia(id[:], params) 1971 return kademlias[id] 1972 } 1973 return adapters.Services{ 1974 pssProtocolName: func(ctx *adapters.ServiceContext) (node.Service, error) { 1975 //execadapter不执行init()。 1976 initTest() 1977 1978 ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) 1979 defer cancel() 1980 keys, err := wapi.NewKeyPair(ctxlocal) 1981 privkey, err := w.GetPrivateKey(keys) 1982 pssp := NewPssParams().WithPrivateKey(privkey) 1983 pssp.AllowRaw = allowRaw 1984 pskad := kademlia(ctx.Config.ID) 1985 ps, err := NewPss(pskad, pssp) 1986 if err != nil { 1987 return nil, err 1988 } 1989 1990 ping := &Ping{ 1991 OutC: make(chan bool), 1992 Pong: true, 1993 } 1994 p2pp := NewPingProtocol(ping) 1995 pp, err := RegisterProtocol(ps, &PingTopic, PingProtocol, p2pp, &ProtocolParams{Asymmetric: true}) 1996 if err != nil { 1997 return nil, err 1998 } 1999 if useHandshake { 2000 SetHandshakeController(ps, NewHandshakeParams()) 2001 } 2002 ps.Register(&PingTopic, &handler{ 2003 f: pp.Handle, 2004 caps: &handlerCaps{ 2005 raw: true, 2006 }, 2007 }) 2008 ps.addAPI(rpc.API{ 2009 Namespace: "psstest", 2010 Version: "0.3", 2011 Service: NewAPITest(ps), 2012 Public: false, 2013 }) 2014 if err != nil { 2015 log.Error("Couldnt register pss protocol", "err", err) 2016 os.Exit(1) 2017 } 2018 pssprotocols[ctx.Config.ID.String()] = &protoCtrl{ 2019 C: ping.OutC, 2020 protocol: pp, 2021 run: p2pp.Run, 2022 } 2023 return ps, nil 2024 }, 2025 "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { 2026 addr := network.NewAddr(ctx.Config.Node()) 2027 hp := network.NewHiveParams() 2028 hp.Discovery = false 2029 config := &network.BzzConfig{ 2030 OverlayAddr: addr.Over(), 2031 UnderlayAddr: addr.Under(), 2032 HiveParams: hp, 2033 } 2034 return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil 2035 }, 2036 } 2037 } 2038 2039 func newTestPss(privkey *ecdsa.PrivateKey, kad *network.Kademlia, ppextra *PssParams) *Pss { 2040 nid := enode.PubkeyToIDV4(&privkey.PublicKey) 2041 //如果Kademlia未传递给我们,则设置路由 2042 if kad == nil { 2043 kp := network.NewKadParams() 2044 kp.NeighbourhoodSize = 3 2045 kad = network.NewKademlia(nid[:], kp) 2046 } 2047 2048 //创建PSS 2049 pp := NewPssParams().WithPrivateKey(privkey) 2050 if ppextra != nil { 2051 pp.SymKeyCacheCapacity = ppextra.SymKeyCacheCapacity 2052 } 2053 ps, err := NewPss(kad, pp) 2054 if err != nil { 2055 return nil 2056 } 2057 ps.Start(nil) 2058 2059 return ps 2060 } 2061 2062 //API要求测试/开发使用 2063 type APITest struct { 2064 *Pss 2065 } 2066 2067 func NewAPITest(ps *Pss) *APITest { 2068 return &APITest{Pss: ps} 2069 } 2070 2071 func (apitest *APITest) SetSymKeys(pubkeyid string, recvsymkey []byte, sendsymkey []byte, limit uint16, topic Topic, to hexutil.Bytes) ([2]string, error) { 2072 2073 recvsymkeyid, err := apitest.SetSymmetricKey(recvsymkey, topic, PssAddress(to), true) 2074 if err != nil { 2075 return [2]string{}, err 2076 } 2077 sendsymkeyid, err := apitest.SetSymmetricKey(sendsymkey, topic, PssAddress(to), false) 2078 if err != nil { 2079 return [2]string{}, err 2080 } 2081 return [2]string{recvsymkeyid, sendsymkeyid}, nil 2082 } 2083 2084 func (apitest *APITest) Clean() (int, error) { 2085 return apitest.Pss.cleanKeys(), nil 2086 } 2087 2088 //EnableMetrics正在启动InfluxDB Reporter,以便在本地运行测试时收集统计信息 2089 func enableMetrics() { 2090 metrics.Enabled = true 2091 go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 1*time.Second, "http://localhost:8086,“metrics”,“admin”,“admin”,“swarm.”,map[string]string_ 2092 "host": "test", 2093 }) 2094 } 2095