github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/whisper/whisperv6/whisper.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 whisperv6 26 27 import ( 28 "bytes" 29 "crypto/ecdsa" 30 "crypto/sha256" 31 "fmt" 32 "math" 33 "runtime" 34 "sync" 35 "time" 36 37 mapset "github.com/deckarep/golang-set" 38 "github.com/ethereum/go-ethereum/common" 39 "github.com/ethereum/go-ethereum/crypto" 40 "github.com/ethereum/go-ethereum/log" 41 "github.com/ethereum/go-ethereum/p2p" 42 "github.com/ethereum/go-ethereum/rlp" 43 "github.com/ethereum/go-ethereum/rpc" 44 "github.com/syndtr/goleveldb/leveldb/errors" 45 "golang.org/x/crypto/pbkdf2" 46 "golang.org/x/sync/syncmap" 47 ) 48 49 // 50 // 51 type Statistics struct { 52 messagesCleared int 53 memoryCleared int 54 memoryUsed int 55 cycles int 56 totalMessagesCleared int 57 } 58 59 const ( 60 maxMsgSizeIdx = iota // 61 overflowIdx // 62 minPowIdx // 63 minPowToleranceIdx // 64 bloomFilterIdx // 65 bloomFilterToleranceIdx // 66 ) 67 68 // 69 // 70 type Whisper struct { 71 protocol p2p.Protocol // 72 filters *Filters // 73 74 privateKeys map[string]*ecdsa.PrivateKey // 75 symKeys map[string][]byte // 76 keyMu sync.RWMutex // 77 78 poolMu sync.RWMutex // 79 envelopes map[common.Hash]*Envelope // 80 expirations map[uint32]mapset.Set // 81 82 peerMu sync.RWMutex // 83 peers map[*Peer]struct{} // 84 85 messageQueue chan *Envelope // 86 p2pMsgQueue chan *Envelope // 87 quit chan struct{} // 88 89 settings syncmap.Map // 90 91 syncAllowance int // 92 93 lightClient bool // 94 95 statsMu sync.Mutex // 96 stats Statistics // 97 98 mailServer MailServer // 99 } 100 101 // 102 func New(cfg *Config) *Whisper { 103 if cfg == nil { 104 cfg = &DefaultConfig 105 } 106 107 whisper := &Whisper{ 108 privateKeys: make(map[string]*ecdsa.PrivateKey), 109 symKeys: make(map[string][]byte), 110 envelopes: make(map[common.Hash]*Envelope), 111 expirations: make(map[uint32]mapset.Set), 112 peers: make(map[*Peer]struct{}), 113 messageQueue: make(chan *Envelope, messageQueueLimit), 114 p2pMsgQueue: make(chan *Envelope, messageQueueLimit), 115 quit: make(chan struct{}), 116 syncAllowance: DefaultSyncAllowance, 117 } 118 119 whisper.filters = NewFilters(whisper) 120 121 whisper.settings.Store(minPowIdx, cfg.MinimumAcceptedPOW) 122 whisper.settings.Store(maxMsgSizeIdx, cfg.MaxMessageSize) 123 whisper.settings.Store(overflowIdx, false) 124 125 // 126 whisper.protocol = p2p.Protocol{ 127 Name: ProtocolName, 128 Version: uint(ProtocolVersion), 129 Length: NumberOfMessageCodes, 130 Run: whisper.HandlePeer, 131 NodeInfo: func() interface{} { 132 return map[string]interface{}{ 133 "version": ProtocolVersionStr, 134 "maxMessageSize": whisper.MaxMessageSize(), 135 "minimumPoW": whisper.MinPow(), 136 } 137 }, 138 } 139 140 return whisper 141 } 142 143 // 144 func (whisper *Whisper) MinPow() float64 { 145 val, exist := whisper.settings.Load(minPowIdx) 146 if !exist || val == nil { 147 return DefaultMinimumPoW 148 } 149 v, ok := val.(float64) 150 if !ok { 151 log.Error("Error loading minPowIdx, using default") 152 return DefaultMinimumPoW 153 } 154 return v 155 } 156 157 // 158 // 159 // 160 func (whisper *Whisper) MinPowTolerance() float64 { 161 val, exist := whisper.settings.Load(minPowToleranceIdx) 162 if !exist || val == nil { 163 return DefaultMinimumPoW 164 } 165 return val.(float64) 166 } 167 168 // 169 // 170 // 171 // 172 func (whisper *Whisper) BloomFilter() []byte { 173 val, exist := whisper.settings.Load(bloomFilterIdx) 174 if !exist || val == nil { 175 return nil 176 } 177 return val.([]byte) 178 } 179 180 // 181 // 182 // 183 // 184 func (whisper *Whisper) BloomFilterTolerance() []byte { 185 val, exist := whisper.settings.Load(bloomFilterToleranceIdx) 186 if !exist || val == nil { 187 return nil 188 } 189 return val.([]byte) 190 } 191 192 // 193 func (whisper *Whisper) MaxMessageSize() uint32 { 194 val, _ := whisper.settings.Load(maxMsgSizeIdx) 195 return val.(uint32) 196 } 197 198 // 199 func (whisper *Whisper) Overflow() bool { 200 val, _ := whisper.settings.Load(overflowIdx) 201 return val.(bool) 202 } 203 204 // 205 func (whisper *Whisper) APIs() []rpc.API { 206 return []rpc.API{ 207 { 208 Namespace: ProtocolName, 209 Version: ProtocolVersionStr, 210 Service: NewPublicWhisperAPI(whisper), 211 Public: true, 212 }, 213 } 214 } 215 216 // 217 // 218 func (whisper *Whisper) RegisterServer(server MailServer) { 219 whisper.mailServer = server 220 } 221 222 // 223 func (whisper *Whisper) Protocols() []p2p.Protocol { 224 return []p2p.Protocol{whisper.protocol} 225 } 226 227 // 228 func (whisper *Whisper) Version() uint { 229 return whisper.protocol.Version 230 } 231 232 // 233 func (whisper *Whisper) SetMaxMessageSize(size uint32) error { 234 if size > MaxMessageSize { 235 return fmt.Errorf("message size too large [%d>%d]", size, MaxMessageSize) 236 } 237 whisper.settings.Store(maxMsgSizeIdx, size) 238 return nil 239 } 240 241 // 242 func (whisper *Whisper) SetBloomFilter(bloom []byte) error { 243 if len(bloom) != BloomFilterSize { 244 return fmt.Errorf("invalid bloom filter size: %d", len(bloom)) 245 } 246 247 b := make([]byte, BloomFilterSize) 248 copy(b, bloom) 249 250 whisper.settings.Store(bloomFilterIdx, b) 251 whisper.notifyPeersAboutBloomFilterChange(b) 252 253 go func() { 254 // 255 time.Sleep(time.Duration(whisper.syncAllowance) * time.Second) 256 whisper.settings.Store(bloomFilterToleranceIdx, b) 257 }() 258 259 return nil 260 } 261 262 // 263 func (whisper *Whisper) SetMinimumPoW(val float64) error { 264 if val < 0.0 { 265 return fmt.Errorf("invalid PoW: %f", val) 266 } 267 268 whisper.settings.Store(minPowIdx, val) 269 whisper.notifyPeersAboutPowRequirementChange(val) 270 271 go func() { 272 // 273 time.Sleep(time.Duration(whisper.syncAllowance) * time.Second) 274 whisper.settings.Store(minPowToleranceIdx, val) 275 }() 276 277 return nil 278 } 279 280 // 281 func (whisper *Whisper) SetMinimumPowTest(val float64) { 282 whisper.settings.Store(minPowIdx, val) 283 whisper.notifyPeersAboutPowRequirementChange(val) 284 whisper.settings.Store(minPowToleranceIdx, val) 285 } 286 287 func (whisper *Whisper) notifyPeersAboutPowRequirementChange(pow float64) { 288 arr := whisper.getPeers() 289 for _, p := range arr { 290 err := p.notifyAboutPowRequirementChange(pow) 291 if err != nil { 292 // 293 err = p.notifyAboutPowRequirementChange(pow) 294 } 295 if err != nil { 296 log.Warn("failed to notify peer about new pow requirement", "peer", p.ID(), "error", err) 297 } 298 } 299 } 300 301 func (whisper *Whisper) notifyPeersAboutBloomFilterChange(bloom []byte) { 302 arr := whisper.getPeers() 303 for _, p := range arr { 304 err := p.notifyAboutBloomFilterChange(bloom) 305 if err != nil { 306 // 307 err = p.notifyAboutBloomFilterChange(bloom) 308 } 309 if err != nil { 310 log.Warn("failed to notify peer about new bloom filter", "peer", p.ID(), "error", err) 311 } 312 } 313 } 314 315 func (whisper *Whisper) getPeers() []*Peer { 316 arr := make([]*Peer, len(whisper.peers)) 317 i := 0 318 whisper.peerMu.Lock() 319 for p := range whisper.peers { 320 arr[i] = p 321 i++ 322 } 323 whisper.peerMu.Unlock() 324 return arr 325 } 326 327 // 328 func (whisper *Whisper) getPeer(peerID []byte) (*Peer, error) { 329 whisper.peerMu.Lock() 330 defer whisper.peerMu.Unlock() 331 for p := range whisper.peers { 332 id := p.peer.ID() 333 if bytes.Equal(peerID, id[:]) { 334 return p, nil 335 } 336 } 337 return nil, fmt.Errorf("Could not find peer with ID: %x", peerID) 338 } 339 340 // 341 // 342 func (whisper *Whisper) AllowP2PMessagesFromPeer(peerID []byte) error { 343 p, err := whisper.getPeer(peerID) 344 if err != nil { 345 return err 346 } 347 p.trusted = true 348 return nil 349 } 350 351 // 352 // 353 // 354 // 355 // 356 func (whisper *Whisper) RequestHistoricMessages(peerID []byte, envelope *Envelope) error { 357 p, err := whisper.getPeer(peerID) 358 if err != nil { 359 return err 360 } 361 p.trusted = true 362 return p2p.Send(p.ws, p2pRequestCode, envelope) 363 } 364 365 // 366 func (whisper *Whisper) SendP2PMessage(peerID []byte, envelope *Envelope) error { 367 p, err := whisper.getPeer(peerID) 368 if err != nil { 369 return err 370 } 371 return whisper.SendP2PDirect(p, envelope) 372 } 373 374 // 375 func (whisper *Whisper) SendP2PDirect(peer *Peer, envelope *Envelope) error { 376 return p2p.Send(peer.ws, p2pMessageCode, envelope) 377 } 378 379 // 380 // 381 func (whisper *Whisper) NewKeyPair() (string, error) { 382 key, err := crypto.GenerateKey() 383 if err != nil || !validatePrivateKey(key) { 384 key, err = crypto.GenerateKey() // 385 } 386 if err != nil { 387 return "", err 388 } 389 if !validatePrivateKey(key) { 390 return "", fmt.Errorf("failed to generate valid key") 391 } 392 393 id, err := GenerateRandomID() 394 if err != nil { 395 return "", fmt.Errorf("failed to generate ID: %s", err) 396 } 397 398 whisper.keyMu.Lock() 399 defer whisper.keyMu.Unlock() 400 401 if whisper.privateKeys[id] != nil { 402 return "", fmt.Errorf("failed to generate unique ID") 403 } 404 whisper.privateKeys[id] = key 405 return id, nil 406 } 407 408 // 409 func (whisper *Whisper) DeleteKeyPair(key string) bool { 410 whisper.keyMu.Lock() 411 defer whisper.keyMu.Unlock() 412 413 if whisper.privateKeys[key] != nil { 414 delete(whisper.privateKeys, key) 415 return true 416 } 417 return false 418 } 419 420 // 421 func (whisper *Whisper) AddKeyPair(key *ecdsa.PrivateKey) (string, error) { 422 id, err := GenerateRandomID() 423 if err != nil { 424 return "", fmt.Errorf("failed to generate ID: %s", err) 425 } 426 427 whisper.keyMu.Lock() 428 whisper.privateKeys[id] = key 429 whisper.keyMu.Unlock() 430 431 return id, nil 432 } 433 434 // 435 // 436 func (whisper *Whisper) HasKeyPair(id string) bool { 437 whisper.keyMu.RLock() 438 defer whisper.keyMu.RUnlock() 439 return whisper.privateKeys[id] != nil 440 } 441 442 // 443 func (whisper *Whisper) GetPrivateKey(id string) (*ecdsa.PrivateKey, error) { 444 whisper.keyMu.RLock() 445 defer whisper.keyMu.RUnlock() 446 key := whisper.privateKeys[id] 447 if key == nil { 448 return nil, fmt.Errorf("invalid id") 449 } 450 return key, nil 451 } 452 453 // 454 // 455 func (whisper *Whisper) GenerateSymKey() (string, error) { 456 key, err := generateSecureRandomData(aesKeyLength) 457 if err != nil { 458 return "", err 459 } else if !validateDataIntegrity(key, aesKeyLength) { 460 return "", fmt.Errorf("error in GenerateSymKey: crypto/rand failed to generate random data") 461 } 462 463 id, err := GenerateRandomID() 464 if err != nil { 465 return "", fmt.Errorf("failed to generate ID: %s", err) 466 } 467 468 whisper.keyMu.Lock() 469 defer whisper.keyMu.Unlock() 470 471 if whisper.symKeys[id] != nil { 472 return "", fmt.Errorf("failed to generate unique ID") 473 } 474 whisper.symKeys[id] = key 475 return id, nil 476 } 477 478 // 479 func (whisper *Whisper) AddSymKeyDirect(key []byte) (string, error) { 480 if len(key) != aesKeyLength { 481 return "", fmt.Errorf("wrong key size: %d", len(key)) 482 } 483 484 id, err := GenerateRandomID() 485 if err != nil { 486 return "", fmt.Errorf("failed to generate ID: %s", err) 487 } 488 489 whisper.keyMu.Lock() 490 defer whisper.keyMu.Unlock() 491 492 if whisper.symKeys[id] != nil { 493 return "", fmt.Errorf("failed to generate unique ID") 494 } 495 whisper.symKeys[id] = key 496 return id, nil 497 } 498 499 // 500 func (whisper *Whisper) AddSymKeyFromPassword(password string) (string, error) { 501 id, err := GenerateRandomID() 502 if err != nil { 503 return "", fmt.Errorf("failed to generate ID: %s", err) 504 } 505 if whisper.HasSymKey(id) { 506 return "", fmt.Errorf("failed to generate unique ID") 507 } 508 509 // 510 // 511 derived := pbkdf2.Key([]byte(password), nil, 65356, aesKeyLength, sha256.New) 512 if err != nil { 513 return "", err 514 } 515 516 whisper.keyMu.Lock() 517 defer whisper.keyMu.Unlock() 518 519 // 520 if whisper.symKeys[id] != nil { 521 return "", fmt.Errorf("critical error: failed to generate unique ID") 522 } 523 whisper.symKeys[id] = derived 524 return id, nil 525 } 526 527 // 528 // 529 func (whisper *Whisper) HasSymKey(id string) bool { 530 whisper.keyMu.RLock() 531 defer whisper.keyMu.RUnlock() 532 return whisper.symKeys[id] != nil 533 } 534 535 // 536 func (whisper *Whisper) DeleteSymKey(id string) bool { 537 whisper.keyMu.Lock() 538 defer whisper.keyMu.Unlock() 539 if whisper.symKeys[id] != nil { 540 delete(whisper.symKeys, id) 541 return true 542 } 543 return false 544 } 545 546 // 547 func (whisper *Whisper) GetSymKey(id string) ([]byte, error) { 548 whisper.keyMu.RLock() 549 defer whisper.keyMu.RUnlock() 550 if whisper.symKeys[id] != nil { 551 return whisper.symKeys[id], nil 552 } 553 return nil, fmt.Errorf("non-existent key ID") 554 } 555 556 // 557 // 558 func (whisper *Whisper) Subscribe(f *Filter) (string, error) { 559 s, err := whisper.filters.Install(f) 560 if err == nil { 561 whisper.updateBloomFilter(f) 562 } 563 return s, err 564 } 565 566 // 567 // 568 func (whisper *Whisper) updateBloomFilter(f *Filter) { 569 aggregate := make([]byte, BloomFilterSize) 570 for _, t := range f.Topics { 571 top := BytesToTopic(t) 572 b := TopicToBloom(top) 573 aggregate = addBloom(aggregate, b) 574 } 575 576 if !BloomFilterMatch(whisper.BloomFilter(), aggregate) { 577 // 578 aggregate = addBloom(whisper.BloomFilter(), aggregate) 579 whisper.SetBloomFilter(aggregate) 580 } 581 } 582 583 // 584 func (whisper *Whisper) GetFilter(id string) *Filter { 585 return whisper.filters.Get(id) 586 } 587 588 // 589 func (whisper *Whisper) Unsubscribe(id string) error { 590 ok := whisper.filters.Uninstall(id) 591 if !ok { 592 return fmt.Errorf("Unsubscribe: Invalid ID") 593 } 594 return nil 595 } 596 597 // 598 // 599 func (whisper *Whisper) Send(envelope *Envelope) error { 600 ok, err := whisper.add(envelope, false) 601 if err == nil && !ok { 602 return fmt.Errorf("failed to add envelope") 603 } 604 return err 605 } 606 607 // 608 // 609 func (whisper *Whisper) Start(*p2p.Server) error { 610 log.Info("started whisper v." + ProtocolVersionStr) 611 go whisper.update() 612 613 numCPU := runtime.NumCPU() 614 for i := 0; i < numCPU; i++ { 615 go whisper.processQueue() 616 } 617 618 return nil 619 } 620 621 // 622 // 623 func (whisper *Whisper) Stop() error { 624 close(whisper.quit) 625 log.Info("whisper stopped") 626 return nil 627 } 628 629 // 630 // 631 func (whisper *Whisper) HandlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error { 632 // 633 whisperPeer := newPeer(whisper, peer, rw) 634 635 whisper.peerMu.Lock() 636 whisper.peers[whisperPeer] = struct{}{} 637 whisper.peerMu.Unlock() 638 639 defer func() { 640 whisper.peerMu.Lock() 641 delete(whisper.peers, whisperPeer) 642 whisper.peerMu.Unlock() 643 }() 644 645 // 646 if err := whisperPeer.handshake(); err != nil { 647 return err 648 } 649 whisperPeer.start() 650 defer whisperPeer.stop() 651 652 return whisper.runMessageLoop(whisperPeer, rw) 653 } 654 655 // 656 func (whisper *Whisper) runMessageLoop(p *Peer, rw p2p.MsgReadWriter) error { 657 for { 658 // 659 packet, err := rw.ReadMsg() 660 if err != nil { 661 log.Info("message loop", "peer", p.peer.ID(), "err", err) 662 return err 663 } 664 if packet.Size > whisper.MaxMessageSize() { 665 log.Warn("oversized message received", "peer", p.peer.ID()) 666 return errors.New("oversized message received") 667 } 668 669 switch packet.Code { 670 case statusCode: 671 // 672 log.Warn("unxepected status message received", "peer", p.peer.ID()) 673 case messagesCode: 674 // 675 var envelopes []*Envelope 676 if err := packet.Decode(&envelopes); err != nil { 677 log.Warn("failed to decode envelopes, peer will be disconnected", "peer", p.peer.ID(), "err", err) 678 return errors.New("invalid envelopes") 679 } 680 681 trouble := false 682 for _, env := range envelopes { 683 cached, err := whisper.add(env, whisper.lightClient) 684 if err != nil { 685 trouble = true 686 log.Error("bad envelope received, peer will be disconnected", "peer", p.peer.ID(), "err", err) 687 } 688 if cached { 689 p.mark(env) 690 } 691 } 692 693 if trouble { 694 return errors.New("invalid envelope") 695 } 696 case powRequirementCode: 697 s := rlp.NewStream(packet.Payload, uint64(packet.Size)) 698 i, err := s.Uint() 699 if err != nil { 700 log.Warn("failed to decode powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 701 return errors.New("invalid powRequirementCode message") 702 } 703 f := math.Float64frombits(i) 704 if math.IsInf(f, 0) || math.IsNaN(f) || f < 0.0 { 705 log.Warn("invalid value in powRequirementCode message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 706 return errors.New("invalid value in powRequirementCode message") 707 } 708 p.powRequirement = f 709 case bloomFilterExCode: 710 var bloom []byte 711 err := packet.Decode(&bloom) 712 if err == nil && len(bloom) != BloomFilterSize { 713 err = fmt.Errorf("wrong bloom filter size %d", len(bloom)) 714 } 715 716 if err != nil { 717 log.Warn("failed to decode bloom filter exchange message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 718 return errors.New("invalid bloom filter exchange message") 719 } 720 p.setBloomFilter(bloom) 721 case p2pMessageCode: 722 // 723 // 724 // 725 // 726 if p.trusted { 727 var envelope Envelope 728 if err := packet.Decode(&envelope); err != nil { 729 log.Warn("failed to decode direct message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 730 return errors.New("invalid direct message") 731 } 732 whisper.postEvent(&envelope, true) 733 } 734 case p2pRequestCode: 735 // 736 if whisper.mailServer != nil { 737 var request Envelope 738 if err := packet.Decode(&request); err != nil { 739 log.Warn("failed to decode p2p request message, peer will be disconnected", "peer", p.peer.ID(), "err", err) 740 return errors.New("invalid p2p request") 741 } 742 whisper.mailServer.DeliverMail(p, &request) 743 } 744 default: 745 // 746 // 747 } 748 749 packet.Discard() 750 } 751 } 752 753 // 754 // 755 // 756 // 757 func (whisper *Whisper) add(envelope *Envelope, isP2P bool) (bool, error) { 758 now := uint32(time.Now().Unix()) 759 sent := envelope.Expiry - envelope.TTL 760 761 if sent > now { 762 if sent-DefaultSyncAllowance > now { 763 return false, fmt.Errorf("envelope created in the future [%x]", envelope.Hash()) 764 } 765 // 766 envelope.calculatePoW(sent - now + 1) 767 } 768 769 if envelope.Expiry < now { 770 if envelope.Expiry+DefaultSyncAllowance*2 < now { 771 return false, fmt.Errorf("very old message") 772 } 773 log.Debug("expired envelope dropped", "hash", envelope.Hash().Hex()) 774 return false, nil // 775 } 776 777 if uint32(envelope.size()) > whisper.MaxMessageSize() { 778 return false, fmt.Errorf("huge messages are not allowed [%x]", envelope.Hash()) 779 } 780 781 if envelope.PoW() < whisper.MinPow() { 782 // 783 // 784 // 785 if envelope.PoW() < whisper.MinPowTolerance() { 786 return false, fmt.Errorf("envelope with low PoW received: PoW=%f, hash=[%v]", envelope.PoW(), envelope.Hash().Hex()) 787 } 788 } 789 790 if !BloomFilterMatch(whisper.BloomFilter(), envelope.Bloom()) { 791 // 792 // 793 // 794 if !BloomFilterMatch(whisper.BloomFilterTolerance(), envelope.Bloom()) { 795 return false, fmt.Errorf("envelope does not match bloom filter, hash=[%v], bloom: \n%x \n%x \n%x", 796 envelope.Hash().Hex(), whisper.BloomFilter(), envelope.Bloom(), envelope.Topic) 797 } 798 } 799 800 hash := envelope.Hash() 801 802 whisper.poolMu.Lock() 803 _, alreadyCached := whisper.envelopes[hash] 804 if !alreadyCached { 805 whisper.envelopes[hash] = envelope 806 if whisper.expirations[envelope.Expiry] == nil { 807 whisper.expirations[envelope.Expiry] = mapset.NewThreadUnsafeSet() 808 } 809 if !whisper.expirations[envelope.Expiry].Contains(hash) { 810 whisper.expirations[envelope.Expiry].Add(hash) 811 } 812 } 813 whisper.poolMu.Unlock() 814 815 if alreadyCached { 816 log.Trace("whisper envelope already cached", "hash", envelope.Hash().Hex()) 817 } else { 818 log.Trace("cached whisper envelope", "hash", envelope.Hash().Hex()) 819 whisper.statsMu.Lock() 820 whisper.stats.memoryUsed += envelope.size() 821 whisper.statsMu.Unlock() 822 whisper.postEvent(envelope, isP2P) // 823 if whisper.mailServer != nil { 824 whisper.mailServer.Archive(envelope) 825 } 826 } 827 return true, nil 828 } 829 830 // 831 func (whisper *Whisper) postEvent(envelope *Envelope, isP2P bool) { 832 if isP2P { 833 whisper.p2pMsgQueue <- envelope 834 } else { 835 whisper.checkOverflow() 836 whisper.messageQueue <- envelope 837 } 838 } 839 840 // 841 func (whisper *Whisper) checkOverflow() { 842 queueSize := len(whisper.messageQueue) 843 844 if queueSize == messageQueueLimit { 845 if !whisper.Overflow() { 846 whisper.settings.Store(overflowIdx, true) 847 log.Warn("message queue overflow") 848 } 849 } else if queueSize <= messageQueueLimit/2 { 850 if whisper.Overflow() { 851 whisper.settings.Store(overflowIdx, false) 852 log.Warn("message queue overflow fixed (back to normal)") 853 } 854 } 855 } 856 857 // 858 func (whisper *Whisper) processQueue() { 859 var e *Envelope 860 for { 861 select { 862 case <-whisper.quit: 863 return 864 865 case e = <-whisper.messageQueue: 866 whisper.filters.NotifyWatchers(e, false) 867 868 case e = <-whisper.p2pMsgQueue: 869 whisper.filters.NotifyWatchers(e, true) 870 } 871 } 872 } 873 874 // 875 // 876 func (whisper *Whisper) update() { 877 // 878 expire := time.NewTicker(expirationCycle) 879 880 // 881 for { 882 select { 883 case <-expire.C: 884 whisper.expire() 885 886 case <-whisper.quit: 887 return 888 } 889 } 890 } 891 892 // 893 // 894 func (whisper *Whisper) expire() { 895 whisper.poolMu.Lock() 896 defer whisper.poolMu.Unlock() 897 898 whisper.statsMu.Lock() 899 defer whisper.statsMu.Unlock() 900 whisper.stats.reset() 901 now := uint32(time.Now().Unix()) 902 for expiry, hashSet := range whisper.expirations { 903 if expiry < now { 904 // 905 hashSet.Each(func(v interface{}) bool { 906 sz := whisper.envelopes[v.(common.Hash)].size() 907 delete(whisper.envelopes, v.(common.Hash)) 908 whisper.stats.messagesCleared++ 909 whisper.stats.memoryCleared += sz 910 whisper.stats.memoryUsed -= sz 911 return true 912 }) 913 whisper.expirations[expiry].Clear() 914 delete(whisper.expirations, expiry) 915 } 916 } 917 } 918 919 // 920 func (whisper *Whisper) Stats() Statistics { 921 whisper.statsMu.Lock() 922 defer whisper.statsMu.Unlock() 923 924 return whisper.stats 925 } 926 927 // 928 func (whisper *Whisper) Envelopes() []*Envelope { 929 whisper.poolMu.RLock() 930 defer whisper.poolMu.RUnlock() 931 932 all := make([]*Envelope, 0, len(whisper.envelopes)) 933 for _, envelope := range whisper.envelopes { 934 all = append(all, envelope) 935 } 936 return all 937 } 938 939 // 940 func (whisper *Whisper) isEnvelopeCached(hash common.Hash) bool { 941 whisper.poolMu.Lock() 942 defer whisper.poolMu.Unlock() 943 944 _, exist := whisper.envelopes[hash] 945 return exist 946 } 947 948 // 949 func (s *Statistics) reset() { 950 s.cycles++ 951 s.totalMessagesCleared += s.messagesCleared 952 953 s.memoryCleared = 0 954 s.messagesCleared = 0 955 } 956 957 // 958 func ValidatePublicKey(k *ecdsa.PublicKey) bool { 959 return k != nil && k.X != nil && k.Y != nil && k.X.Sign() != 0 && k.Y.Sign() != 0 960 } 961 962 // 963 func validatePrivateKey(k *ecdsa.PrivateKey) bool { 964 if k == nil || k.D == nil || k.D.Sign() == 0 { 965 return false 966 } 967 return ValidatePublicKey(&k.PublicKey) 968 } 969 970 // 971 // 972 func validateDataIntegrity(k []byte, expectedSize int) bool { 973 if len(k) != expectedSize { 974 return false 975 } 976 if expectedSize > 3 && containsOnlyZeros(k) { 977 return false 978 } 979 return true 980 } 981 982 // 983 func containsOnlyZeros(data []byte) bool { 984 for _, b := range data { 985 if b != 0 { 986 return false 987 } 988 } 989 return true 990 } 991 992 // 993 func bytesToUintLittleEndian(b []byte) (res uint64) { 994 mul := uint64(1) 995 for i := 0; i < len(b); i++ { 996 res += uint64(b[i]) * mul 997 mul *= 256 998 } 999 return res 1000 } 1001 1002 // 1003 func BytesToUintBigEndian(b []byte) (res uint64) { 1004 for i := 0; i < len(b); i++ { 1005 res *= 256 1006 res += uint64(b[i]) 1007 } 1008 return res 1009 } 1010 1011 // 1012 func GenerateRandomID() (id string, err error) { 1013 buf, err := generateSecureRandomData(keyIDSize) 1014 if err != nil { 1015 return "", err 1016 } 1017 if !validateDataIntegrity(buf, keyIDSize) { 1018 return "", fmt.Errorf("error in generateRandomID: crypto/rand failed to generate random data") 1019 } 1020 id = common.Bytes2Hex(buf) 1021 return id, err 1022 } 1023 1024 func isFullNode(bloom []byte) bool { 1025 if bloom == nil { 1026 return true 1027 } 1028 for _, b := range bloom { 1029 if b != 255 { 1030 return false 1031 } 1032 } 1033 return true 1034 } 1035 1036 func BloomFilterMatch(filter, sample []byte) bool { 1037 if filter == nil { 1038 return true 1039 } 1040 1041 for i := 0; i < BloomFilterSize; i++ { 1042 f := filter[i] 1043 s := sample[i] 1044 if (f | s) != f { 1045 return false 1046 } 1047 } 1048 1049 return true 1050 } 1051 1052 func addBloom(a, b []byte) []byte { 1053 c := make([]byte, BloomFilterSize) 1054 for i := 0; i < BloomFilterSize; i++ { 1055 c[i] = a[i] | b[i] 1056 } 1057 return c 1058 }