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