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