github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/pss/pss_test.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:44</date>
    10  //</624450117067345920>
    11  
    12  
    13  package pss
    14  
    15  import (
    16  	"bytes"
    17  	"context"
    18  	"crypto/ecdsa"
    19  	"encoding/binary"
    20  	"encoding/hex"
    21  	"encoding/json"
    22  	"flag"
    23  	"fmt"
    24  	"io/ioutil"
    25  	"math/rand"
    26  	"os"
    27  	"strconv"
    28  	"strings"
    29  	"sync"
    30  	"testing"
    31  	"time"
    32  
    33  	"github.com/ethereum/go-ethereum/common"
    34  	"github.com/ethereum/go-ethereum/common/hexutil"
    35  	"github.com/ethereum/go-ethereum/crypto"
    36  	"github.com/ethereum/go-ethereum/log"
    37  	"github.com/ethereum/go-ethereum/metrics"
    38  	"github.com/ethereum/go-ethereum/metrics/influxdb"
    39  	"github.com/ethereum/go-ethereum/node"
    40  	"github.com/ethereum/go-ethereum/p2p"
    41  	"github.com/ethereum/go-ethereum/p2p/enode"
    42  	"github.com/ethereum/go-ethereum/p2p/protocols"
    43  	"github.com/ethereum/go-ethereum/p2p/simulations"
    44  	"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
    45  	"github.com/ethereum/go-ethereum/rpc"
    46  	"github.com/ethereum/go-ethereum/swarm/network"
    47  	"github.com/ethereum/go-ethereum/swarm/pot"
    48  	"github.com/ethereum/go-ethereum/swarm/state"
    49  	whisper "github.com/ethereum/go-ethereum/whisper/whisperv5"
    50  )
    51  
    52  var (
    53  	initOnce        = sync.Once{}
    54  	loglevel        = flag.Int("loglevel", 2, "logging verbosity")
    55  	longrunning     = flag.Bool("longrunning", false, "do run long-running tests")
    56  	w               *whisper.Whisper
    57  	wapi            *whisper.PublicWhisperAPI
    58  	psslogmain      log.Logger
    59  	pssprotocols    map[string]*protoCtrl
    60  	useHandshake    bool
    61  	noopHandlerFunc = func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error {
    62  		return nil
    63  	}
    64  )
    65  
    66  func init() {
    67  	flag.Parse()
    68  	rand.Seed(time.Now().Unix())
    69  
    70  	adapters.RegisterServices(newServices(false))
    71  	initTest()
    72  }
    73  
    74  func initTest() {
    75  	initOnce.Do(
    76  		func() {
    77  			psslogmain = log.New("psslog", "*")
    78  			hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true))
    79  			hf := log.LvlFilterHandler(log.Lvl(*loglevel), hs)
    80  			h := log.CallerFileHandler(hf)
    81  			log.Root().SetHandler(h)
    82  
    83  			w = whisper.New(&whisper.DefaultConfig)
    84  			wapi = whisper.NewPublicWhisperAPI(w)
    85  
    86  			pssprotocols = make(map[string]*protoCtrl)
    87  		},
    88  	)
    89  }
    90  
    91  //测试主题转换函数是否提供可预测的结果
    92  func TestTopic(t *testing.T) {
    93  
    94  	api := &API{}
    95  
    96  	topicstr := strings.Join([]string{PingProtocol.Name, strconv.Itoa(int(PingProtocol.Version))}, ":")
    97  
    98  //bytestotopic是权威的主题转换源
    99  	topicobj := BytesToTopic([]byte(topicstr))
   100  
   101  //主题字符串和主题字节必须匹配
   102  	topicapiobj, _ := api.StringToTopic(topicstr)
   103  	if topicobj != topicapiobj {
   104  		t.Fatalf("bytes and string topic conversion mismatch; %s != %s", topicobj, topicapiobj)
   105  	}
   106  
   107  //topichex的字符串表示法
   108  	topichex := topicobj.String()
   109  
   110  //PingTopic上的ProtocolTopic包装应与TopicString相同
   111  //检查是否匹配
   112  	pingtopichex := PingTopic.String()
   113  	if topichex != pingtopichex {
   114  		t.Fatalf("protocol topic conversion mismatch; %s != %s", topichex, pingtopichex)
   115  	}
   116  
   117  //主题的json marshal
   118  	topicjsonout, err := topicobj.MarshalJSON()
   119  	if err != nil {
   120  		t.Fatal(err)
   121  	}
   122  	if string(topicjsonout)[1:len(topicjsonout)-1] != topichex {
   123  		t.Fatalf("topic json marshal mismatch; %s != \"%s\"", topicjsonout, topichex)
   124  	}
   125  
   126  //主题JSON解组
   127  	var topicjsonin Topic
   128  	topicjsonin.UnmarshalJSON(topicjsonout)
   129  	if topicjsonin != topicobj {
   130  		t.Fatalf("topic json unmarshal mismatch: %x != %x", topicjsonin, topicobj)
   131  	}
   132  }
   133  
   134  //消息控制标志的测试位打包
   135  func TestMsgParams(t *testing.T) {
   136  	var ctrl byte
   137  	ctrl |= pssControlRaw
   138  	p := newMsgParamsFromBytes([]byte{ctrl})
   139  	m := newPssMsg(p)
   140  	if !m.isRaw() || m.isSym() {
   141  		t.Fatal("expected raw=true and sym=false")
   142  	}
   143  	ctrl |= pssControlSym
   144  	p = newMsgParamsFromBytes([]byte{ctrl})
   145  	m = newPssMsg(p)
   146  	if !m.isRaw() || !m.isSym() {
   147  		t.Fatal("expected raw=true and sym=true")
   148  	}
   149  	ctrl &= 0xff &^ pssControlRaw
   150  	p = newMsgParamsFromBytes([]byte{ctrl})
   151  	m = newPssMsg(p)
   152  	if m.isRaw() || !m.isSym() {
   153  		t.Fatal("expected raw=false and sym=true")
   154  	}
   155  }
   156  
   157  //测试是否可以插入到缓存中,匹配具有缓存和缓存到期的项
   158  func TestCache(t *testing.T) {
   159  	var err error
   160  	to, _ := hex.DecodeString("08090a0b0c0d0e0f1011121314150001020304050607161718191a1b1c1d1e1f")
   161  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
   162  	defer cancel()
   163  	keys, err := wapi.NewKeyPair(ctx)
   164  	privkey, err := w.GetPrivateKey(keys)
   165  	if err != nil {
   166  		t.Fatal(err)
   167  	}
   168  	ps := newTestPss(privkey, nil, nil)
   169  	pp := NewPssParams().WithPrivateKey(privkey)
   170  	data := []byte("foo")
   171  	datatwo := []byte("bar")
   172  	datathree := []byte("baz")
   173  	wparams := &whisper.MessageParams{
   174  		TTL:      defaultWhisperTTL,
   175  		Src:      privkey,
   176  		Dst:      &privkey.PublicKey,
   177  		Topic:    whisper.TopicType(PingTopic),
   178  		WorkTime: defaultWhisperWorkTime,
   179  		PoW:      defaultWhisperPoW,
   180  		Payload:  data,
   181  	}
   182  	woutmsg, err := whisper.NewSentMessage(wparams)
   183  	env, err := woutmsg.Wrap(wparams)
   184  	msg := &PssMsg{
   185  		Payload: env,
   186  		To:      to,
   187  	}
   188  	wparams.Payload = datatwo
   189  	woutmsg, err = whisper.NewSentMessage(wparams)
   190  	envtwo, err := woutmsg.Wrap(wparams)
   191  	msgtwo := &PssMsg{
   192  		Payload: envtwo,
   193  		To:      to,
   194  	}
   195  	wparams.Payload = datathree
   196  	woutmsg, err = whisper.NewSentMessage(wparams)
   197  	envthree, err := woutmsg.Wrap(wparams)
   198  	msgthree := &PssMsg{
   199  		Payload: envthree,
   200  		To:      to,
   201  	}
   202  
   203  	digest := ps.digest(msg)
   204  	if err != nil {
   205  		t.Fatalf("could not store cache msgone: %v", err)
   206  	}
   207  	digesttwo := ps.digest(msgtwo)
   208  	if err != nil {
   209  		t.Fatalf("could not store cache msgtwo: %v", err)
   210  	}
   211  	digestthree := ps.digest(msgthree)
   212  	if err != nil {
   213  		t.Fatalf("could not store cache msgthree: %v", err)
   214  	}
   215  
   216  	if digest == digesttwo {
   217  		t.Fatalf("different msgs return same hash: %d", digesttwo)
   218  	}
   219  
   220  //检查缓存
   221  	err = ps.addFwdCache(msg)
   222  	if err != nil {
   223  		t.Fatalf("write to pss expire cache failed: %v", err)
   224  	}
   225  
   226  	if !ps.checkFwdCache(msg) {
   227  		t.Fatalf("message %v should have EXPIRE record in cache but checkCache returned false", msg)
   228  	}
   229  
   230  	if ps.checkFwdCache(msgtwo) {
   231  		t.Fatalf("message %v should NOT have EXPIRE record in cache but checkCache returned true", msgtwo)
   232  	}
   233  
   234  	time.Sleep(pp.CacheTTL + 1*time.Second)
   235  	err = ps.addFwdCache(msgthree)
   236  	if err != nil {
   237  		t.Fatalf("write to pss expire cache failed: %v", err)
   238  	}
   239  
   240  	if ps.checkFwdCache(msg) {
   241  		t.Fatalf("message %v should have expired from cache but checkCache returned true", msg)
   242  	}
   243  
   244  	if _, ok := ps.fwdCache[digestthree]; !ok {
   245  		t.Fatalf("unexpired message should be in the cache: %v", digestthree)
   246  	}
   247  
   248  	if _, ok := ps.fwdCache[digesttwo]; ok {
   249  		t.Fatalf("expired message should have been cleared from the cache: %v", digesttwo)
   250  	}
   251  }
   252  
   253  //地址提示的匹配;消息是否可以是节点的
   254  func TestAddressMatch(t *testing.T) {
   255  
   256  	localaddr := network.RandomAddr().Over()
   257  	copy(localaddr[:8], []byte("deadbeef"))
   258  	remoteaddr := []byte("feedbeef")
   259  	kadparams := network.NewKadParams()
   260  	kad := network.NewKademlia(localaddr, kadparams)
   261  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
   262  	defer cancel()
   263  	keys, err := wapi.NewKeyPair(ctx)
   264  	if err != nil {
   265  		t.Fatalf("Could not generate private key: %v", err)
   266  	}
   267  	privkey, err := w.GetPrivateKey(keys)
   268  	pssp := NewPssParams().WithPrivateKey(privkey)
   269  	ps, err := NewPss(kad, pssp)
   270  	if err != nil {
   271  		t.Fatal(err.Error())
   272  	}
   273  
   274  	pssmsg := &PssMsg{
   275  		To: remoteaddr,
   276  	}
   277  
   278  //与第一个字节不同
   279  	if ps.isSelfRecipient(pssmsg) {
   280  		t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr)
   281  	}
   282  	if ps.isSelfPossibleRecipient(pssmsg, false) {
   283  		t.Fatalf("isSelfPossibleRecipient true but %x != %x", remoteaddr[:8], localaddr[:8])
   284  	}
   285  
   286  //8个前字节相同
   287  	copy(remoteaddr[:4], localaddr[:4])
   288  	if ps.isSelfRecipient(pssmsg) {
   289  		t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr)
   290  	}
   291  	if !ps.isSelfPossibleRecipient(pssmsg, false) {
   292  		t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8])
   293  	}
   294  
   295  //所有字节相同
   296  	pssmsg.To = localaddr
   297  	if !ps.isSelfRecipient(pssmsg) {
   298  		t.Fatalf("isSelfRecipient false but %x == %x", remoteaddr, localaddr)
   299  	}
   300  	if !ps.isSelfPossibleRecipient(pssmsg, false) {
   301  		t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8])
   302  	}
   303  
   304  }
   305  
   306  //如果代理处理程序存在且发送方位于消息代理中,测试发送方是否处理消息。
   307  func TestProxShortCircuit(t *testing.T) {
   308  
   309  //发送方节点地址
   310  	localAddr := network.RandomAddr().Over()
   311  	localPotAddr := pot.NewAddressFromBytes(localAddr)
   312  
   313  //成立卡德利亚
   314  	kadParams := network.NewKadParams()
   315  	kad := network.NewKademlia(localAddr, kadParams)
   316  	peerCount := kad.MinBinSize + 1
   317  
   318  //设置PSS
   319  	privKey, err := crypto.GenerateKey()
   320  	pssp := NewPssParams().WithPrivateKey(privKey)
   321  	ps, err := NewPss(kad, pssp)
   322  	if err != nil {
   323  		t.Fatal(err.Error())
   324  	}
   325  
   326  //创建Kademlia对等点,这样我们就有了minproxlimit内外的对等点。
   327  	var peers []*network.Peer
   328  	proxMessageAddress := pot.RandomAddressAt(localPotAddr, peerCount).Bytes()
   329  	distantMessageAddress := pot.RandomAddressAt(localPotAddr, 0).Bytes()
   330  
   331  	for i := 0; i < peerCount; i++ {
   332  		rw := &p2p.MsgPipeRW{}
   333  		ptpPeer := p2p.NewPeer(enode.ID{}, "wanna be with me? [ ] yes [ ] no", []p2p.Cap{})
   334  		protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{})
   335  		peerAddr := pot.RandomAddressAt(localPotAddr, i)
   336  		bzzPeer := &network.BzzPeer{
   337  			Peer: protoPeer,
   338  			BzzAddr: &network.BzzAddr{
   339  				OAddr: peerAddr.Bytes(),
   340  				UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])),
   341  			},
   342  		}
   343  		peer := network.NewPeer(bzzPeer, kad)
   344  		kad.On(peer)
   345  		peers = append(peers, peer)
   346  	}
   347  
   348  //注册IT标记代理功能
   349  	delivered := make(chan struct{})
   350  	rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error {
   351  		log.Trace("in allowraw handler")
   352  		delivered <- struct{}{}
   353  		return nil
   354  	}
   355  	topic := BytesToTopic([]byte{0x2a})
   356  	hndlrProxDereg := ps.Register(&topic, &handler{
   357  		f: rawHandlerFunc,
   358  		caps: &handlerCaps{
   359  			raw:  true,
   360  			prox: true,
   361  		},
   362  	})
   363  	defer hndlrProxDereg()
   364  
   365  //发送消息太远,发件人不在代理中
   366  //接收此消息应超时
   367  	errC := make(chan error)
   368  	go func() {
   369  		err := ps.SendRaw(distantMessageAddress, topic, []byte("foo"))
   370  		if err != nil {
   371  			errC <- err
   372  		}
   373  	}()
   374  
   375  	ctx, cancel := context.WithTimeout(context.TODO(), time.Second)
   376  	defer cancel()
   377  	select {
   378  	case <-delivered:
   379  		t.Fatal("raw distant message delivered")
   380  	case err := <-errC:
   381  		t.Fatal(err)
   382  	case <-ctx.Done():
   383  	}
   384  
   385  //发送应在发送方代理内的消息
   386  //应传递此消息
   387  	go func() {
   388  		err := ps.SendRaw(proxMessageAddress, topic, []byte("bar"))
   389  		if err != nil {
   390  			errC <- err
   391  		}
   392  	}()
   393  
   394  	ctx, cancel = context.WithTimeout(context.TODO(), time.Second)
   395  	defer cancel()
   396  	select {
   397  	case <-delivered:
   398  	case err := <-errC:
   399  		t.Fatal(err)
   400  	case <-ctx.Done():
   401  		t.Fatal("raw timeout")
   402  	}
   403  
   404  //使用sym和asym send尝试相同的prox消息
   405  	proxAddrPss := PssAddress(proxMessageAddress)
   406  	symKeyId, err := ps.GenerateSymmetricKey(topic, proxAddrPss, true)
   407  	go func() {
   408  		err := ps.SendSym(symKeyId, topic, []byte("baz"))
   409  		if err != nil {
   410  			errC <- err
   411  		}
   412  	}()
   413  	ctx, cancel = context.WithTimeout(context.TODO(), time.Second)
   414  	defer cancel()
   415  	select {
   416  	case <-delivered:
   417  	case err := <-errC:
   418  		t.Fatal(err)
   419  	case <-ctx.Done():
   420  		t.Fatal("sym timeout")
   421  	}
   422  
   423  	err = ps.SetPeerPublicKey(&privKey.PublicKey, topic, proxAddrPss)
   424  	if err != nil {
   425  		t.Fatal(err)
   426  	}
   427  	pubKeyId := hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey))
   428  	go func() {
   429  		err := ps.SendAsym(pubKeyId, topic, []byte("xyzzy"))
   430  		if err != nil {
   431  			errC <- err
   432  		}
   433  	}()
   434  	ctx, cancel = context.WithTimeout(context.TODO(), time.Second)
   435  	defer cancel()
   436  	select {
   437  	case <-delivered:
   438  	case err := <-errC:
   439  		t.Fatal(err)
   440  	case <-ctx.Done():
   441  		t.Fatal("asym timeout")
   442  	}
   443  }
   444  
   445  //验证是否可以将节点设置为收件人,无论显式消息地址是否匹配,如果主题的至少一个处理程序被显式设置为允许它
   446  //注意,在这些测试中,为了方便起见,我们在处理程序上使用原始功能
   447  func TestAddressMatchProx(t *testing.T) {
   448  
   449  //收件人节点地址
   450  	localAddr := network.RandomAddr().Over()
   451  	localPotAddr := pot.NewAddressFromBytes(localAddr)
   452  
   453  //成立卡德利亚
   454  	kadparams := network.NewKadParams()
   455  	kad := network.NewKademlia(localAddr, kadparams)
   456  	nnPeerCount := kad.MinBinSize
   457  	peerCount := nnPeerCount + 2
   458  
   459  //设置PSS
   460  	privKey, err := crypto.GenerateKey()
   461  	pssp := NewPssParams().WithPrivateKey(privKey)
   462  	ps, err := NewPss(kad, pssp)
   463  	if err != nil {
   464  		t.Fatal(err.Error())
   465  	}
   466  
   467  //创建Kademlia对等点,这样我们就有了minproxlimit内外的对等点。
   468  	var peers []*network.Peer
   469  	for i := 0; i < peerCount; i++ {
   470  		rw := &p2p.MsgPipeRW{}
   471  		ptpPeer := p2p.NewPeer(enode.ID{}, "362436 call me anytime", []p2p.Cap{})
   472  		protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{})
   473  		peerAddr := pot.RandomAddressAt(localPotAddr, i)
   474  		bzzPeer := &network.BzzPeer{
   475  			Peer: protoPeer,
   476  			BzzAddr: &network.BzzAddr{
   477  				OAddr: peerAddr.Bytes(),
   478  				UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])),
   479  			},
   480  		}
   481  		peer := network.NewPeer(bzzPeer, kad)
   482  		kad.On(peer)
   483  		peers = append(peers, peer)
   484  	}
   485  
   486  //TODO:在网络包中创建一个测试,以生成一个具有n个对等机的表,其中n-m是代理对等机
   487  //同时对Kademlia进行测试回归,因为我们正在从不同的包中编译测试参数。
   488  	var proxes int
   489  	var conns int
   490  	depth := kad.NeighbourhoodDepth()
   491  	kad.EachConn(nil, peerCount, func(p *network.Peer, po int) bool {
   492  		conns++
   493  		if po >= depth {
   494  			proxes++
   495  		}
   496  		return true
   497  	})
   498  	if proxes != nnPeerCount {
   499  		t.Fatalf("expected %d proxpeers, have %d", nnPeerCount, proxes)
   500  	} else if conns != peerCount {
   501  		t.Fatalf("expected %d peers total, have %d", peerCount, proxes)
   502  	}
   503  
   504  //从localaddr到try的远程地址距离以及使用prox处理程序时的预期结果
   505  	remoteDistances := []int{
   506  		255,
   507  		nnPeerCount + 1,
   508  		nnPeerCount,
   509  		nnPeerCount - 1,
   510  		0,
   511  	}
   512  	expects := []bool{
   513  		true,
   514  		true,
   515  		true,
   516  		false,
   517  		false,
   518  	}
   519  
   520  //首先对使用prox计算可能接收的方法进行单元测试
   521  	for i, distance := range remoteDistances {
   522  		pssMsg := newPssMsg(&msgParams{})
   523  		pssMsg.To = make([]byte, len(localAddr))
   524  		copy(pssMsg.To, localAddr)
   525  		var byteIdx = distance / 8
   526  		pssMsg.To[byteIdx] ^= 1 << uint(7-(distance%8))
   527  		log.Trace(fmt.Sprintf("addrmatch %v", bytes.Equal(pssMsg.To, localAddr)))
   528  		if ps.isSelfPossibleRecipient(pssMsg, true) != expects[i] {
   529  			t.Fatalf("expected distance %d to be %v", distance, expects[i])
   530  		}
   531  	}
   532  
   533  //我们向上移动到更高的级别并测试实际的消息处理程序
   534  //对于每个距离,检查在使用prox变量时,我们是否可能是接收者。
   535  
   536  //此处理程序将为传递给处理程序的每个消息增加一个计数器。
   537  	var receives int
   538  	rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error {
   539  		log.Trace("in allowraw handler")
   540  		receives++
   541  		return nil
   542  	}
   543  
   544  //注册IT标记代理功能
   545  	topic := BytesToTopic([]byte{0x2a})
   546  	hndlrProxDereg := ps.Register(&topic, &handler{
   547  		f: rawHandlerFunc,
   548  		caps: &handlerCaps{
   549  			raw:  true,
   550  			prox: true,
   551  		},
   552  	})
   553  
   554  //测试距离
   555  	var prevReceive int
   556  	for i, distance := range remoteDistances {
   557  		remotePotAddr := pot.RandomAddressAt(localPotAddr, distance)
   558  		remoteAddr := remotePotAddr.Bytes()
   559  
   560  		var data [32]byte
   561  		rand.Read(data[:])
   562  		pssMsg := newPssMsg(&msgParams{raw: true})
   563  		pssMsg.To = remoteAddr
   564  		pssMsg.Expire = uint32(time.Now().Unix() + 4200)
   565  		pssMsg.Payload = &whisper.Envelope{
   566  			Topic: whisper.TopicType(topic),
   567  			Data:  data[:],
   568  		}
   569  
   570  		log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr)
   571  		ps.handlePssMsg(context.TODO(), pssMsg)
   572  		if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) {
   573  			t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i])
   574  		}
   575  		prevReceive = receives
   576  	}
   577  
   578  //现在添加一个不支持代理的处理程序并测试
   579  	ps.Register(&topic, &handler{
   580  		f: rawHandlerFunc,
   581  		caps: &handlerCaps{
   582  			raw: true,
   583  		},
   584  	})
   585  	receives = 0
   586  	prevReceive = 0
   587  	for i, distance := range remoteDistances {
   588  		remotePotAddr := pot.RandomAddressAt(localPotAddr, distance)
   589  		remoteAddr := remotePotAddr.Bytes()
   590  
   591  		var data [32]byte
   592  		rand.Read(data[:])
   593  		pssMsg := newPssMsg(&msgParams{raw: true})
   594  		pssMsg.To = remoteAddr
   595  		pssMsg.Expire = uint32(time.Now().Unix() + 4200)
   596  		pssMsg.Payload = &whisper.Envelope{
   597  			Topic: whisper.TopicType(topic),
   598  			Data:  data[:],
   599  		}
   600  
   601  		log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr)
   602  		ps.handlePssMsg(context.TODO(), pssMsg)
   603  		if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) {
   604  			t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i])
   605  		}
   606  		prevReceive = receives
   607  	}
   608  
   609  //现在取消注册支持代理的处理程序,现在不会处理任何消息
   610  	hndlrProxDereg()
   611  	receives = 0
   612  
   613  	for _, distance := range remoteDistances {
   614  		remotePotAddr := pot.RandomAddressAt(localPotAddr, distance)
   615  		remoteAddr := remotePotAddr.Bytes()
   616  
   617  		pssMsg := newPssMsg(&msgParams{raw: true})
   618  		pssMsg.To = remoteAddr
   619  		pssMsg.Expire = uint32(time.Now().Unix() + 4200)
   620  		pssMsg.Payload = &whisper.Envelope{
   621  			Topic: whisper.TopicType(topic),
   622  			Data:  []byte(remotePotAddr.String()),
   623  		}
   624  
   625  		log.Trace("noprox addrs", "local", localAddr, "remote", remoteAddr)
   626  		ps.handlePssMsg(context.TODO(), pssMsg)
   627  		if receives != 0 {
   628  			t.Fatalf("expected distance %d to not be recipient when prox is not set for handler", distance)
   629  		}
   630  
   631  	}
   632  }
   633  
   634  //验证消息队列是否在应该的时候发生,以及是否删除过期和损坏的消息
   635  func TestMessageProcessing(t *testing.T) {
   636  
   637  	t.Skip("Disabled due to probable faulty logic for outbox expectations")
   638  //设置
   639  	privkey, err := crypto.GenerateKey()
   640  	if err != nil {
   641  		t.Fatal(err.Error())
   642  	}
   643  
   644  	addr := make([]byte, 32)
   645  	addr[0] = 0x01
   646  	ps := newTestPss(privkey, network.NewKademlia(addr, network.NewKadParams()), NewPssParams())
   647  
   648  //消息应该通过
   649  	msg := newPssMsg(&msgParams{})
   650  	msg.To = addr
   651  	msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix())
   652  	msg.Payload = &whisper.Envelope{
   653  		Topic: [4]byte{},
   654  		Data:  []byte{0x66, 0x6f, 0x6f},
   655  	}
   656  	if err := ps.handlePssMsg(context.TODO(), msg); err != nil {
   657  		t.Fatal(err.Error())
   658  	}
   659  	tmr := time.NewTimer(time.Millisecond * 100)
   660  	var outmsg *PssMsg
   661  	select {
   662  	case outmsg = <-ps.outbox:
   663  	case <-tmr.C:
   664  	default:
   665  	}
   666  	if outmsg != nil {
   667  		t.Fatalf("expected outbox empty after full address on msg, but had message %s", msg)
   668  	}
   669  
   670  //由于部分长度,消息应通过并排队
   671  	msg.To = addr[0:1]
   672  	msg.Payload.Data = []byte{0x78, 0x79, 0x80, 0x80, 0x79}
   673  	if err := ps.handlePssMsg(context.TODO(), msg); err != nil {
   674  		t.Fatal(err.Error())
   675  	}
   676  	tmr.Reset(time.Millisecond * 100)
   677  	outmsg = nil
   678  	select {
   679  	case outmsg = <-ps.outbox:
   680  	case <-tmr.C:
   681  	}
   682  	if outmsg == nil {
   683  		t.Fatal("expected message in outbox on encrypt fail, but empty")
   684  	}
   685  	outmsg = nil
   686  	select {
   687  	case outmsg = <-ps.outbox:
   688  	default:
   689  	}
   690  	if outmsg != nil {
   691  		t.Fatalf("expected only one queued message but also had message %v", msg)
   692  	}
   693  
   694  //完全地址不匹配应将消息放入队列
   695  	msg.To[0] = 0xff
   696  	if err := ps.handlePssMsg(context.TODO(), msg); err != nil {
   697  		t.Fatal(err.Error())
   698  	}
   699  	tmr.Reset(time.Millisecond * 10)
   700  	outmsg = nil
   701  	select {
   702  	case outmsg = <-ps.outbox:
   703  	case <-tmr.C:
   704  	}
   705  	if outmsg == nil {
   706  		t.Fatal("expected message in outbox on address mismatch, but empty")
   707  	}
   708  	outmsg = nil
   709  	select {
   710  	case outmsg = <-ps.outbox:
   711  	default:
   712  	}
   713  	if outmsg != nil {
   714  		t.Fatalf("expected only one queued message but also had message %v", msg)
   715  	}
   716  
   717  //应删除过期的邮件
   718  	msg.Expire = uint32(time.Now().Add(-time.Second).Unix())
   719  	if err := ps.handlePssMsg(context.TODO(), msg); err != nil {
   720  		t.Fatal(err.Error())
   721  	}
   722  	tmr.Reset(time.Millisecond * 10)
   723  	outmsg = nil
   724  	select {
   725  	case outmsg = <-ps.outbox:
   726  	case <-tmr.C:
   727  	default:
   728  	}
   729  	if outmsg != nil {
   730  		t.Fatalf("expected empty queue but have message %v", msg)
   731  	}
   732  
   733  //无效消息应返回错误
   734  	fckedupmsg := &struct {
   735  		pssMsg *PssMsg
   736  	}{
   737  		pssMsg: &PssMsg{},
   738  	}
   739  	if err := ps.handlePssMsg(context.TODO(), fckedupmsg); err == nil {
   740  		t.Fatalf("expected error from processMsg but error nil")
   741  	}
   742  
   743  //发件箱已满应返回错误
   744  	msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix())
   745  	for i := 0; i < defaultOutboxCapacity; i++ {
   746  		ps.outbox <- msg
   747  	}
   748  	msg.Payload.Data = []byte{0x62, 0x61, 0x72}
   749  	err = ps.handlePssMsg(context.TODO(), msg)
   750  	if err == nil {
   751  		t.Fatal("expected error when mailbox full, but was nil")
   752  	}
   753  }
   754  
   755  //设置和生成公钥和符号键
   756  func TestKeys(t *testing.T) {
   757  //制作我们的密钥并用它初始化PSS
   758  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
   759  	defer cancel()
   760  	ourkeys, err := wapi.NewKeyPair(ctx)
   761  	if err != nil {
   762  		t.Fatalf("create 'our' key fail")
   763  	}
   764  	ctx, cancel2 := context.WithTimeout(context.Background(), time.Second)
   765  	defer cancel2()
   766  	theirkeys, err := wapi.NewKeyPair(ctx)
   767  	if err != nil {
   768  		t.Fatalf("create 'their' key fail")
   769  	}
   770  	ourprivkey, err := w.GetPrivateKey(ourkeys)
   771  	if err != nil {
   772  		t.Fatalf("failed to retrieve 'our' private key")
   773  	}
   774  	theirprivkey, err := w.GetPrivateKey(theirkeys)
   775  	if err != nil {
   776  		t.Fatalf("failed to retrieve 'their' private key")
   777  	}
   778  	ps := newTestPss(ourprivkey, nil, nil)
   779  
   780  //使用模拟地址、映射到模拟公共地址和模拟符号密钥设置对等机
   781  	addr := make(PssAddress, 32)
   782  	copy(addr, network.RandomAddr().Over())
   783  	outkey := network.RandomAddr().Over()
   784  	topicobj := BytesToTopic([]byte("foo:42"))
   785  	ps.SetPeerPublicKey(&theirprivkey.PublicKey, topicobj, addr)
   786  	outkeyid, err := ps.SetSymmetricKey(outkey, topicobj, addr, false)
   787  	if err != nil {
   788  		t.Fatalf("failed to set 'our' outgoing symmetric key")
   789  	}
   790  
   791  //生成一个对称密钥,我们将向对等机发送该密钥,以便对发送给我们的消息进行加密。
   792  	inkeyid, err := ps.GenerateSymmetricKey(topicobj, addr, true)
   793  	if err != nil {
   794  		t.Fatalf("failed to set 'our' incoming symmetric key")
   795  	}
   796  
   797  //把钥匙从耳语中拿回来,检查它是否仍然一样
   798  	outkeyback, err := ps.w.GetSymKey(outkeyid)
   799  	if err != nil {
   800  		t.Fatalf(err.Error())
   801  	}
   802  	inkey, err := ps.w.GetSymKey(inkeyid)
   803  	if err != nil {
   804  		t.Fatalf(err.Error())
   805  	}
   806  	if !bytes.Equal(outkeyback, outkey) {
   807  		t.Fatalf("passed outgoing symkey doesnt equal stored: %x / %x", outkey, outkeyback)
   808  	}
   809  
   810  	t.Logf("symout: %v", outkeyback)
   811  	t.Logf("symin: %v", inkey)
   812  
   813  //检查密钥是否存储在对等池中
   814  	psp := ps.symKeyPool[inkeyid][topicobj]
   815  	if !bytes.Equal(psp.address, addr) {
   816  		t.Fatalf("inkey address does not match; %p != %p", psp.address, addr)
   817  	}
   818  }
   819  
   820  //检查我们是否可以为每个主题和对等方检索以前添加的公钥实体
   821  func TestGetPublickeyEntries(t *testing.T) {
   822  
   823  	privkey, err := crypto.GenerateKey()
   824  	if err != nil {
   825  		t.Fatal(err)
   826  	}
   827  	ps := newTestPss(privkey, nil, nil)
   828  
   829  	peeraddr := network.RandomAddr().Over()
   830  	topicaddr := make(map[Topic]PssAddress)
   831  	topicaddr[Topic{0x13}] = peeraddr
   832  	topicaddr[Topic{0x2a}] = peeraddr[:16]
   833  	topicaddr[Topic{0x02, 0x9a}] = []byte{}
   834  
   835  	remoteprivkey, err := crypto.GenerateKey()
   836  	if err != nil {
   837  		t.Fatal(err)
   838  	}
   839  	remotepubkeybytes := crypto.FromECDSAPub(&remoteprivkey.PublicKey)
   840  	remotepubkeyhex := common.ToHex(remotepubkeybytes)
   841  
   842  	pssapi := NewAPI(ps)
   843  
   844  	for to, a := range topicaddr {
   845  		err = pssapi.SetPeerPublicKey(remotepubkeybytes, to, a)
   846  		if err != nil {
   847  			t.Fatal(err)
   848  		}
   849  	}
   850  
   851  	intopic, err := pssapi.GetPeerTopics(remotepubkeyhex)
   852  	if err != nil {
   853  		t.Fatal(err)
   854  	}
   855  
   856  OUTER:
   857  	for _, tnew := range intopic {
   858  		for torig, addr := range topicaddr {
   859  			if bytes.Equal(torig[:], tnew[:]) {
   860  				inaddr, err := pssapi.GetPeerAddress(remotepubkeyhex, torig)
   861  				if err != nil {
   862  					t.Fatal(err)
   863  				}
   864  				if !bytes.Equal(addr, inaddr) {
   865  					t.Fatalf("Address mismatch for topic %x; got %x, expected %x", torig, inaddr, addr)
   866  				}
   867  				delete(topicaddr, torig)
   868  				continue OUTER
   869  			}
   870  		}
   871  		t.Fatalf("received topic %x did not match any existing topics", tnew)
   872  	}
   873  
   874  	if len(topicaddr) != 0 {
   875  		t.Fatalf("%d topics were not matched", len(topicaddr))
   876  	}
   877  }
   878  
   879  //转发应跳过没有匹配PSS功能的对等端
   880  func TestPeerCapabilityMismatch(t *testing.T) {
   881  
   882  //为转发器节点创建私钥
   883  	privkey, err := crypto.GenerateKey()
   884  	if err != nil {
   885  		t.Fatal(err)
   886  	}
   887  
   888  //初始化KAD
   889  	baseaddr := network.RandomAddr()
   890  	kad := network.NewKademlia((baseaddr).Over(), network.NewKadParams())
   891  	rw := &p2p.MsgPipeRW{}
   892  
   893  //一个对等机的PSS版本不匹配
   894  	wrongpssaddr := network.RandomAddr()
   895  	wrongpsscap := p2p.Cap{
   896  		Name:    pssProtocolName,
   897  		Version: 0,
   898  	}
   899  	nid := enode.ID{0x01}
   900  	wrongpsspeer := network.NewPeer(&network.BzzPeer{
   901  		Peer:    protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(wrongpssaddr.Over()), []p2p.Cap{wrongpsscap}), rw, nil),
   902  		BzzAddr: &network.BzzAddr{OAddr: wrongpssaddr.Over(), UAddr: nil},
   903  	}, kad)
   904  
   905  //一个同伴甚至没有PSS(boo!)
   906  	nopssaddr := network.RandomAddr()
   907  	nopsscap := p2p.Cap{
   908  		Name:    "nopss",
   909  		Version: 1,
   910  	}
   911  	nid = enode.ID{0x02}
   912  	nopsspeer := network.NewPeer(&network.BzzPeer{
   913  		Peer:    protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(nopssaddr.Over()), []p2p.Cap{nopsscap}), rw, nil),
   914  		BzzAddr: &network.BzzAddr{OAddr: nopssaddr.Over(), UAddr: nil},
   915  	}, kad)
   916  
   917  //将对等点添加到Kademlia并激活它们
   918  //它是安全的,所以不要检查错误
   919  	kad.Register(wrongpsspeer.BzzAddr)
   920  	kad.On(wrongpsspeer)
   921  	kad.Register(nopsspeer.BzzAddr)
   922  	kad.On(nopsspeer)
   923  
   924  //创建PSS
   925  	pssmsg := &PssMsg{
   926  		To:      []byte{},
   927  		Expire:  uint32(time.Now().Add(time.Second).Unix()),
   928  		Payload: &whisper.Envelope{},
   929  	}
   930  	ps := newTestPss(privkey, kad, nil)
   931  
   932  //向前跑
   933  //这就足够完成了;试图发送给不具备能力的对等方将创建segfault
   934  	ps.forward(pssmsg)
   935  
   936  }
   937  
   938  //验证仅当存在主题的至少一个处理程序(其中显式允许原始消息)时才调用原始消息的消息处理程序
   939  func TestRawAllow(t *testing.T) {
   940  
   941  //像以前那样多次设置PSS
   942  	privKey, err := crypto.GenerateKey()
   943  	if err != nil {
   944  		t.Fatal(err)
   945  	}
   946  	baseAddr := network.RandomAddr()
   947  	kad := network.NewKademlia((baseAddr).Over(), network.NewKadParams())
   948  	ps := newTestPss(privKey, kad, nil)
   949  	topic := BytesToTopic([]byte{0x2a})
   950  
   951  //创建处理程序的内部目录,该处理程序在每次消息命中它时递增
   952  	var receives int
   953  	rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error {
   954  		log.Trace("in allowraw handler")
   955  		receives++
   956  		return nil
   957  	}
   958  
   959  //用不带原始功能的处理程序包装此处理程序函数并注册它
   960  	hndlrNoRaw := &handler{
   961  		f: rawHandlerFunc,
   962  	}
   963  	ps.Register(&topic, hndlrNoRaw)
   964  
   965  //用原始消息测试它,应该是poo poo
   966  	pssMsg := newPssMsg(&msgParams{
   967  		raw: true,
   968  	})
   969  	pssMsg.To = baseAddr.OAddr
   970  	pssMsg.Expire = uint32(time.Now().Unix() + 4200)
   971  	pssMsg.Payload = &whisper.Envelope{
   972  		Topic: whisper.TopicType(topic),
   973  	}
   974  	ps.handlePssMsg(context.TODO(), pssMsg)
   975  	if receives > 0 {
   976  		t.Fatalf("Expected handler not to be executed with raw cap off")
   977  	}
   978  
   979  //现在用原始功能包装相同的处理程序函数并注册它
   980  	hndlrRaw := &handler{
   981  		f: rawHandlerFunc,
   982  		caps: &handlerCaps{
   983  			raw: true,
   984  		},
   985  	}
   986  	deregRawHandler := ps.Register(&topic, hndlrRaw)
   987  
   988  //现在应该工作
   989  	pssMsg.Payload.Data = []byte("Raw Deal")
   990  	ps.handlePssMsg(context.TODO(), pssMsg)
   991  	if receives == 0 {
   992  		t.Fatalf("Expected handler to be executed with raw cap on")
   993  	}
   994  
   995  //现在注销具有原始功能的处理程序
   996  	prevReceives := receives
   997  	deregRawHandler()
   998  
   999  //检查原始消息是否再次失败
  1000  	pssMsg.Payload.Data = []byte("Raw Trump")
  1001  	ps.handlePssMsg(context.TODO(), pssMsg)
  1002  	if receives != prevReceives {
  1003  		t.Fatalf("Expected handler not to be executed when raw handler is retracted")
  1004  	}
  1005  }
  1006  
  1007  //下面是使用模拟框架的测试
  1008  
  1009  //测试API层是否可以处理边缘大小写值
  1010  func TestApi(t *testing.T) {
  1011  	clients, err := setupNetwork(2, true)
  1012  	if err != nil {
  1013  		t.Fatal(err)
  1014  	}
  1015  
  1016  	topic := "0xdeadbeef"
  1017  
  1018  	err = clients[0].Call(nil, "pss_sendRaw", "0x", topic, "0x666f6f")
  1019  	if err != nil {
  1020  		t.Fatal(err)
  1021  	}
  1022  
  1023  	err = clients[0].Call(nil, "pss_sendRaw", "0xabcdef", topic, "0x")
  1024  	if err == nil {
  1025  		t.Fatal("expected error on empty msg")
  1026  	}
  1027  
  1028  	overflowAddr := [33]byte{}
  1029  	err = clients[0].Call(nil, "pss_sendRaw", hexutil.Encode(overflowAddr[:]), topic, "0x666f6f")
  1030  	if err == nil {
  1031  		t.Fatal("expected error on send too big address")
  1032  	}
  1033  }
  1034  
  1035  //验证节点是否可以发送和接收原始(逐字)消息
  1036  func TestSendRaw(t *testing.T) {
  1037  	t.Run("32", testSendRaw)
  1038  	t.Run("8", testSendRaw)
  1039  	t.Run("0", testSendRaw)
  1040  }
  1041  
  1042  func testSendRaw(t *testing.T) {
  1043  
  1044  	var addrsize int64
  1045  	var err error
  1046  
  1047  	paramstring := strings.Split(t.Name(), "/")
  1048  
  1049  	addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
  1050  	log.Info("raw send test", "addrsize", addrsize)
  1051  
  1052  	clients, err := setupNetwork(2, true)
  1053  	if err != nil {
  1054  		t.Fatal(err)
  1055  	}
  1056  
  1057  	topic := "0xdeadbeef"
  1058  
  1059  	var loaddrhex string
  1060  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
  1061  	if err != nil {
  1062  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  1063  	}
  1064  	loaddrhex = loaddrhex[:2+(addrsize*2)]
  1065  	var roaddrhex string
  1066  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
  1067  	if err != nil {
  1068  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  1069  	}
  1070  	roaddrhex = roaddrhex[:2+(addrsize*2)]
  1071  
  1072  	time.Sleep(time.Millisecond * 500)
  1073  
  1074  //此时,我们已经验证了在每个对等机上保存和匹配符号键。
  1075  //现在尝试向两个方向发送对称加密的消息
  1076  	lmsgC := make(chan APIMsg)
  1077  	lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10)
  1078  	defer lcancel()
  1079  	lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, true, false)
  1080  	log.Trace("lsub", "id", lsub)
  1081  	defer lsub.Unsubscribe()
  1082  	rmsgC := make(chan APIMsg)
  1083  	rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10)
  1084  	defer rcancel()
  1085  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, true, false)
  1086  	log.Trace("rsub", "id", rsub)
  1087  	defer rsub.Unsubscribe()
  1088  
  1089  //发送并验证传递
  1090  	lmsg := []byte("plugh")
  1091  	err = clients[1].Call(nil, "pss_sendRaw", loaddrhex, topic, hexutil.Encode(lmsg))
  1092  	if err != nil {
  1093  		t.Fatal(err)
  1094  	}
  1095  	select {
  1096  	case recvmsg := <-lmsgC:
  1097  		if !bytes.Equal(recvmsg.Msg, lmsg) {
  1098  			t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg)
  1099  		}
  1100  	case cerr := <-lctx.Done():
  1101  		t.Fatalf("test message (left) timed out: %v", cerr)
  1102  	}
  1103  	rmsg := []byte("xyzzy")
  1104  	err = clients[0].Call(nil, "pss_sendRaw", roaddrhex, topic, hexutil.Encode(rmsg))
  1105  	if err != nil {
  1106  		t.Fatal(err)
  1107  	}
  1108  	select {
  1109  	case recvmsg := <-rmsgC:
  1110  		if !bytes.Equal(recvmsg.Msg, rmsg) {
  1111  			t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg)
  1112  		}
  1113  	case cerr := <-rctx.Done():
  1114  		t.Fatalf("test message (right) timed out: %v", cerr)
  1115  	}
  1116  }
  1117  
  1118  //在两个直接连接的对等端之间发送对称加密的消息
  1119  func TestSendSym(t *testing.T) {
  1120  	t.Run("32", testSendSym)
  1121  	t.Run("8", testSendSym)
  1122  	t.Run("0", testSendSym)
  1123  }
  1124  
  1125  func testSendSym(t *testing.T) {
  1126  
  1127  //地址提示大小
  1128  	var addrsize int64
  1129  	var err error
  1130  	paramstring := strings.Split(t.Name(), "/")
  1131  	addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
  1132  	log.Info("sym send test", "addrsize", addrsize)
  1133  
  1134  	clients, err := setupNetwork(2, false)
  1135  	if err != nil {
  1136  		t.Fatal(err)
  1137  	}
  1138  
  1139  	var topic string
  1140  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
  1141  	if err != nil {
  1142  		t.Fatal(err)
  1143  	}
  1144  
  1145  	var loaddrhex string
  1146  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
  1147  	if err != nil {
  1148  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  1149  	}
  1150  	loaddrhex = loaddrhex[:2+(addrsize*2)]
  1151  	var roaddrhex string
  1152  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
  1153  	if err != nil {
  1154  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  1155  	}
  1156  	roaddrhex = roaddrhex[:2+(addrsize*2)]
  1157  
  1158  //从PSS实例检索公钥
  1159  //互惠设置此公钥
  1160  	var lpubkeyhex string
  1161  	err = clients[0].Call(&lpubkeyhex, "pss_getPublicKey")
  1162  	if err != nil {
  1163  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
  1164  	}
  1165  	var rpubkeyhex string
  1166  	err = clients[1].Call(&rpubkeyhex, "pss_getPublicKey")
  1167  	if err != nil {
  1168  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
  1169  	}
  1170  
  1171  	time.Sleep(time.Millisecond * 500)
  1172  
  1173  //此时,我们已经验证了在每个对等机上保存和匹配符号键。
  1174  //现在尝试向两个方向发送对称加密的消息
  1175  	lmsgC := make(chan APIMsg)
  1176  	lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10)
  1177  	defer lcancel()
  1178  	lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false)
  1179  	log.Trace("lsub", "id", lsub)
  1180  	defer lsub.Unsubscribe()
  1181  	rmsgC := make(chan APIMsg)
  1182  	rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10)
  1183  	defer rcancel()
  1184  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false)
  1185  	log.Trace("rsub", "id", rsub)
  1186  	defer rsub.Unsubscribe()
  1187  
  1188  	lrecvkey := network.RandomAddr().Over()
  1189  	rrecvkey := network.RandomAddr().Over()
  1190  
  1191  	var lkeyids [2]string
  1192  	var rkeyids [2]string
  1193  
  1194  //手动设置互惠符号键
  1195  	err = clients[0].Call(&lkeyids, "psstest_setSymKeys", rpubkeyhex, lrecvkey, rrecvkey, defaultSymKeySendLimit, topic, roaddrhex)
  1196  	if err != nil {
  1197  		t.Fatal(err)
  1198  	}
  1199  	err = clients[1].Call(&rkeyids, "psstest_setSymKeys", lpubkeyhex, rrecvkey, lrecvkey, defaultSymKeySendLimit, topic, loaddrhex)
  1200  	if err != nil {
  1201  		t.Fatal(err)
  1202  	}
  1203  
  1204  //发送并验证传递
  1205  	lmsg := []byte("plugh")
  1206  	err = clients[1].Call(nil, "pss_sendSym", rkeyids[1], topic, hexutil.Encode(lmsg))
  1207  	if err != nil {
  1208  		t.Fatal(err)
  1209  	}
  1210  	select {
  1211  	case recvmsg := <-lmsgC:
  1212  		if !bytes.Equal(recvmsg.Msg, lmsg) {
  1213  			t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg)
  1214  		}
  1215  	case cerr := <-lctx.Done():
  1216  		t.Fatalf("test message timed out: %v", cerr)
  1217  	}
  1218  	rmsg := []byte("xyzzy")
  1219  	err = clients[0].Call(nil, "pss_sendSym", lkeyids[1], topic, hexutil.Encode(rmsg))
  1220  	if err != nil {
  1221  		t.Fatal(err)
  1222  	}
  1223  	select {
  1224  	case recvmsg := <-rmsgC:
  1225  		if !bytes.Equal(recvmsg.Msg, rmsg) {
  1226  			t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg)
  1227  		}
  1228  	case cerr := <-rctx.Done():
  1229  		t.Fatalf("test message timed out: %v", cerr)
  1230  	}
  1231  }
  1232  
  1233  //在两个直接连接的对等端之间发送非对称加密消息
  1234  func TestSendAsym(t *testing.T) {
  1235  	t.Run("32", testSendAsym)
  1236  	t.Run("8", testSendAsym)
  1237  	t.Run("0", testSendAsym)
  1238  }
  1239  
  1240  func testSendAsym(t *testing.T) {
  1241  
  1242  //地址提示大小
  1243  	var addrsize int64
  1244  	var err error
  1245  	paramstring := strings.Split(t.Name(), "/")
  1246  	addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
  1247  	log.Info("asym send test", "addrsize", addrsize)
  1248  
  1249  	clients, err := setupNetwork(2, false)
  1250  	if err != nil {
  1251  		t.Fatal(err)
  1252  	}
  1253  
  1254  	var topic string
  1255  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
  1256  	if err != nil {
  1257  		t.Fatal(err)
  1258  	}
  1259  
  1260  	time.Sleep(time.Millisecond * 250)
  1261  
  1262  	var loaddrhex string
  1263  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
  1264  	if err != nil {
  1265  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  1266  	}
  1267  	loaddrhex = loaddrhex[:2+(addrsize*2)]
  1268  	var roaddrhex string
  1269  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
  1270  	if err != nil {
  1271  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  1272  	}
  1273  	roaddrhex = roaddrhex[:2+(addrsize*2)]
  1274  
  1275  //从PSS实例检索公钥
  1276  //互惠设置此公钥
  1277  	var lpubkey string
  1278  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
  1279  	if err != nil {
  1280  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
  1281  	}
  1282  	var rpubkey string
  1283  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
  1284  	if err != nil {
  1285  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
  1286  	}
  1287  
  1288  time.Sleep(time.Millisecond * 500) //替换为配置单元正常代码
  1289  
  1290  	lmsgC := make(chan APIMsg)
  1291  	lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10)
  1292  	defer lcancel()
  1293  	lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false)
  1294  	log.Trace("lsub", "id", lsub)
  1295  	defer lsub.Unsubscribe()
  1296  	rmsgC := make(chan APIMsg)
  1297  	rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10)
  1298  	defer rcancel()
  1299  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false)
  1300  	log.Trace("rsub", "id", rsub)
  1301  	defer rsub.Unsubscribe()
  1302  
  1303  //存储对等公钥
  1304  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex)
  1305  	if err != nil {
  1306  		t.Fatal(err)
  1307  	}
  1308  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex)
  1309  	if err != nil {
  1310  		t.Fatal(err)
  1311  	}
  1312  
  1313  //发送并验证传递
  1314  	rmsg := []byte("xyzzy")
  1315  	err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg))
  1316  	if err != nil {
  1317  		t.Fatal(err)
  1318  	}
  1319  	select {
  1320  	case recvmsg := <-rmsgC:
  1321  		if !bytes.Equal(recvmsg.Msg, rmsg) {
  1322  			t.Fatalf("node 2 received payload mismatch: expected %v, got %v", rmsg, recvmsg.Msg)
  1323  		}
  1324  	case cerr := <-rctx.Done():
  1325  		t.Fatalf("test message timed out: %v", cerr)
  1326  	}
  1327  	lmsg := []byte("plugh")
  1328  	err = clients[1].Call(nil, "pss_sendAsym", lpubkey, topic, hexutil.Encode(lmsg))
  1329  	if err != nil {
  1330  		t.Fatal(err)
  1331  	}
  1332  	select {
  1333  	case recvmsg := <-lmsgC:
  1334  		if !bytes.Equal(recvmsg.Msg, lmsg) {
  1335  			t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg.Msg)
  1336  		}
  1337  	case cerr := <-lctx.Done():
  1338  		t.Fatalf("test message timed out: %v", cerr)
  1339  	}
  1340  }
  1341  
  1342  type Job struct {
  1343  	Msg      []byte
  1344  	SendNode enode.ID
  1345  	RecvNode enode.ID
  1346  }
  1347  
  1348  func worker(id int, jobs <-chan Job, rpcs map[enode.ID]*rpc.Client, pubkeys map[enode.ID]string, topic string) {
  1349  	for j := range jobs {
  1350  		rpcs[j.SendNode].Call(nil, "pss_sendAsym", pubkeys[j.RecvNode], topic, hexutil.Encode(j.Msg))
  1351  	}
  1352  }
  1353  
  1354  func TestNetwork(t *testing.T) {
  1355  	t.Run("16/1000/4/sim", testNetwork)
  1356  }
  1357  
  1358  //运行名称中的参数:
  1359  //节点/msgs/addrbytes/adaptertype
  1360  //如果adaptertype为exec,则使用execadapter,否则使用simadapter
  1361  func TestNetwork2000(t *testing.T) {
  1362  //Enabl()
  1363  
  1364  	if !*longrunning {
  1365  		t.Skip("run with --longrunning flag to run extensive network tests")
  1366  	}
  1367  	t.Run("3/2000/4/sim", testNetwork)
  1368  	t.Run("4/2000/4/sim", testNetwork)
  1369  	t.Run("8/2000/4/sim", testNetwork)
  1370  	t.Run("16/2000/4/sim", testNetwork)
  1371  }
  1372  
  1373  func TestNetwork5000(t *testing.T) {
  1374  //Enabl()
  1375  
  1376  	if !*longrunning {
  1377  		t.Skip("run with --longrunning flag to run extensive network tests")
  1378  	}
  1379  	t.Run("3/5000/4/sim", testNetwork)
  1380  	t.Run("4/5000/4/sim", testNetwork)
  1381  	t.Run("8/5000/4/sim", testNetwork)
  1382  	t.Run("16/5000/4/sim", testNetwork)
  1383  }
  1384  
  1385  func TestNetwork10000(t *testing.T) {
  1386  //Enabl()
  1387  
  1388  	if !*longrunning {
  1389  		t.Skip("run with --longrunning flag to run extensive network tests")
  1390  	}
  1391  	t.Run("3/10000/4/sim", testNetwork)
  1392  	t.Run("4/10000/4/sim", testNetwork)
  1393  	t.Run("8/10000/4/sim", testNetwork)
  1394  }
  1395  
  1396  func testNetwork(t *testing.T) {
  1397  	paramstring := strings.Split(t.Name(), "/")
  1398  	nodecount, _ := strconv.ParseInt(paramstring[1], 10, 0)
  1399  	msgcount, _ := strconv.ParseInt(paramstring[2], 10, 0)
  1400  	addrsize, _ := strconv.ParseInt(paramstring[3], 10, 0)
  1401  	adapter := paramstring[4]
  1402  
  1403  	log.Info("network test", "nodecount", nodecount, "msgcount", msgcount, "addrhintsize", addrsize)
  1404  
  1405  	nodes := make([]enode.ID, nodecount)
  1406  	bzzaddrs := make(map[enode.ID]string, nodecount)
  1407  	rpcs := make(map[enode.ID]*rpc.Client, nodecount)
  1408  	pubkeys := make(map[enode.ID]string, nodecount)
  1409  
  1410  	sentmsgs := make([][]byte, msgcount)
  1411  	recvmsgs := make([]bool, msgcount)
  1412  	nodemsgcount := make(map[enode.ID]int, nodecount)
  1413  
  1414  	trigger := make(chan enode.ID)
  1415  
  1416  	var a adapters.NodeAdapter
  1417  	if adapter == "exec" {
  1418  		dirname, err := ioutil.TempDir(".", "")
  1419  		if err != nil {
  1420  			t.Fatal(err)
  1421  		}
  1422  		a = adapters.NewExecAdapter(dirname)
  1423  	} else if adapter == "tcp" {
  1424  		a = adapters.NewTCPAdapter(newServices(false))
  1425  	} else if adapter == "sim" {
  1426  		a = adapters.NewSimAdapter(newServices(false))
  1427  	}
  1428  	net := simulations.NewNetwork(a, &simulations.NetworkConfig{
  1429  		ID: "0",
  1430  	})
  1431  	defer net.Shutdown()
  1432  
  1433  	f, err := os.Open(fmt.Sprintf("testdata/snapshot_%d.json", nodecount))
  1434  	if err != nil {
  1435  		t.Fatal(err)
  1436  	}
  1437  	jsonbyte, err := ioutil.ReadAll(f)
  1438  	if err != nil {
  1439  		t.Fatal(err)
  1440  	}
  1441  	var snap simulations.Snapshot
  1442  	err = json.Unmarshal(jsonbyte, &snap)
  1443  	if err != nil {
  1444  		t.Fatal(err)
  1445  	}
  1446  	err = net.Load(&snap)
  1447  	if err != nil {
  1448  //TODO:将p2p仿真框架修复为加载32个节点时不会崩溃
  1449  //致死性(Err)
  1450  	}
  1451  
  1452  	time.Sleep(1 * time.Second)
  1453  
  1454  	triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client, topic string) error {
  1455  		msgC := make(chan APIMsg)
  1456  		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  1457  		defer cancel()
  1458  		sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", topic, false, false)
  1459  		if err != nil {
  1460  			t.Fatal(err)
  1461  		}
  1462  		go func() {
  1463  			defer sub.Unsubscribe()
  1464  			for {
  1465  				select {
  1466  				case recvmsg := <-msgC:
  1467  					idx, _ := binary.Uvarint(recvmsg.Msg)
  1468  					if !recvmsgs[idx] {
  1469  						log.Debug("msg recv", "idx", idx, "id", id)
  1470  						recvmsgs[idx] = true
  1471  						trigger <- id
  1472  					}
  1473  				case <-sub.Err():
  1474  					return
  1475  				}
  1476  			}
  1477  		}()
  1478  		return nil
  1479  	}
  1480  
  1481  	var topic string
  1482  	for i, nod := range net.GetNodes() {
  1483  		nodes[i] = nod.ID()
  1484  		rpcs[nodes[i]], err = nod.Client()
  1485  		if err != nil {
  1486  			t.Fatal(err)
  1487  		}
  1488  		if topic == "" {
  1489  			err = rpcs[nodes[i]].Call(&topic, "pss_stringToTopic", "foo:42")
  1490  			if err != nil {
  1491  				t.Fatal(err)
  1492  			}
  1493  		}
  1494  		var pubkey string
  1495  		err = rpcs[nodes[i]].Call(&pubkey, "pss_getPublicKey")
  1496  		if err != nil {
  1497  			t.Fatal(err)
  1498  		}
  1499  		pubkeys[nod.ID()] = pubkey
  1500  		var addrhex string
  1501  		err = rpcs[nodes[i]].Call(&addrhex, "pss_baseAddr")
  1502  		if err != nil {
  1503  			t.Fatal(err)
  1504  		}
  1505  		bzzaddrs[nodes[i]] = addrhex
  1506  		err = triggerChecks(trigger, nodes[i], rpcs[nodes[i]], topic)
  1507  		if err != nil {
  1508  			t.Fatal(err)
  1509  		}
  1510  	}
  1511  
  1512  	time.Sleep(1 * time.Second)
  1513  
  1514  //安装工人
  1515  	jobs := make(chan Job, 10)
  1516  	for w := 1; w <= 10; w++ {
  1517  		go worker(w, jobs, rpcs, pubkeys, topic)
  1518  	}
  1519  
  1520  	time.Sleep(1 * time.Second)
  1521  
  1522  	for i := 0; i < int(msgcount); i++ {
  1523  		sendnodeidx := rand.Intn(int(nodecount))
  1524  		recvnodeidx := rand.Intn(int(nodecount - 1))
  1525  		if recvnodeidx >= sendnodeidx {
  1526  			recvnodeidx++
  1527  		}
  1528  		nodemsgcount[nodes[recvnodeidx]]++
  1529  		sentmsgs[i] = make([]byte, 8)
  1530  		c := binary.PutUvarint(sentmsgs[i], uint64(i))
  1531  		if c == 0 {
  1532  			t.Fatal("0 byte message")
  1533  		}
  1534  		if err != nil {
  1535  			t.Fatal(err)
  1536  		}
  1537  		err = rpcs[nodes[sendnodeidx]].Call(nil, "pss_setPeerPublicKey", pubkeys[nodes[recvnodeidx]], topic, bzzaddrs[nodes[recvnodeidx]])
  1538  		if err != nil {
  1539  			t.Fatal(err)
  1540  		}
  1541  
  1542  		jobs <- Job{
  1543  			Msg:      sentmsgs[i],
  1544  			SendNode: nodes[sendnodeidx],
  1545  			RecvNode: nodes[recvnodeidx],
  1546  		}
  1547  	}
  1548  
  1549  	finalmsgcount := 0
  1550  	ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
  1551  	defer cancel()
  1552  outer:
  1553  	for i := 0; i < int(msgcount); i++ {
  1554  		select {
  1555  		case id := <-trigger:
  1556  			nodemsgcount[id]--
  1557  			finalmsgcount++
  1558  		case <-ctx.Done():
  1559  			log.Warn("timeout")
  1560  			break outer
  1561  		}
  1562  	}
  1563  
  1564  	for i, msg := range recvmsgs {
  1565  		if !msg {
  1566  			log.Debug("missing message", "idx", i)
  1567  		}
  1568  	}
  1569  	t.Logf("%d of %d messages received", finalmsgcount, msgcount)
  1570  
  1571  	if finalmsgcount != int(msgcount) {
  1572  		t.Fatalf("%d messages were not received", int(msgcount)-finalmsgcount)
  1573  	}
  1574  
  1575  }
  1576  
  1577  //在A->B->C->A的网络中检查
  1578  //A没有收到两次发送的消息
  1579  func TestDeduplication(t *testing.T) {
  1580  	var err error
  1581  
  1582  	clients, err := setupNetwork(3, false)
  1583  	if err != nil {
  1584  		t.Fatal(err)
  1585  	}
  1586  
  1587  	var addrsize = 32
  1588  	var loaddrhex string
  1589  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
  1590  	if err != nil {
  1591  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
  1592  	}
  1593  	loaddrhex = loaddrhex[:2+(addrsize*2)]
  1594  	var roaddrhex string
  1595  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
  1596  	if err != nil {
  1597  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
  1598  	}
  1599  	roaddrhex = roaddrhex[:2+(addrsize*2)]
  1600  	var xoaddrhex string
  1601  	err = clients[2].Call(&xoaddrhex, "pss_baseAddr")
  1602  	if err != nil {
  1603  		t.Fatalf("rpc get node 3 baseaddr fail: %v", err)
  1604  	}
  1605  	xoaddrhex = xoaddrhex[:2+(addrsize*2)]
  1606  
  1607  	log.Info("peer", "l", loaddrhex, "r", roaddrhex, "x", xoaddrhex)
  1608  
  1609  	var topic string
  1610  	err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42")
  1611  	if err != nil {
  1612  		t.Fatal(err)
  1613  	}
  1614  
  1615  	time.Sleep(time.Millisecond * 250)
  1616  
  1617  //从PSS实例检索公钥
  1618  //互惠设置此公钥
  1619  	var rpubkey string
  1620  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
  1621  	if err != nil {
  1622  		t.Fatalf("rpc get receivenode pubkey fail: %v", err)
  1623  	}
  1624  
  1625  time.Sleep(time.Millisecond * 500) //替换为配置单元正常代码
  1626  
  1627  	rmsgC := make(chan APIMsg)
  1628  	rctx, cancel := context.WithTimeout(context.Background(), time.Second*1)
  1629  	defer cancel()
  1630  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false)
  1631  	log.Trace("rsub", "id", rsub)
  1632  	defer rsub.Unsubscribe()
  1633  
  1634  //存储收件人的公钥
  1635  //零长度地址表示转发给所有人
  1636  //我们只有两个对等机,它们将在proxbin中,并且都将接收
  1637  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, "0x")
  1638  	if err != nil {
  1639  		t.Fatal(err)
  1640  	}
  1641  
  1642  //发送并验证传递
  1643  	rmsg := []byte("xyzzy")
  1644  	err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg))
  1645  	if err != nil {
  1646  		t.Fatal(err)
  1647  	}
  1648  
  1649  	var receivedok bool
  1650  OUTER:
  1651  	for {
  1652  		select {
  1653  		case <-rmsgC:
  1654  			if receivedok {
  1655  				t.Fatalf("duplicate message received")
  1656  			}
  1657  			receivedok = true
  1658  		case <-rctx.Done():
  1659  			break OUTER
  1660  		}
  1661  	}
  1662  	if !receivedok {
  1663  		t.Fatalf("message did not arrive")
  1664  	}
  1665  }
  1666  
  1667  //具有不同消息大小的对称发送性能
  1668  func BenchmarkSymkeySend(b *testing.B) {
  1669  	b.Run(fmt.Sprintf("%d", 256), benchmarkSymKeySend)
  1670  	b.Run(fmt.Sprintf("%d", 1024), benchmarkSymKeySend)
  1671  	b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkSymKeySend)
  1672  	b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkSymKeySend)
  1673  	b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkSymKeySend)
  1674  }
  1675  
  1676  func benchmarkSymKeySend(b *testing.B) {
  1677  	msgsizestring := strings.Split(b.Name(), "/")
  1678  	if len(msgsizestring) != 2 {
  1679  		b.Fatalf("benchmark called without msgsize param")
  1680  	}
  1681  	msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0)
  1682  	if err != nil {
  1683  		b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err)
  1684  	}
  1685  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1686  	defer cancel()
  1687  	keys, err := wapi.NewKeyPair(ctx)
  1688  	privkey, err := w.GetPrivateKey(keys)
  1689  	ps := newTestPss(privkey, nil, nil)
  1690  	msg := make([]byte, msgsize)
  1691  	rand.Read(msg)
  1692  	topic := BytesToTopic([]byte("foo"))
  1693  	to := make(PssAddress, 32)
  1694  	copy(to[:], network.RandomAddr().Over())
  1695  	symkeyid, err := ps.GenerateSymmetricKey(topic, to, true)
  1696  	if err != nil {
  1697  		b.Fatalf("could not generate symkey: %v", err)
  1698  	}
  1699  	symkey, err := ps.w.GetSymKey(symkeyid)
  1700  	if err != nil {
  1701  		b.Fatalf("could not retrieve symkey: %v", err)
  1702  	}
  1703  	ps.SetSymmetricKey(symkey, topic, to, false)
  1704  
  1705  	b.ResetTimer()
  1706  	for i := 0; i < b.N; i++ {
  1707  		ps.SendSym(symkeyid, topic, msg)
  1708  	}
  1709  }
  1710  
  1711  //具有不同消息大小的非对称发送性能
  1712  func BenchmarkAsymkeySend(b *testing.B) {
  1713  	b.Run(fmt.Sprintf("%d", 256), benchmarkAsymKeySend)
  1714  	b.Run(fmt.Sprintf("%d", 1024), benchmarkAsymKeySend)
  1715  	b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkAsymKeySend)
  1716  	b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkAsymKeySend)
  1717  	b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkAsymKeySend)
  1718  }
  1719  
  1720  func benchmarkAsymKeySend(b *testing.B) {
  1721  	msgsizestring := strings.Split(b.Name(), "/")
  1722  	if len(msgsizestring) != 2 {
  1723  		b.Fatalf("benchmark called without msgsize param")
  1724  	}
  1725  	msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0)
  1726  	if err != nil {
  1727  		b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err)
  1728  	}
  1729  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1730  	defer cancel()
  1731  	keys, err := wapi.NewKeyPair(ctx)
  1732  	privkey, err := w.GetPrivateKey(keys)
  1733  	ps := newTestPss(privkey, nil, nil)
  1734  	msg := make([]byte, msgsize)
  1735  	rand.Read(msg)
  1736  	topic := BytesToTopic([]byte("foo"))
  1737  	to := make(PssAddress, 32)
  1738  	copy(to[:], network.RandomAddr().Over())
  1739  	ps.SetPeerPublicKey(&privkey.PublicKey, topic, to)
  1740  	b.ResetTimer()
  1741  	for i := 0; i < b.N; i++ {
  1742  		ps.SendAsym(common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey)), topic, msg)
  1743  	}
  1744  }
  1745  func BenchmarkSymkeyBruteforceChangeaddr(b *testing.B) {
  1746  	for i := 100; i < 100000; i = i * 10 {
  1747  		for j := 32; j < 10000; j = j * 8 {
  1748  			b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceChangeaddr)
  1749  		}
  1750  //b.run(fmt.sprintf(“%d”,i),BenchmarkSymkeyBruteforceChangeAddr)
  1751  	}
  1752  }
  1753  
  1754  //使用symkey缓存解密性能,最坏情况下
  1755  //(解密密钥始终位于缓存中)
  1756  func benchmarkSymkeyBruteforceChangeaddr(b *testing.B) {
  1757  	keycountstring := strings.Split(b.Name(), "/")
  1758  	cachesize := int64(0)
  1759  	var ps *Pss
  1760  	if len(keycountstring) < 2 {
  1761  		b.Fatalf("benchmark called without count param")
  1762  	}
  1763  	keycount, err := strconv.ParseInt(keycountstring[1], 10, 0)
  1764  	if err != nil {
  1765  		b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err)
  1766  	}
  1767  	if len(keycountstring) == 3 {
  1768  		cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0)
  1769  		if err != nil {
  1770  			b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err)
  1771  		}
  1772  	}
  1773  	pssmsgs := make([]*PssMsg, 0, keycount)
  1774  	var keyid string
  1775  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1776  	defer cancel()
  1777  	keys, err := wapi.NewKeyPair(ctx)
  1778  	privkey, err := w.GetPrivateKey(keys)
  1779  	if cachesize > 0 {
  1780  		ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)})
  1781  	} else {
  1782  		ps = newTestPss(privkey, nil, nil)
  1783  	}
  1784  	topic := BytesToTopic([]byte("foo"))
  1785  	for i := 0; i < int(keycount); i++ {
  1786  		to := make(PssAddress, 32)
  1787  		copy(to[:], network.RandomAddr().Over())
  1788  		keyid, err = ps.GenerateSymmetricKey(topic, to, true)
  1789  		if err != nil {
  1790  			b.Fatalf("cant generate symkey #%d: %v", i, err)
  1791  		}
  1792  		symkey, err := ps.w.GetSymKey(keyid)
  1793  		if err != nil {
  1794  			b.Fatalf("could not retrieve symkey %s: %v", keyid, err)
  1795  		}
  1796  		wparams := &whisper.MessageParams{
  1797  			TTL:      defaultWhisperTTL,
  1798  			KeySym:   symkey,
  1799  			Topic:    whisper.TopicType(topic),
  1800  			WorkTime: defaultWhisperWorkTime,
  1801  			PoW:      defaultWhisperPoW,
  1802  			Payload:  []byte("xyzzy"),
  1803  			Padding:  []byte("1234567890abcdef"),
  1804  		}
  1805  		woutmsg, err := whisper.NewSentMessage(wparams)
  1806  		if err != nil {
  1807  			b.Fatalf("could not create whisper message: %v", err)
  1808  		}
  1809  		env, err := woutmsg.Wrap(wparams)
  1810  		if err != nil {
  1811  			b.Fatalf("could not generate whisper envelope: %v", err)
  1812  		}
  1813  		ps.Register(&topic, &handler{
  1814  			f: noopHandlerFunc,
  1815  		})
  1816  		pssmsgs = append(pssmsgs, &PssMsg{
  1817  			To:      to,
  1818  			Payload: env,
  1819  		})
  1820  	}
  1821  	b.ResetTimer()
  1822  	for i := 0; i < b.N; i++ {
  1823  		if err := ps.process(pssmsgs[len(pssmsgs)-(i%len(pssmsgs))-1], false, false); err != nil {
  1824  			b.Fatalf("pss processing failed: %v", err)
  1825  		}
  1826  	}
  1827  }
  1828  
  1829  func BenchmarkSymkeyBruteforceSameaddr(b *testing.B) {
  1830  	for i := 100; i < 100000; i = i * 10 {
  1831  		for j := 32; j < 10000; j = j * 8 {
  1832  			b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceSameaddr)
  1833  		}
  1834  	}
  1835  }
  1836  
  1837  //使用symkey缓存解密性能,最佳情况
  1838  //(解密密钥总是在缓存中的第一个)
  1839  func benchmarkSymkeyBruteforceSameaddr(b *testing.B) {
  1840  	var keyid string
  1841  	var ps *Pss
  1842  	cachesize := int64(0)
  1843  	keycountstring := strings.Split(b.Name(), "/")
  1844  	if len(keycountstring) < 2 {
  1845  		b.Fatalf("benchmark called without count param")
  1846  	}
  1847  	keycount, err := strconv.ParseInt(keycountstring[1], 10, 0)
  1848  	if err != nil {
  1849  		b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err)
  1850  	}
  1851  	if len(keycountstring) == 3 {
  1852  		cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0)
  1853  		if err != nil {
  1854  			b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err)
  1855  		}
  1856  	}
  1857  	addr := make([]PssAddress, keycount)
  1858  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1859  	defer cancel()
  1860  	keys, err := wapi.NewKeyPair(ctx)
  1861  	privkey, err := w.GetPrivateKey(keys)
  1862  	if cachesize > 0 {
  1863  		ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)})
  1864  	} else {
  1865  		ps = newTestPss(privkey, nil, nil)
  1866  	}
  1867  	topic := BytesToTopic([]byte("foo"))
  1868  	for i := 0; i < int(keycount); i++ {
  1869  		copy(addr[i], network.RandomAddr().Over())
  1870  		keyid, err = ps.GenerateSymmetricKey(topic, addr[i], true)
  1871  		if err != nil {
  1872  			b.Fatalf("cant generate symkey #%d: %v", i, err)
  1873  		}
  1874  
  1875  	}
  1876  	symkey, err := ps.w.GetSymKey(keyid)
  1877  	if err != nil {
  1878  		b.Fatalf("could not retrieve symkey %s: %v", keyid, err)
  1879  	}
  1880  	wparams := &whisper.MessageParams{
  1881  		TTL:      defaultWhisperTTL,
  1882  		KeySym:   symkey,
  1883  		Topic:    whisper.TopicType(topic),
  1884  		WorkTime: defaultWhisperWorkTime,
  1885  		PoW:      defaultWhisperPoW,
  1886  		Payload:  []byte("xyzzy"),
  1887  		Padding:  []byte("1234567890abcdef"),
  1888  	}
  1889  	woutmsg, err := whisper.NewSentMessage(wparams)
  1890  	if err != nil {
  1891  		b.Fatalf("could not create whisper message: %v", err)
  1892  	}
  1893  	env, err := woutmsg.Wrap(wparams)
  1894  	if err != nil {
  1895  		b.Fatalf("could not generate whisper envelope: %v", err)
  1896  	}
  1897  	ps.Register(&topic, &handler{
  1898  		f: noopHandlerFunc,
  1899  	})
  1900  	pssmsg := &PssMsg{
  1901  		To:      addr[len(addr)-1][:],
  1902  		Payload: env,
  1903  	}
  1904  	for i := 0; i < b.N; i++ {
  1905  		if err := ps.process(pssmsg, false, false); err != nil {
  1906  			b.Fatalf("pss processing failed: %v", err)
  1907  		}
  1908  	}
  1909  }
  1910  
  1911  //使用bzz/discovery和pss服务设置模拟网络。
  1912  //连接圆中的节点
  1913  //如果设置了allowraw,则启用了省略内置PSS加密(请参阅PSSPARAMS)
  1914  func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, err error) {
  1915  	nodes := make([]*simulations.Node, numnodes)
  1916  	clients = make([]*rpc.Client, numnodes)
  1917  	if numnodes < 2 {
  1918  		return nil, fmt.Errorf("Minimum two nodes in network")
  1919  	}
  1920  	adapter := adapters.NewSimAdapter(newServices(allowRaw))
  1921  	net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{
  1922  		ID:             "0",
  1923  		DefaultService: "bzz",
  1924  	})
  1925  	for i := 0; i < numnodes; i++ {
  1926  		nodeconf := adapters.RandomNodeConfig()
  1927  		nodeconf.Services = []string{"bzz", pssProtocolName}
  1928  		nodes[i], err = net.NewNodeWithConfig(nodeconf)
  1929  		if err != nil {
  1930  			return nil, fmt.Errorf("error creating node 1: %v", err)
  1931  		}
  1932  		err = net.Start(nodes[i].ID())
  1933  		if err != nil {
  1934  			return nil, fmt.Errorf("error starting node 1: %v", err)
  1935  		}
  1936  		if i > 0 {
  1937  			err = net.Connect(nodes[i].ID(), nodes[i-1].ID())
  1938  			if err != nil {
  1939  				return nil, fmt.Errorf("error connecting nodes: %v", err)
  1940  			}
  1941  		}
  1942  		clients[i], err = nodes[i].Client()
  1943  		if err != nil {
  1944  			return nil, fmt.Errorf("create node 1 rpc client fail: %v", err)
  1945  		}
  1946  	}
  1947  	if numnodes > 2 {
  1948  		err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID())
  1949  		if err != nil {
  1950  			return nil, fmt.Errorf("error connecting first and last nodes")
  1951  		}
  1952  	}
  1953  	return clients, nil
  1954  }
  1955  
  1956  func newServices(allowRaw bool) adapters.Services {
  1957  	stateStore := state.NewInmemoryStore()
  1958  	kademlias := make(map[enode.ID]*network.Kademlia)
  1959  	kademlia := func(id enode.ID) *network.Kademlia {
  1960  		if k, ok := kademlias[id]; ok {
  1961  			return k
  1962  		}
  1963  		params := network.NewKadParams()
  1964  		params.NeighbourhoodSize = 2
  1965  		params.MaxBinSize = 3
  1966  		params.MinBinSize = 1
  1967  		params.MaxRetries = 1000
  1968  		params.RetryExponent = 2
  1969  		params.RetryInterval = 1000000
  1970  		kademlias[id] = network.NewKademlia(id[:], params)
  1971  		return kademlias[id]
  1972  	}
  1973  	return adapters.Services{
  1974  		pssProtocolName: func(ctx *adapters.ServiceContext) (node.Service, error) {
  1975  //execadapter不执行init()。
  1976  			initTest()
  1977  
  1978  			ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second)
  1979  			defer cancel()
  1980  			keys, err := wapi.NewKeyPair(ctxlocal)
  1981  			privkey, err := w.GetPrivateKey(keys)
  1982  			pssp := NewPssParams().WithPrivateKey(privkey)
  1983  			pssp.AllowRaw = allowRaw
  1984  			pskad := kademlia(ctx.Config.ID)
  1985  			ps, err := NewPss(pskad, pssp)
  1986  			if err != nil {
  1987  				return nil, err
  1988  			}
  1989  
  1990  			ping := &Ping{
  1991  				OutC: make(chan bool),
  1992  				Pong: true,
  1993  			}
  1994  			p2pp := NewPingProtocol(ping)
  1995  			pp, err := RegisterProtocol(ps, &PingTopic, PingProtocol, p2pp, &ProtocolParams{Asymmetric: true})
  1996  			if err != nil {
  1997  				return nil, err
  1998  			}
  1999  			if useHandshake {
  2000  				SetHandshakeController(ps, NewHandshakeParams())
  2001  			}
  2002  			ps.Register(&PingTopic, &handler{
  2003  				f: pp.Handle,
  2004  				caps: &handlerCaps{
  2005  					raw: true,
  2006  				},
  2007  			})
  2008  			ps.addAPI(rpc.API{
  2009  				Namespace: "psstest",
  2010  				Version:   "0.3",
  2011  				Service:   NewAPITest(ps),
  2012  				Public:    false,
  2013  			})
  2014  			if err != nil {
  2015  				log.Error("Couldnt register pss protocol", "err", err)
  2016  				os.Exit(1)
  2017  			}
  2018  			pssprotocols[ctx.Config.ID.String()] = &protoCtrl{
  2019  				C:        ping.OutC,
  2020  				protocol: pp,
  2021  				run:      p2pp.Run,
  2022  			}
  2023  			return ps, nil
  2024  		},
  2025  		"bzz": func(ctx *adapters.ServiceContext) (node.Service, error) {
  2026  			addr := network.NewAddr(ctx.Config.Node())
  2027  			hp := network.NewHiveParams()
  2028  			hp.Discovery = false
  2029  			config := &network.BzzConfig{
  2030  				OverlayAddr:  addr.Over(),
  2031  				UnderlayAddr: addr.Under(),
  2032  				HiveParams:   hp,
  2033  			}
  2034  			return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil
  2035  		},
  2036  	}
  2037  }
  2038  
  2039  func newTestPss(privkey *ecdsa.PrivateKey, kad *network.Kademlia, ppextra *PssParams) *Pss {
  2040  	nid := enode.PubkeyToIDV4(&privkey.PublicKey)
  2041  //如果Kademlia未传递给我们,则设置路由
  2042  	if kad == nil {
  2043  		kp := network.NewKadParams()
  2044  		kp.NeighbourhoodSize = 3
  2045  		kad = network.NewKademlia(nid[:], kp)
  2046  	}
  2047  
  2048  //创建PSS
  2049  	pp := NewPssParams().WithPrivateKey(privkey)
  2050  	if ppextra != nil {
  2051  		pp.SymKeyCacheCapacity = ppextra.SymKeyCacheCapacity
  2052  	}
  2053  	ps, err := NewPss(kad, pp)
  2054  	if err != nil {
  2055  		return nil
  2056  	}
  2057  	ps.Start(nil)
  2058  
  2059  	return ps
  2060  }
  2061  
  2062  //API要求测试/开发使用
  2063  type APITest struct {
  2064  	*Pss
  2065  }
  2066  
  2067  func NewAPITest(ps *Pss) *APITest {
  2068  	return &APITest{Pss: ps}
  2069  }
  2070  
  2071  func (apitest *APITest) SetSymKeys(pubkeyid string, recvsymkey []byte, sendsymkey []byte, limit uint16, topic Topic, to hexutil.Bytes) ([2]string, error) {
  2072  
  2073  	recvsymkeyid, err := apitest.SetSymmetricKey(recvsymkey, topic, PssAddress(to), true)
  2074  	if err != nil {
  2075  		return [2]string{}, err
  2076  	}
  2077  	sendsymkeyid, err := apitest.SetSymmetricKey(sendsymkey, topic, PssAddress(to), false)
  2078  	if err != nil {
  2079  		return [2]string{}, err
  2080  	}
  2081  	return [2]string{recvsymkeyid, sendsymkeyid}, nil
  2082  }
  2083  
  2084  func (apitest *APITest) Clean() (int, error) {
  2085  	return apitest.Pss.cleanKeys(), nil
  2086  }
  2087  
  2088  //EnableMetrics正在启动InfluxDB Reporter,以便在本地运行测试时收集统计信息
  2089  func enableMetrics() {
  2090  	metrics.Enabled = true
  2091  go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 1*time.Second, "http://localhost:8086,“metrics”,“admin”,“admin”,“swarm.”,map[string]string_
  2092  		"host": "test",
  2093  	})
  2094  }
  2095