github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/whisper/whisperv6/whisper.go (about)

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