github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/whisper/whisperv6/whisper.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:46</date> 10 //</624450125825052672> 11 12 13 package whisperv6 14 15 import ( 16 "bytes" 17 "crypto/ecdsa" 18 "crypto/sha256" 19 "fmt" 20 "math" 21 "runtime" 22 "sync" 23 "time" 24 25 mapset "github.com/deckarep/golang-set" 26 "github.com/ethereum/go-ethereum/common" 27 "github.com/ethereum/go-ethereum/crypto" 28 "github.com/ethereum/go-ethereum/log" 29 "github.com/ethereum/go-ethereum/p2p" 30 "github.com/ethereum/go-ethereum/rlp" 31 "github.com/ethereum/go-ethereum/rpc" 32 "github.com/syndtr/goleveldb/leveldb/errors" 33 "golang.org/x/crypto/pbkdf2" 34 "golang.org/x/sync/syncmap" 35 ) 36 37 //统计数据包含多个与消息相关的计数器用于分析 38 //目的。 39 type Statistics struct { 40 messagesCleared int 41 memoryCleared int 42 memoryUsed int 43 cycles int 44 totalMessagesCleared int 45 } 46 47 const ( 48 maxMsgSizeIdx = iota //Whisper节点允许的最大消息长度 49 overflowIdx //消息队列溢出指示器 50 minPowIdx //耳语节点所需的最小功率 51 minPowToleranceIdx //在有限的时间内,耳语节点所允许的最小功率 52 bloomFilterIdx //此节点感兴趣的主题的Bloom筛选器 53 bloomFilterToleranceIdx //低语节点在有限时间内允许的Bloom过滤器 54 lightClientModeIdx //轻客户端模式。(不转发任何消息) 55 restrictConnectionBetweenLightClientsIdx //限制两个轻型客户端之间的连接 56 ) 57 58 //低语代表通过以太坊的黑暗通信接口 59 //网络,使用自己的P2P通信层。 60 type Whisper struct { 61 protocol p2p.Protocol //协议描述和参数 62 filters *Filters //使用订阅功能安装的消息筛选器 63 64 privateKeys map[string]*ecdsa.PrivateKey //私钥存储 65 symKeys map[string][]byte //对称密钥存储 66 keyMu sync.RWMutex //与密钥存储关联的互斥体 67 68 poolMu sync.RWMutex //用于同步消息和过期池的互斥体 69 envelopes map[common.Hash]*Envelope //此节点当前跟踪的信封池 70 expirations map[uint32]mapset.Set //邮件过期池 71 72 peerMu sync.RWMutex //用于同步活动对等集的互斥体 73 peers map[*Peer]struct{} //当前活动对等点集 74 75 messageQueue chan *Envelope //正常低语消息的消息队列 76 p2pMsgQueue chan *Envelope //对等消息的消息队列(不再转发) 77 quit chan struct{} //用于优美出口的通道 78 79 settings syncmap.Map //保留可动态更改的配置设置 80 81 syncAllowance int //允许处理与耳语相关的消息的最长时间(秒) 82 83 statsMu sync.Mutex //警卫统计 84 stats Statistics //耳语节点统计 85 86 mailServer MailServer //邮件服务器接口 87 } 88 89 //New创建了一个准备好通过以太坊P2P网络通信的耳语客户端。 90 func New(cfg *Config) *Whisper { 91 if cfg == nil { 92 cfg = &DefaultConfig 93 } 94 95 whisper := &Whisper{ 96 privateKeys: make(map[string]*ecdsa.PrivateKey), 97 symKeys: make(map[string][]byte), 98 envelopes: make(map[common.Hash]*Envelope), 99 expirations: make(map[uint32]mapset.Set), 100 peers: make(map[*Peer]struct{}), 101 messageQueue: make(chan *Envelope, messageQueueLimit), 102 p2pMsgQueue: make(chan *Envelope, messageQueueLimit), 103 quit: make(chan struct{}), 104 syncAllowance: DefaultSyncAllowance, 105 } 106 107 whisper.filters = NewFilters(whisper) 108 109 whisper.settings.Store(minPowIdx, cfg.MinimumAcceptedPOW) 110 whisper.settings.Store(maxMsgSizeIdx, cfg.MaxMessageSize) 111 whisper.settings.Store(overflowIdx, false) 112 whisper.settings.Store(restrictConnectionBetweenLightClientsIdx, cfg.RestrictConnectionBetweenLightClients) 113 114 //P2P低语子协议处理程序 115 whisper.protocol = p2p.Protocol{ 116 Name: ProtocolName, 117 Version: uint(ProtocolVersion), 118 Length: NumberOfMessageCodes, 119 Run: whisper.HandlePeer, 120 NodeInfo: func() interface{} { 121 return map[string]interface{}{ 122 "version": ProtocolVersionStr, 123 "maxMessageSize": whisper.MaxMessageSize(), 124 "minimumPoW": whisper.MinPow(), 125 } 126 }, 127 } 128 129 return whisper 130 } 131 132 //minpow返回此节点所需的pow值。 133 func (whisper *Whisper) MinPow() float64 { 134 val, exist := whisper.settings.Load(minPowIdx) 135 if !exist || val == nil { 136 return DefaultMinimumPoW 137 } 138 v, ok := val.(float64) 139 if !ok { 140 log.Error("Error loading minPowIdx, using default") 141 return DefaultMinimumPoW 142 } 143 return v 144 } 145 146 //minpowTolerance返回在有限的 147 //功率改变后的时间。如果已经过了足够的时间或电源没有变化 148 //一旦发生,返回值将与minpow()的返回值相同。 149 func (whisper *Whisper) MinPowTolerance() float64 { 150 val, exist := whisper.settings.Load(minPowToleranceIdx) 151 if !exist || val == nil { 152 return DefaultMinimumPoW 153 } 154 return val.(float64) 155 } 156 157 //Bloomfilter返回所有感兴趣主题的聚合Bloomfilter。 158 //节点只需发送与公布的Bloom筛选器匹配的消息。 159 //如果消息与bloom不匹配,则相当于垃圾邮件,对等端将 160 //断开连接。 161 func (whisper *Whisper) BloomFilter() []byte { 162 val, exist := whisper.settings.Load(bloomFilterIdx) 163 if !exist || val == nil { 164 return nil 165 } 166 return val.([]byte) 167 } 168 169 //BloomFilterTolerance返回允许有限 170 //新花开后的一段时间被宣传给了同行们。如果已经过了足够的时间 171 //或者没有发生过布卢姆滤波器的变化,返回值将相同。 172 //作为bloomfilter()的返回值。 173 func (whisper *Whisper) BloomFilterTolerance() []byte { 174 val, exist := whisper.settings.Load(bloomFilterToleranceIdx) 175 if !exist || val == nil { 176 return nil 177 } 178 return val.([]byte) 179 } 180 181 //maxmessagesize返回可接受的最大消息大小。 182 func (whisper *Whisper) MaxMessageSize() uint32 { 183 val, _ := whisper.settings.Load(maxMsgSizeIdx) 184 return val.(uint32) 185 } 186 187 //溢出返回消息队列是否已满的指示。 188 func (whisper *Whisper) Overflow() bool { 189 val, _ := whisper.settings.Load(overflowIdx) 190 return val.(bool) 191 } 192 193 //API返回Whisper实现提供的RPC描述符 194 func (whisper *Whisper) APIs() []rpc.API { 195 return []rpc.API{ 196 { 197 Namespace: ProtocolName, 198 Version: ProtocolVersionStr, 199 Service: NewPublicWhisperAPI(whisper), 200 Public: true, 201 }, 202 } 203 } 204 205 //registerserver注册mailserver接口。 206 //邮件服务器将使用p2prequestcode处理所有传入的邮件。 207 func (whisper *Whisper) RegisterServer(server MailServer) { 208 whisper.mailServer = server 209 } 210 211 //协议返回此特定客户端运行的耳语子协议。 212 func (whisper *Whisper) Protocols() []p2p.Protocol { 213 return []p2p.Protocol{whisper.protocol} 214 } 215 216 //version返回耳语子协议版本号。 217 func (whisper *Whisper) Version() uint { 218 return whisper.protocol.Version 219 } 220 221 //setmaxmessagesize设置此节点允许的最大消息大小 222 func (whisper *Whisper) SetMaxMessageSize(size uint32) error { 223 if size > MaxMessageSize { 224 return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize) 225 } 226 whisper.settings.Store(maxMsgSizeIdx, size) 227 return nil 228 } 229 230 //setbloomfilter设置新的bloom filter 231 func (whisper *Whisper) SetBloomFilter(bloom []byte) error { 232 if len(bloom) != BloomFilterSize { 233 return fmt.Errorf("invalid bloom filter size: %d", len(bloom)) 234 } 235 236 b := make([]byte, BloomFilterSize) 237 copy(b, bloom) 238 239 whisper.settings.Store(bloomFilterIdx, b) 240 whisper.notifyPeersAboutBloomFilterChange(b) 241 242 go func() { 243 //在所有对等方处理通知之前允许一段时间 244 time.Sleep(time.Duration(whisper.syncAllowance) * time.Second) 245 whisper.settings.Store(bloomFilterToleranceIdx, b) 246 }() 247 248 return nil 249 } 250 251 //setminimumPow设置此节点所需的最小Pow 252 func (whisper *Whisper) SetMinimumPoW(val float64) error { 253 if val < 0.0 { 254 return fmt.Errorf("invalid PoW: %f", val) 255 } 256 257 whisper.settings.Store(minPowIdx, val) 258 whisper.notifyPeersAboutPowRequirementChange(val) 259 260 go func() { 261 //在所有对等方处理通知之前允许一段时间 262 time.Sleep(time.Duration(whisper.syncAllowance) * time.Second) 263 whisper.settings.Store(minPowToleranceIdx, val) 264 }() 265 266 return nil 267 } 268 269 //setminimumPowTest设置测试环境中的最小Pow 270 func (whisper *Whisper) SetMinimumPowTest(val float64) { 271 whisper.settings.Store(minPowIdx, val) 272 whisper.notifyPeersAboutPowRequirementChange(val) 273 whisper.settings.Store(minPowToleranceIdx, val) 274 } 275 276 //setlightclientmode生成节点light client(不转发任何消息) 277 func (whisper *Whisper) SetLightClientMode(v bool) { 278 whisper.settings.Store(lightClientModeIdx, v) 279 } 280 281 //lightclientmode表示此节点是light client(不转发任何消息) 282 func (whisper *Whisper) LightClientMode() bool { 283 val, exist := whisper.settings.Load(lightClientModeIdx) 284 if !exist || val == nil { 285 return false 286 } 287 v, ok := val.(bool) 288 return v && ok 289 } 290 291 //LightClientModeConnectionRestricted表示不允许以轻型客户端模式连接到轻型客户端 292 func (whisper *Whisper) LightClientModeConnectionRestricted() bool { 293 val, exist := whisper.settings.Load(restrictConnectionBetweenLightClientsIdx) 294 if !exist || val == nil { 295 return false 296 } 297 v, ok := val.(bool) 298 return v && ok 299 } 300 301 func (whisper *Whisper) notifyPeersAboutPowRequirementChange(pow float64) { 302 arr := whisper.getPeers() 303 for _, p := range arr { 304 err := p.notifyAboutPowRequirementChange(pow) 305 if err != nil { 306 //允许重试 307 err = p.notifyAboutPowRequirementChange(pow) 308 } 309 if err != nil { 310 log.Warn("failed to notify peer about new pow requirement", "peer", p.ID(), "error", err) 311 } 312 } 313 } 314 315 func (whisper *Whisper) notifyPeersAboutBloomFilterChange(bloom []byte) { 316 arr := whisper.getPeers() 317 for _, p := range arr { 318 err := p.notifyAboutBloomFilterChange(bloom) 319 if err != nil { 320 //允许重试 321 err = p.notifyAboutBloomFilterChange(bloom) 322 } 323 if err != nil { 324 log.Warn("failed to notify peer about new bloom filter", "peer", p.ID(), "error", err) 325 } 326 } 327 } 328 329 func (whisper *Whisper) getPeers() []*Peer { 330 arr := make([]*Peer, len(whisper.peers)) 331 i := 0 332 whisper.peerMu.Lock() 333 for p := range whisper.peers { 334 arr[i] = p 335 i++ 336 } 337 whisper.peerMu.Unlock() 338 return arr 339 } 340 341 //getpeer按ID检索peer 342 func (whisper *Whisper) getPeer(peerID []byte) (*Peer, error) { 343 whisper.peerMu.Lock() 344 defer whisper.peerMu.Unlock() 345 for p := range whisper.peers { 346 id := p.peer.ID() 347 if bytes.Equal(peerID, id[:]) { 348 return p, nil 349 } 350 } 351 return nil, fmt.Errorf("Could not find peer with ID: %x", peerID) 352 } 353 354 //allowp2pmessagesfrompeer标记特定的受信任对等机, 355 //这将允许它发送历史(过期)消息。 356 func (whisper *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error { 357 p, err := whisper.getPeer(peerID) 358 if err != nil { 359 return err 360 } 361 p.trusted = true 362 return nil 363 } 364 365 //RequestHistoricMessages向特定对等端发送带有p2prequestcode的消息, 366 //它可以实现mailserver接口,并且应该处理这个 367 //请求和响应一些对等消息(可能已过期), 368 //不能再转发了。 369 //耳语协议对信封的格式和内容不可知。 370 func (whisper *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error { 371 p, err := whisper.getPeer(peerID) 372 if err != nil { 373 return err 374 } 375 p.trusted = true 376 return p2p.Send(p.ws, p2pRequestCode, envelope) 377 } 378 379 //sendp2pmessage向特定对等发送对等消息。 380 func (whisper *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error { 381 p, err := whisper.getPeer(peerID) 382 if err != nil { 383 return err 384 } 385 return whisper.SendP2PDirect(p, envelope) 386 } 387 388 //sendp2pdirect向特定对等发送对等消息。 389 func (whisper *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error { 390 return p2p.Send(peer.ws, p2pMessageCode, envelope) 391 } 392 393 //NewKeyPair为客户端生成新的加密标识,并注入 394 //它进入已知的身份信息进行解密。返回新密钥对的ID。 395 func (whisper *Whisper) NewKeyPair() (string, error) { 396 key, err := crypto.GenerateKey() 397 if err != nil || !validatePrivateKey(key) { 398 key, err = crypto.GenerateKey() //重试一次 399 } 400 if err != nil { 401 return "", err 402 } 403 if !validatePrivateKey(key) { 404 return "", fmt.Errorf("failed to generate valid key") 405 } 406 407 id, err := GenerateRandomID() 408 if err != nil { 409 return "", fmt.Errorf("failed to generate ID: %s", err) 410 } 411 412 whisper.keyMu.Lock() 413 defer whisper.keyMu.Unlock() 414 415 if whisper.privateKeys[id] != nil { 416 return "", fmt.Errorf("failed to generate unique ID") 417 } 418 whisper.privateKeys[id] = key 419 return id, nil 420 } 421 422 //DeleteKeyPair删除指定的密钥(如果存在)。 423 func (whisper *Whisper) DeleteKeyPair(key string) bool { 424 whisper.keyMu.Lock() 425 defer whisper.keyMu.Unlock() 426 427 if whisper.privateKeys[key] != nil { 428 delete(whisper.privateKeys, key) 429 return true 430 } 431 return false 432 } 433 434 //AddKeyPair导入非对称私钥并返回其标识符。 435 func (whisper *Whisper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) { 436 id, err := GenerateRandomID() 437 if err != nil { 438 return "", fmt.Errorf("failed to generate ID: %s", err) 439 } 440 441 whisper.keyMu.Lock() 442 whisper.privateKeys[id] = key 443 whisper.keyMu.Unlock() 444 445 return id, nil 446 } 447 448 //hasKeyPair检查耳语节点是否配置了私钥 449 //指定的公用对。 450 func (whisper *Whisper) HasKeyPair(id string) bool { 451 whisper.keyMu.RLock() 452 defer whisper.keyMu.RUnlock() 453 return whisper.privateKeys[id] != nil 454 } 455 456 //getprivatekey检索指定标识的私钥。 457 func (whisper *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) { 458 whisper.keyMu.RLock() 459 defer whisper.keyMu.RUnlock() 460 key := whisper.privateKeys[id] 461 if key == nil { 462 return nil, fmt.Errorf("invalid id") 463 } 464 return key, nil 465 } 466 467 //generatesymkey生成一个随机对称密钥并将其存储在id下, 468 //然后返回。将在将来用于会话密钥交换。 469 func (whisper *Whisper) GenerateSymKey() (string, error) { 470 key, err := generateSecureRandomData(aesKeyLength) 471 if err != nil { 472 return "", err 473 } else if !validateDataIntegrity(key, aesKeyLength) { 474 return "", fmt.Errorf("error in GenerateSymKey: crypto/rand failed to generate random data") 475 } 476 477 id, err := GenerateRandomID() 478 if err != nil { 479 return "", fmt.Errorf("failed to generate ID: %s", err) 480 } 481 482 whisper.keyMu.Lock() 483 defer whisper.keyMu.Unlock() 484 485 if whisper.symKeys[id] != nil { 486 return "", fmt.Errorf("failed to generate unique ID") 487 } 488 whisper.symKeys[id] = key 489 return id, nil 490 } 491 492 //addsymkeydirect存储密钥并返回其ID。 493 func (whisper *Whisper) AddSymKeyDirect(key []byte) (string, error) { 494 if len(key) != aesKeyLength { 495 return "", fmt.Errorf("wrong key size: %d", len(key)) 496 } 497 498 id, err := GenerateRandomID() 499 if err != nil { 500 return "", fmt.Errorf("failed to generate ID: %s", err) 501 } 502 503 whisper.keyMu.Lock() 504 defer whisper.keyMu.Unlock() 505 506 if whisper.symKeys[id] != nil { 507 return "", fmt.Errorf("failed to generate unique ID") 508 } 509 whisper.symKeys[id] = key 510 return id, nil 511 } 512 513 //addsymkeyfrompassword根据密码生成密钥,存储并返回其ID。 514 func (whisper *Whisper) AddSymKeyFromPassword(password string) (string, error) { 515 id, err := GenerateRandomID() 516 if err != nil { 517 return "", fmt.Errorf("failed to generate ID: %s", err) 518 } 519 if whisper.HasSymKey(id) { 520 return "", fmt.Errorf("failed to generate unique ID") 521 } 522 523 //kdf在平均计算机上运行不少于0.1秒, 524 //因为这是一次会议经验 525 derived := pbkdf2.Key([]byte(password), nil, 65356, aesKeyLength, sha256.New) 526 if err != nil { 527 return "", err 528 } 529 530 whisper.keyMu.Lock() 531 defer whisper.keyMu.Unlock() 532 533 //需要进行双重检查,因为DeriveKeyMaterial()非常慢 534 if whisper.symKeys[id] != nil { 535 return "", fmt.Errorf("critical error: failed to generate unique ID") 536 } 537 whisper.symKeys[id] = derived 538 return id, nil 539 } 540 541 //如果有一个键与给定的ID相关联,HassymKey将返回true。 542 //否则返回false。 543 func (whisper *Whisper) HasSymKey(id string) bool { 544 whisper.keyMu.RLock() 545 defer whisper.keyMu.RUnlock() 546 return whisper.symKeys[id] != nil 547 } 548 549 //DeleteSymkey删除与名称字符串关联的键(如果存在)。 550 func (whisper *Whisper) DeleteSymKey(id string) bool { 551 whisper.keyMu.Lock() 552 defer whisper.keyMu.Unlock() 553 if whisper.symKeys[id] != nil { 554 delete(whisper.symKeys, id) 555 return true 556 } 557 return false 558 } 559 560 //GetSymkey返回与给定ID关联的对称密钥。 561 func (whisper *Whisper) GetSymKey(id string) ([]byte, error) { 562 whisper.keyMu.RLock() 563 defer whisper.keyMu.RUnlock() 564 if whisper.symKeys[id] != nil { 565 return whisper.symKeys[id], nil 566 } 567 return nil, fmt.Errorf("non-existent key ID") 568 } 569 570 //订阅安装用于筛选、解密的新消息处理程序 571 //以及随后存储的传入消息。 572 func (whisper *Whisper) Subscribe(f *Filter) (string, error) { 573 s, err := whisper.filters.Install(f) 574 if err == nil { 575 whisper.updateBloomFilter(f) 576 } 577 return s, err 578 } 579 580 //更新BloomFilter重新计算BloomFilter的新值, 581 //必要时通知同行。 582 func (whisper *Whisper) updateBloomFilter(f *Filter) { 583 aggregate := make([]byte, BloomFilterSize) 584 for _, t := range f.Topics { 585 top := BytesToTopic(t) 586 b := TopicToBloom(top) 587 aggregate = addBloom(aggregate, b) 588 } 589 590 if !BloomFilterMatch(whisper.BloomFilter(), aggregate) { 591 //必须更新现有的Bloom过滤器 592 aggregate = addBloom(whisper.BloomFilter(), aggregate) 593 whisper.SetBloomFilter(aggregate) 594 } 595 } 596 597 //GetFilter按ID返回筛选器。 598 func (whisper *Whisper) GetFilter(id string) *Filter { 599 return whisper.filters.Get(id) 600 } 601 602 //取消订阅将删除已安装的消息处理程序。 603 func (whisper *Whisper) Unsubscribe(id string) error { 604 ok := whisper.filters.Uninstall(id) 605 if !ok { 606 return fmt.Errorf("Unsubscribe: Invalid ID") 607 } 608 return nil 609 } 610 611 //send将一条消息插入到whisper发送队列中,并在 612 //网络在未来的周期中。 613 func (whisper *Whisper) Send(envelope *Envelope) error { 614 ok, err := whisper.add(envelope, false) 615 if err == nil && !ok { 616 return fmt.Errorf("failed to add envelope") 617 } 618 return err 619 } 620 621 //start实现node.service,启动后台数据传播线程 622 //关于耳语协议。 623 func (whisper *Whisper) Start(*p2p.Server) error { 624 log.Info("started whisper v." + ProtocolVersionStr) 625 go whisper.update() 626 627 numCPU := runtime.NumCPU() 628 for i := 0; i < numCPU; i++ { 629 go whisper.processQueue() 630 } 631 632 return nil 633 } 634 635 //stop实现node.service,停止后台数据传播线程 636 //关于耳语协议。 637 func (whisper *Whisper) Stop() error { 638 close(whisper.quit) 639 log.Info("whisper stopped") 640 return nil 641 } 642 643 //当低语子协议时,底层p2p层调用handlepeer。 644 //已协商连接。 645 func (whisper *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error { 646 //创建新的对等点并开始跟踪它 647 whisperPeer := newPeer(whisper, peer, rw) 648 649 whisper.peerMu.Lock() 650 whisper.peers[whisperPeer] = struct{}{} 651 whisper.peerMu.Unlock() 652 653 defer func() { 654 whisper.peerMu.Lock() 655 delete(whisper.peers, whisperPeer) 656 whisper.peerMu.Unlock() 657 }() 658 659 //运行对等握手和状态更新 660 if err := whisperPeer.handshake(); err != nil { 661 return err 662 } 663 whisperPeer.start() 664 defer whisperPeer.stop() 665 666 return whisper.runMessageLoop(whisperPeer, rw) 667 } 668 669 //runmessageloop直接读取和处理入站消息以合并到客户端全局状态。 670 func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error { 671 for { 672 //获取下一个数据包 673 packet, err := rw.ReadMsg() 674 if err != nil { 675 log.Info("message loop", "peer", p.peer.ID(), "err", err) 676 return err 677 } 678 if packet.Size > whisper.MaxMessageSize() { 679 log.Warn("oversized message received", "peer", p.peer.ID()) 680 return errors.New("oversized message received") 681 } 682 683 switch packet.Code { 684 case statusCode: 685 //这不应该发生,但不需要惊慌;忽略这条消息。 686 log.Warn("unxepected status message received", "peer", p.peer.ID()) 687 case messagesCode: 688 //解码包含的信封 689 var envelopes []*Envelope 690 if err := packet.Decode(&envelopes); err != nil { 691 log.Warn("failed to decode envelopes, peer will be disconnected", "peer", p.peer.ID(), "err", err) 692 return errors.New("invalid envelopes") 693 } 694 695 trouble := false 696 for _, env := range envelopes { 697 cached, err := whisper.add(env, whisper.LightClientMode()) 698 if err != nil { 699 trouble = true 700 log.Error("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err) 701 } 702 if cached { 703 p.mark(env) 704 } 705 } 706 707 if trouble { 708 return errors.New("invalid envelope") 709 } 710 case powRequirementCode: 711 s := rlp.NewStream(packet.Payload, uint64(packet.Size)) 712 i, err := s.Uint() 713 if err != nil { 714 log.Warn("failed to decode powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 715 return errors.New("invalid powRequirementCode message") 716 } 717 f := math.Float64frombits(i) 718 if math.IsInf(f, 0) || math.IsNaN(f) || f < 0.0 { 719 log.Warn("invalid value in powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 720 return errors.New("invalid value in powRequirementCode message") 721 } 722 p.powRequirement = f 723 case bloomFilterExCode: 724 var bloom []byte 725 err := packet.Decode(&bloom) 726 if err == nil && len(bloom) != BloomFilterSize { 727 err = fmt.Errorf("wrong bloom filter size %d", len(bloom)) 728 } 729 730 if err != nil { 731 log.Warn("failed to decode bloom filter exchange message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 732 return errors.New("invalid bloom filter exchange message") 733 } 734 p.setBloomFilter(bloom) 735 case p2pMessageCode: 736 //点对点消息,直接发送给点绕过POW检查等。 737 //此消息不应转发给其他对等方,并且 738 //因此可能不满足POW、到期等要求。 739 //这些消息只能从受信任的对等方接收。 740 if p.trusted { 741 var envelope Envelope 742 if err := packet.Decode(&envelope); err != nil { 743 log.Warn("failed to decode direct message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 744 return errors.New("invalid direct message") 745 } 746 whisper.postEvent(&envelope, true) 747 } 748 case p2pRequestCode: 749 //如果实现了邮件服务器,则必须进行处理。否则忽略。 750 if whisper.mailServer != nil { 751 var request Envelope 752 if err := packet.Decode(&request); err != nil { 753 log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 754 return errors.New("invalid p2p request") 755 } 756 whisper.mailServer.DeliverMail(p, &request) 757 } 758 default: 759 //新的消息类型可能在未来版本的Whisper中实现。 760 //对于前向兼容性,只需忽略即可。 761 } 762 763 packet.Discard() 764 } 765 } 766 767 //添加将新信封插入要在其中分发的消息池 768 //低语网络。它还将信封插入 769 //适当的时间戳。如果出现错误,应断开连接。 770 //参数isp2p指示消息是否为对等(不应转发)。 771 func (whisper *Whisper) add(envelope *Envelope, isP2P bool) (bool, error) { 772 now := uint32(time.Now().Unix()) 773 sent := envelope.Expiry - envelope.TTL 774 775 if sent > now { 776 if sent-DefaultSyncAllowance > now { 777 return false, fmt.Errorf("envelope created in the future [%x]", envelope.Hash()) 778 } 779 //重新计算POW,针对时差进行调整,再加上一秒钟的延迟时间 780 envelope.calculatePoW(sent - now + 1) 781 } 782 783 if envelope.Expiry < now { 784 if envelope.Expiry+DefaultSyncAllowance*2 < now { 785 return false, fmt.Errorf("very old message") 786 } 787 log.Debug("expired envelope dropped", "hash", envelope.Hash().Hex()) 788 return false, nil //不出错地丢弃信封 789 } 790 791 if uint32(envelope.size()) > whisper.MaxMessageSize() { 792 return false, fmt.Errorf("huge messages are not allowed [%x]", envelope.Hash()) 793 } 794 795 if envelope.PoW() < whisper.MinPow() { 796 //也许这个值最近发生了变化,同行们还没有调整。 797 //在这种情况下,以前的值由minPowTolerance()检索 798 //短时间的对等同步。 799 if envelope.PoW() < whisper.MinPowTolerance() { 800 return false, fmt.Errorf("envelope with low PoW received: PoW=%f, hash=[%v]", envelope.PoW(), envelope.Hash().Hex()) 801 } 802 } 803 804 if !BloomFilterMatch(whisper.BloomFilter(), envelope.Bloom()) { 805 //也许这个值最近发生了变化,同行们还没有调整。 806 //在这种情况下,上一个值由BloomFilterTolerance()检索 807 //短时间的对等同步。 808 if !BloomFilterMatch(whisper.BloomFilterTolerance(), envelope.Bloom()) { 809 return false, fmt.Errorf("envelope does not match bloom filter, hash=[%v], bloom: \n%x \n%x \n%x", 810 envelope.Hash().Hex(), whisper.BloomFilter(), envelope.Bloom(), envelope.Topic) 811 } 812 } 813 814 hash := envelope.Hash() 815 816 whisper.poolMu.Lock() 817 _, alreadyCached := whisper.envelopes[hash] 818 if !alreadyCached { 819 whisper.envelopes[hash] = envelope 820 if whisper.expirations[envelope.Expiry] == nil { 821 whisper.expirations[envelope.Expiry] = mapset.NewThreadUnsafeSet() 822 } 823 if !whisper.expirations[envelope.Expiry].Contains(hash) { 824 whisper.expirations[envelope.Expiry].Add(hash) 825 } 826 } 827 whisper.poolMu.Unlock() 828 829 if alreadyCached { 830 log.Trace("whisper envelope already cached", "hash", envelope.Hash().Hex()) 831 } else { 832 log.Trace("cached whisper envelope", "hash", envelope.Hash().Hex()) 833 whisper.statsMu.Lock() 834 whisper.stats.memoryUsed += envelope.size() 835 whisper.statsMu.Unlock() 836 whisper.postEvent(envelope, isP2P) //将新消息通知本地节点 837 if whisper.mailServer != nil { 838 whisper.mailServer.Archive(envelope) 839 } 840 } 841 return true, nil 842 } 843 844 //PostEvent将消息排队以进行进一步处理。 845 func (whisper *Whisper) postEvent(envelope *Envelope, isP2P bool) { 846 if isP2P { 847 whisper.p2pMsgQueue <- envelope 848 } else { 849 whisper.checkOverflow() 850 whisper.messageQueue <- envelope 851 } 852 } 853 854 //检查溢出检查消息队列是否发生溢出,必要时报告。 855 func (whisper *Whisper) checkOverflow() { 856 queueSize := len(whisper.messageQueue) 857 858 if queueSize == messageQueueLimit { 859 if !whisper.Overflow() { 860 whisper.settings.Store(overflowIdx, true) 861 log.Warn("message queue overflow") 862 } 863 } else if queueSize <= messageQueueLimit/2 { 864 if whisper.Overflow() { 865 whisper.settings.Store(overflowIdx, false) 866 log.Warn("message queue overflow fixed (back to normal)") 867 } 868 } 869 } 870 871 //processqueue在whisper节点的生命周期中将消息传递给观察者。 872 func (whisper *Whisper) processQueue() { 873 var e *Envelope 874 for { 875 select { 876 case <-whisper.quit: 877 return 878 879 case e = <-whisper.messageQueue: 880 whisper.filters.NotifyWatchers(e, false) 881 882 case e = <-whisper.p2pMsgQueue: 883 whisper.filters.NotifyWatchers(e, true) 884 } 885 } 886 } 887 888 //更新循环,直到Whisper节点的生存期,更新其内部 889 //通过过期池中的过时消息来进行状态。 890 func (whisper *Whisper) update() { 891 //启动一个断续器以检查到期情况 892 expire := time.NewTicker(expirationCycle) 893 894 //重复更新直到请求终止 895 for { 896 select { 897 case <-expire.C: 898 whisper.expire() 899 900 case <-whisper.quit: 901 return 902 } 903 } 904 } 905 906 //expire在所有过期时间戳上迭代,删除所有过时的 907 //来自池的消息。 908 func (whisper *Whisper) expire() { 909 whisper.poolMu.Lock() 910 defer whisper.poolMu.Unlock() 911 912 whisper.statsMu.Lock() 913 defer whisper.statsMu.Unlock() 914 whisper.stats.reset() 915 now := uint32(time.Now().Unix()) 916 for expiry, hashSet := range whisper.expirations { 917 if expiry < now { 918 //转储所有过期消息并删除时间戳 919 hashSet.Each(func(v interface{}) bool { 920 sz := whisper.envelopes[v.(common.Hash)].size() 921 delete(whisper.envelopes, v.(common.Hash)) 922 whisper.stats.messagesCleared++ 923 whisper.stats.memoryCleared += sz 924 whisper.stats.memoryUsed -= sz 925 return false 926 }) 927 whisper.expirations[expiry].Clear() 928 delete(whisper.expirations, expiry) 929 } 930 } 931 } 932 933 //stats返回低语节点统计信息。 934 func (whisper *Whisper) Stats() Statistics { 935 whisper.statsMu.Lock() 936 defer whisper.statsMu.Unlock() 937 938 return whisper.stats 939 } 940 941 //信封检索节点当前汇集的所有消息。 942 func (whisper *Whisper) Envelopes() []*Envelope { 943 whisper.poolMu.RLock() 944 defer whisper.poolMu.RUnlock() 945 946 all := make([]*Envelope, 0, len(whisper.envelopes)) 947 for _, envelope := range whisper.envelopes { 948 all = append(all, envelope) 949 } 950 return all 951 } 952 953 //ISenvelopecached检查是否已接收和缓存具有特定哈希的信封。 954 func (whisper *Whisper) isEnvelopeCached(hash common.Hash) bool { 955 whisper.poolMu.Lock() 956 defer whisper.poolMu.Unlock() 957 958 _, exist := whisper.envelopes[hash] 959 return exist 960 } 961 962 //重置在每个到期周期后重置节点的统计信息。 963 func (s *Statistics) reset() { 964 s.cycles++ 965 s.totalMessagesCleared += s.messagesCleared 966 967 s.memoryCleared = 0 968 s.messagesCleared = 0 969 } 970 971 //validatePublickey检查给定公钥的格式。 972 func ValidatePublicKey(k *ecdsa.PublicKey) bool { 973 return k != nil && k.X != nil && k.Y != nil && k.X.Sign() != 0 && k.Y.Sign() != 0 974 } 975 976 //validateprivatekey检查给定私钥的格式。 977 func validatePrivateKey(k *ecdsa.PrivateKey) bool { 978 if k == nil || k.D == nil || k.D.Sign() == 0 { 979 return false 980 } 981 return ValidatePublicKey(&k.PublicKey) 982 } 983 984 //如果数据错误或包含所有零,validatedAtainegrity将返回false, 985 //这是最简单也是最常见的错误。 986 func validateDataIntegrity(k []byte, expectedSize int) bool { 987 if len(k) != expectedSize { 988 return false 989 } 990 if expectedSize > 3 && containsOnlyZeros(k) { 991 return false 992 } 993 return true 994 } 995 996 //containsonlyzer检查数据是否只包含零。 997 func containsOnlyZeros(data []byte) bool { 998 for _, b := range data { 999 if b != 0 { 1000 return false 1001 } 1002 } 1003 return true 1004 } 1005 1006 //BytesTouintLittleEndian将切片转换为64位无符号整数。 1007 func bytesToUintLittleEndian(b []byte) (res uint64) { 1008 mul := uint64(1) 1009 for i := 0; i < len(b); i++ { 1010 res += uint64(b[i]) * mul 1011 mul *= 256 1012 } 1013 return res 1014 } 1015 1016 //bytestouintbigendian将切片转换为64位无符号整数。 1017 func BytesToUintBigEndian(b []byte) (res uint64) { 1018 for i := 0; i < len(b); i++ { 1019 res *= 256 1020 res += uint64(b[i]) 1021 } 1022 return res 1023 } 1024 1025 //GenerateRandomID生成一个随机字符串,然后返回该字符串用作键ID 1026 func GenerateRandomID() (id string, err error) { 1027 buf, err := generateSecureRandomData(keyIDSize) 1028 if err != nil { 1029 return "", err 1030 } 1031 if !validateDataIntegrity(buf, keyIDSize) { 1032 return "", fmt.Errorf("error in generateRandomID: crypto/rand failed to generate random data") 1033 } 1034 id = common.Bytes2Hex(buf) 1035 return id, err 1036 } 1037 1038 func isFullNode(bloom []byte) bool { 1039 if bloom == nil { 1040 return true 1041 } 1042 for _, b := range bloom { 1043 if b != 255 { 1044 return false 1045 } 1046 } 1047 return true 1048 } 1049 1050 func BloomFilterMatch(filter, sample []byte) bool { 1051 if filter == nil { 1052 return true 1053 } 1054 1055 for i := 0; i < BloomFilterSize; i++ { 1056 f := filter[i] 1057 s := sample[i] 1058 if (f | s) != f { 1059 return false 1060 } 1061 } 1062 1063 return true 1064 } 1065 1066 func addBloom(a, b []byte) []byte { 1067 c := make([]byte, BloomFilterSize) 1068 for i := 0; i < BloomFilterSize; i++ { 1069 c[i] = a[i] | b[i] 1070 } 1071 return c 1072 } 1073