github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/pss/client/client_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 //</624450116429811712> 11 12 13 package client 14 15 import ( 16 "bytes" 17 "context" 18 "flag" 19 "fmt" 20 "math/rand" 21 "os" 22 "sync" 23 "testing" 24 "time" 25 26 "github.com/ethereum/go-ethereum/common/hexutil" 27 "github.com/ethereum/go-ethereum/log" 28 "github.com/ethereum/go-ethereum/node" 29 "github.com/ethereum/go-ethereum/p2p" 30 "github.com/ethereum/go-ethereum/p2p/enode" 31 "github.com/ethereum/go-ethereum/p2p/simulations" 32 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 33 "github.com/ethereum/go-ethereum/rpc" 34 "github.com/ethereum/go-ethereum/swarm/network" 35 "github.com/ethereum/go-ethereum/swarm/pss" 36 "github.com/ethereum/go-ethereum/swarm/state" 37 whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" 38 ) 39 40 type protoCtrl struct { 41 C chan bool 42 protocol *pss.Protocol 43 run func(*p2p.Peer, p2p.MsgReadWriter) error 44 } 45 46 var ( 47 debugdebugflag = flag.Bool("vv", false, "veryverbose") 48 debugflag = flag.Bool("v", false, "verbose") 49 w *whisper.Whisper 50 wapi *whisper.PublicWhisperAPI 51 //自定义日志 52 psslogmain log.Logger 53 pssprotocols map[string]*protoCtrl 54 sendLimit = uint16(256) 55 ) 56 57 var services = newServices() 58 59 func init() { 60 flag.Parse() 61 rand.Seed(time.Now().Unix()) 62 63 adapters.RegisterServices(services) 64 65 loglevel := log.LvlInfo 66 if *debugflag { 67 loglevel = log.LvlDebug 68 } else if *debugdebugflag { 69 loglevel = log.LvlTrace 70 } 71 72 psslogmain = log.New("psslog", "*") 73 hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) 74 hf := log.LvlFilterHandler(loglevel, hs) 75 h := log.CallerFileHandler(hf) 76 log.Root().SetHandler(h) 77 78 w = whisper.New(&whisper.DefaultConfig) 79 wapi = whisper.NewPublicWhisperAPI(w) 80 81 pssprotocols = make(map[string]*protoCtrl) 82 } 83 84 //一个过期的symkey之间的乒乓交换 85 func TestClientHandshake(t *testing.T) { 86 sendLimit = 3 87 88 clients, err := setupNetwork(2) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 lpsc, err := NewClientWithRPC(clients[0]) 94 if err != nil { 95 t.Fatal(err) 96 } 97 rpsc, err := NewClientWithRPC(clients[1]) 98 if err != nil { 99 t.Fatal(err) 100 } 101 lpssping := &pss.Ping{ 102 OutC: make(chan bool), 103 InC: make(chan bool), 104 Pong: false, 105 } 106 rpssping := &pss.Ping{ 107 OutC: make(chan bool), 108 InC: make(chan bool), 109 Pong: false, 110 } 111 lproto := pss.NewPingProtocol(lpssping) 112 rproto := pss.NewPingProtocol(rpssping) 113 114 ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) 115 defer cancel() 116 err = lpsc.RunProtocol(ctx, lproto) 117 if err != nil { 118 t.Fatal(err) 119 } 120 err = rpsc.RunProtocol(ctx, rproto) 121 if err != nil { 122 t.Fatal(err) 123 } 124 topic := pss.PingTopic.String() 125 126 var loaddr string 127 err = clients[0].Call(&loaddr, "pss_baseAddr") 128 if err != nil { 129 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 130 } 131 var roaddr string 132 err = clients[1].Call(&roaddr, "pss_baseAddr") 133 if err != nil { 134 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 135 } 136 137 var lpubkey string 138 err = clients[0].Call(&lpubkey, "pss_getPublicKey") 139 if err != nil { 140 t.Fatalf("rpc get node 1 pubkey fail: %v", err) 141 } 142 var rpubkey string 143 err = clients[1].Call(&rpubkey, "pss_getPublicKey") 144 if err != nil { 145 t.Fatalf("rpc get node 2 pubkey fail: %v", err) 146 } 147 148 err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) 149 if err != nil { 150 t.Fatal(err) 151 } 152 err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) 153 if err != nil { 154 t.Fatal(err) 155 } 156 157 time.Sleep(time.Second) 158 159 roaddrbytes, err := hexutil.Decode(roaddr) 160 if err != nil { 161 t.Fatal(err) 162 } 163 err = lpsc.AddPssPeer(rpubkey, roaddrbytes, pss.PingProtocol) 164 if err != nil { 165 t.Fatal(err) 166 } 167 168 time.Sleep(time.Second) 169 170 for i := uint16(0); i <= sendLimit; i++ { 171 lpssping.OutC <- false 172 got := <-rpssping.InC 173 log.Warn("ok", "idx", i, "got", got) 174 time.Sleep(time.Second) 175 } 176 177 rw := lpsc.peerPool[pss.PingTopic][rpubkey] 178 lpsc.RemovePssPeer(rpubkey, pss.PingProtocol) 179 if err := rw.WriteMsg(p2p.Msg{ 180 Size: 3, 181 Payload: bytes.NewReader([]byte("foo")), 182 }); err == nil { 183 t.Fatalf("expected error on write") 184 } 185 } 186 187 func setupNetwork(numnodes int) (clients []*rpc.Client, err error) { 188 nodes := make([]*simulations.Node, numnodes) 189 clients = make([]*rpc.Client, numnodes) 190 if numnodes < 2 { 191 return nil, fmt.Errorf("Minimum two nodes in network") 192 } 193 adapter := adapters.NewSimAdapter(services) 194 net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ 195 ID: "0", 196 DefaultService: "bzz", 197 }) 198 for i := 0; i < numnodes; i++ { 199 nodeconf := adapters.RandomNodeConfig() 200 nodeconf.Services = []string{"bzz", "pss"} 201 nodes[i], err = net.NewNodeWithConfig(nodeconf) 202 if err != nil { 203 return nil, fmt.Errorf("error creating node 1: %v", err) 204 } 205 err = net.Start(nodes[i].ID()) 206 if err != nil { 207 return nil, fmt.Errorf("error starting node 1: %v", err) 208 } 209 if i > 0 { 210 err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) 211 if err != nil { 212 return nil, fmt.Errorf("error connecting nodes: %v", err) 213 } 214 } 215 clients[i], err = nodes[i].Client() 216 if err != nil { 217 return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) 218 } 219 } 220 if numnodes > 2 { 221 err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) 222 if err != nil { 223 return nil, fmt.Errorf("error connecting first and last nodes") 224 } 225 } 226 return clients, nil 227 } 228 229 func newServices() adapters.Services { 230 stateStore := state.NewInmemoryStore() 231 kademlias := make(map[enode.ID]*network.Kademlia) 232 kademlia := func(id enode.ID) *network.Kademlia { 233 if k, ok := kademlias[id]; ok { 234 return k 235 } 236 params := network.NewKadParams() 237 params.NeighbourhoodSize = 2 238 params.MaxBinSize = 3 239 params.MinBinSize = 1 240 params.MaxRetries = 1000 241 params.RetryExponent = 2 242 params.RetryInterval = 1000000 243 kademlias[id] = network.NewKademlia(id[:], params) 244 return kademlias[id] 245 } 246 return adapters.Services{ 247 "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { 248 ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) 249 defer cancel() 250 keys, err := wapi.NewKeyPair(ctxlocal) 251 if err != nil { 252 return nil, err 253 } 254 privkey, err := w.GetPrivateKey(keys) 255 if err != nil { 256 return nil, err 257 } 258 psparams := pss.NewPssParams().WithPrivateKey(privkey) 259 pskad := kademlia(ctx.Config.ID) 260 ps, err := pss.NewPss(pskad, psparams) 261 if err != nil { 262 return nil, err 263 } 264 pshparams := pss.NewHandshakeParams() 265 pshparams.SymKeySendLimit = sendLimit 266 err = pss.SetHandshakeController(ps, pshparams) 267 if err != nil { 268 return nil, fmt.Errorf("handshake controller fail: %v", err) 269 } 270 return ps, nil 271 }, 272 "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { 273 addr := network.NewAddr(ctx.Config.Node()) 274 hp := network.NewHiveParams() 275 hp.Discovery = false 276 config := &network.BzzConfig{ 277 OverlayAddr: addr.Over(), 278 UnderlayAddr: addr.Under(), 279 HiveParams: hp, 280 } 281 return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil 282 }, 283 } 284 } 285 286 //从swarm/network/protocol\u test\u go复制 287 type testStore struct { 288 sync.Mutex 289 290 values map[string][]byte 291 } 292 293 func (t *testStore) Load(key string) ([]byte, error) { 294 return nil, nil 295 } 296 297 func (t *testStore) Save(key string, v []byte) error { 298 return nil 299 } 300