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  }