github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/les/peer.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:39</date> 10 //</624450095709949952> 11 12 13 //包les实现轻以太坊子协议。 14 package les 15 16 import ( 17 "errors" 18 "fmt" 19 "math/big" 20 "sync" 21 "time" 22 23 "github.com/ethereum/go-ethereum/common" 24 "github.com/ethereum/go-ethereum/core/types" 25 "github.com/ethereum/go-ethereum/eth" 26 "github.com/ethereum/go-ethereum/les/flowcontrol" 27 "github.com/ethereum/go-ethereum/light" 28 "github.com/ethereum/go-ethereum/p2p" 29 "github.com/ethereum/go-ethereum/rlp" 30 ) 31 32 var ( 33 errClosed = errors.New("peer set is closed") 34 errAlreadyRegistered = errors.New("peer is already registered") 35 errNotRegistered = errors.New("peer is not registered") 36 errInvalidHelpTrieReq = errors.New("invalid help trie request") 37 ) 38 39 const maxResponseErrors = 50 //number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) 40 41 const ( 42 announceTypeNone = iota 43 announceTypeSimple 44 announceTypeSigned 45 ) 46 47 type peer struct { 48 *p2p.Peer 49 50 rw p2p.MsgReadWriter 51 52 version int //协议版本协商 53 network uint64 //正在打开网络ID 54 55 announceType, requestAnnounceType uint64 56 57 id string 58 59 headInfo *announceData 60 lock sync.RWMutex 61 62 announceChn chan announceData 63 sendQueue *execQueue 64 65 poolEntry *poolEntry 66 hasBlock func(common.Hash, uint64, bool) bool 67 responseErrors int 68 69 fcClient *flowcontrol.ClientNode //如果对等端仅为服务器,则为零 70 fcServer *flowcontrol.ServerNode //如果对等端仅为客户端,则为零 71 fcServerParams *flowcontrol.ServerParams 72 fcCosts requestCostTable 73 } 74 75 func newPeer(version int, network uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { 76 id := p.ID() 77 78 return &peer{ 79 Peer: p, 80 rw: rw, 81 version: version, 82 network: network, 83 id: fmt.Sprintf("%x", id[:8]), 84 announceChn: make(chan announceData, 20), 85 } 86 } 87 88 func (p *peer) canQueue() bool { 89 return p.sendQueue.canQueue() 90 } 91 92 func (p *peer) queueSend(f func()) { 93 p.sendQueue.queue(f) 94 } 95 96 //INFO收集并返回有关对等机的已知元数据集合。 97 func (p *peer) Info() *eth.PeerInfo { 98 return ð.PeerInfo{ 99 Version: p.version, 100 Difficulty: p.Td(), 101 Head: fmt.Sprintf("%x", p.Head()), 102 } 103 } 104 105 //Head retrieves a copy of the current head (most recent) hash of the peer. 106 func (p *peer) Head() (hash common.Hash) { 107 p.lock.RLock() 108 defer p.lock.RUnlock() 109 110 copy(hash[:], p.headInfo.Hash[:]) 111 return hash 112 } 113 114 func (p *peer) HeadAndTd() (hash common.Hash, td *big.Int) { 115 p.lock.RLock() 116 defer p.lock.RUnlock() 117 118 copy(hash[:], p.headInfo.Hash[:]) 119 return hash, p.headInfo.Td 120 } 121 122 func (p *peer) headBlockInfo() blockInfo { 123 p.lock.RLock() 124 defer p.lock.RUnlock() 125 126 return blockInfo{Hash: p.headInfo.Hash, Number: p.headInfo.Number, Td: p.headInfo.Td} 127 } 128 129 //td检索对等机的当前总难度。 130 func (p *peer) Td() *big.Int { 131 p.lock.RLock() 132 defer p.lock.RUnlock() 133 134 return new(big.Int).Set(p.headInfo.Td) 135 } 136 137 //waitbefore实现distpeer接口 138 func (p *peer) waitBefore(maxCost uint64) (time.Duration, float64) { 139 return p.fcServer.CanSend(maxCost) 140 } 141 142 func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) error { 143 type req struct { 144 ReqID uint64 145 Data interface{} 146 } 147 return p2p.Send(w, msgcode, req{reqID, data}) 148 } 149 150 func sendResponse(w p2p.MsgWriter, msgcode, reqID, bv uint64, data interface{}) error { 151 type resp struct { 152 ReqID, BV uint64 153 Data interface{} 154 } 155 return p2p.Send(w, msgcode, resp{reqID, bv, data}) 156 } 157 158 func (p *peer) GetRequestCost(msgcode uint64, amount int) uint64 { 159 p.lock.RLock() 160 defer p.lock.RUnlock() 161 162 cost := p.fcCosts[msgcode].baseCost + p.fcCosts[msgcode].reqCost*uint64(amount) 163 if cost > p.fcServerParams.BufLimit { 164 cost = p.fcServerParams.BufLimit 165 } 166 return cost 167 } 168 169 //has block检查对等端是否具有给定的块 170 func (p *peer) HasBlock(hash common.Hash, number uint64, hasState bool) bool { 171 p.lock.RLock() 172 hasBlock := p.hasBlock 173 p.lock.RUnlock() 174 return hasBlock != nil && hasBlock(hash, number, hasState) 175 } 176 177 //sendAnnounce通过 178 //哈希通知。 179 func (p *peer) SendAnnounce(request announceData) error { 180 return p2p.Send(p.rw, AnnounceMsg, request) 181 } 182 183 //sendblockheaders向远程对等端发送一批块头。 184 func (p *peer) SendBlockHeaders(reqID, bv uint64, headers []*types.Header) error { 185 return sendResponse(p.rw, BlockHeadersMsg, reqID, bv, headers) 186 } 187 188 //sendblockbodiesrlp从发送一批块内容到远程对等机 189 //已经用rlp编码的格式。 190 func (p *peer) SendBlockBodiesRLP(reqID, bv uint64, bodies []rlp.RawValue) error { 191 return sendResponse(p.rw, BlockBodiesMsg, reqID, bv, bodies) 192 } 193 194 //sendcoderlp发送一批任意内部数据,与 195 //已请求哈希。 196 func (p *peer) SendCode(reqID, bv uint64, data [][]byte) error { 197 return sendResponse(p.rw, CodeMsg, reqID, bv, data) 198 } 199 200 //sendReceiptsRLP发送一批交易凭证,与 201 //从已经RLP编码的格式请求的。 202 func (p *peer) SendReceiptsRLP(reqID, bv uint64, receipts []rlp.RawValue) error { 203 return sendResponse(p.rw, ReceiptsMsg, reqID, bv, receipts) 204 } 205 206 //sendproofs发送一批遗留的les/1 merkle proofs,与请求的对应。 207 func (p *peer) SendProofs(reqID, bv uint64, proofs proofsData) error { 208 return sendResponse(p.rw, ProofsV1Msg, reqID, bv, proofs) 209 } 210 211 //SendProofsV2 sends a batch of merkle proofs, corresponding to the ones requested. 212 func (p *peer) SendProofsV2(reqID, bv uint64, proofs light.NodeList) error { 213 return sendResponse(p.rw, ProofsV2Msg, reqID, bv, proofs) 214 } 215 216 //sendHeaderTops发送一批与请求的LES/1标题校对相对应的旧LES/1标题校对。 217 func (p *peer) SendHeaderProofs(reqID, bv uint64, proofs []ChtResp) error { 218 return sendResponse(p.rw, HeaderProofsMsg, reqID, bv, proofs) 219 } 220 221 //sendHelperTrieProofs发送一批与请求的对应的HelperTrie Proofs。 222 func (p *peer) SendHelperTrieProofs(reqID, bv uint64, resp HelperTrieResps) error { 223 return sendResponse(p.rw, HelperTrieProofsMsg, reqID, bv, resp) 224 } 225 226 //sendtxstatus发送一批与请求的事务状态记录相对应的事务状态记录。 227 func (p *peer) SendTxStatus(reqID, bv uint64, stats []txStatus) error { 228 return sendResponse(p.rw, TxStatusMsg, reqID, bv, stats) 229 } 230 231 //RequestHeadersByHash获取与 232 //基于源块哈希的指定头查询。 233 func (p *peer) RequestHeadersByHash(reqID, cost uint64, origin common.Hash, amount int, skip int, reverse bool) error { 234 p.Log().Debug("Fetching batch of headers", "count", amount, "fromhash", origin, "skip", skip, "reverse", reverse) 235 return sendRequest(p.rw, GetBlockHeadersMsg, reqID, cost, &getBlockHeadersData{Origin: hashOrNumber{Hash: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}) 236 } 237 238 //RequestHeadersByNumber获取与 239 //指定的头查询,基于源块的编号。 240 func (p *peer) RequestHeadersByNumber(reqID, cost, origin uint64, amount int, skip int, reverse bool) error { 241 p.Log().Debug("Fetching batch of headers", "count", amount, "fromnum", origin, "skip", skip, "reverse", reverse) 242 return sendRequest(p.rw, GetBlockHeadersMsg, reqID, cost, &getBlockHeadersData{Origin: hashOrNumber{Number: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse}) 243 } 244 245 //请求主体获取一批与哈希对应的块的主体 246 //明确规定。 247 func (p *peer) RequestBodies(reqID, cost uint64, hashes []common.Hash) error { 248 p.Log().Debug("Fetching batch of block bodies", "count", len(hashes)) 249 return sendRequest(p.rw, GetBlockBodiesMsg, reqID, cost, hashes) 250 } 251 252 //请求代码从节点的已知状态获取一批任意数据 253 //与指定哈希对应的数据。 254 func (p *peer) RequestCode(reqID, cost uint64, reqs []CodeReq) error { 255 p.Log().Debug("Fetching batch of codes", "count", len(reqs)) 256 return sendRequest(p.rw, GetCodeMsg, reqID, cost, reqs) 257 } 258 259 //RequestReceipts从远程节点获取一批事务收据。 260 func (p *peer) RequestReceipts(reqID, cost uint64, hashes []common.Hash) error { 261 p.Log().Debug("Fetching batch of receipts", "count", len(hashes)) 262 return sendRequest(p.rw, GetReceiptsMsg, reqID, cost, hashes) 263 } 264 265 //RequestProof从远程节点获取一批Merkle Proof。 266 func (p *peer) RequestProofs(reqID, cost uint64, reqs []ProofReq) error { 267 p.Log().Debug("Fetching batch of proofs", "count", len(reqs)) 268 switch p.version { 269 case lpv1: 270 return sendRequest(p.rw, GetProofsV1Msg, reqID, cost, reqs) 271 case lpv2: 272 return sendRequest(p.rw, GetProofsV2Msg, reqID, cost, reqs) 273 default: 274 panic(nil) 275 } 276 } 277 278 //RequestHelperTreeProofs从远程节点获取一批HelperTreeMerkle Proofs。 279 func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, data interface{}) error { 280 switch p.version { 281 case lpv1: 282 reqs, ok := data.([]ChtReq) 283 if !ok { 284 return errInvalidHelpTrieReq 285 } 286 p.Log().Debug("Fetching batch of header proofs", "count", len(reqs)) 287 return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqs) 288 case lpv2: 289 reqs, ok := data.([]HelperTrieReq) 290 if !ok { 291 return errInvalidHelpTrieReq 292 } 293 p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) 294 return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) 295 default: 296 panic(nil) 297 } 298 } 299 300 //RequestTxStatus从远程节点获取一批事务状态记录。 301 func (p *peer) RequestTxStatus(reqID, cost uint64, txHashes []common.Hash) error { 302 p.Log().Debug("Requesting transaction status", "count", len(txHashes)) 303 return sendRequest(p.rw, GetTxStatusMsg, reqID, cost, txHashes) 304 } 305 306 //SendTxStatus sends a batch of transactions to be added to the remote transaction pool. 307 func (p *peer) SendTxs(reqID, cost uint64, txs types.Transactions) error { 308 p.Log().Debug("Fetching batch of transactions", "count", len(txs)) 309 switch p.version { 310 case lpv1: 311 return p2p.Send(p.rw, SendTxMsg, txs) //旧消息格式不包括reqid 312 case lpv2: 313 return sendRequest(p.rw, SendTxV2Msg, reqID, cost, txs) 314 default: 315 panic(nil) 316 } 317 } 318 319 type keyValueEntry struct { 320 Key string 321 Value rlp.RawValue 322 } 323 type keyValueList []keyValueEntry 324 type keyValueMap map[string]rlp.RawValue 325 326 func (l keyValueList) add(key string, val interface{}) keyValueList { 327 var entry keyValueEntry 328 entry.Key = key 329 if val == nil { 330 val = uint64(0) 331 } 332 enc, err := rlp.EncodeToBytes(val) 333 if err == nil { 334 entry.Value = enc 335 } 336 return append(l, entry) 337 } 338 339 func (l keyValueList) decode() keyValueMap { 340 m := make(keyValueMap) 341 for _, entry := range l { 342 m[entry.Key] = entry.Value 343 } 344 return m 345 } 346 347 func (m keyValueMap) get(key string, val interface{}) error { 348 enc, ok := m[key] 349 if !ok { 350 return errResp(ErrMissingKey, "%s", key) 351 } 352 if val == nil { 353 return nil 354 } 355 return rlp.DecodeBytes(enc, val) 356 } 357 358 func (p *peer) sendReceiveHandshake(sendList keyValueList) (keyValueList, error) { 359 //在新线程中发送自己的握手 360 errc := make(chan error, 1) 361 go func() { 362 errc <- p2p.Send(p.rw, StatusMsg, sendList) 363 }() 364 //同时检索远程状态消息 365 msg, err := p.rw.ReadMsg() 366 if err != nil { 367 return nil, err 368 } 369 if msg.Code != StatusMsg { 370 return nil, errResp(ErrNoStatusMsg, "first msg has code %x (!= %x)", msg.Code, StatusMsg) 371 } 372 if msg.Size > ProtocolMaxMsgSize { 373 return nil, errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) 374 } 375 //解码握手 376 var recvList keyValueList 377 if err := msg.Decode(&recvList); err != nil { 378 return nil, errResp(ErrDecode, "msg %v: %v", msg, err) 379 } 380 if err := <-errc; err != nil { 381 return nil, err 382 } 383 return recvList, nil 384 } 385 386 //握手执行LES协议握手,协商版本号, 387 //网络ID,困难,头和创世块。 388 func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis common.Hash, server *LesServer) error { 389 p.lock.Lock() 390 defer p.lock.Unlock() 391 392 var send keyValueList 393 send = send.add("protocolVersion", uint64(p.version)) 394 send = send.add("networkId", p.network) 395 send = send.add("headTd", td) 396 send = send.add("headHash", head) 397 send = send.add("headNum", headNum) 398 send = send.add("genesisHash", genesis) 399 if server != nil { 400 send = send.add("serveHeaders", nil) 401 send = send.add("serveChainSince", uint64(0)) 402 send = send.add("serveStateSince", uint64(0)) 403 send = send.add("txRelay", nil) 404 send = send.add("flowControl/BL", server.defParams.BufLimit) 405 send = send.add("flowControl/MRR", server.defParams.MinRecharge) 406 list := server.fcCostStats.getCurrentList() 407 send = send.add("flowControl/MRC", list) 408 p.fcCosts = list.decode() 409 } else { 410 p.requestAnnounceType = announceTypeSimple //设置为默认值,直到实现“非常轻”的客户机模式 411 send = send.add("announceType", p.requestAnnounceType) 412 } 413 recvList, err := p.sendReceiveHandshake(send) 414 if err != nil { 415 return err 416 } 417 recv := recvList.decode() 418 419 var rGenesis, rHash common.Hash 420 var rVersion, rNetwork, rNum uint64 421 var rTd *big.Int 422 423 if err := recv.get("protocolVersion", &rVersion); err != nil { 424 return err 425 } 426 if err := recv.get("networkId", &rNetwork); err != nil { 427 return err 428 } 429 if err := recv.get("headTd", &rTd); err != nil { 430 return err 431 } 432 if err := recv.get("headHash", &rHash); err != nil { 433 return err 434 } 435 if err := recv.get("headNum", &rNum); err != nil { 436 return err 437 } 438 if err := recv.get("genesisHash", &rGenesis); err != nil { 439 return err 440 } 441 442 if rGenesis != genesis { 443 return errResp(ErrGenesisBlockMismatch, "%x (!= %x)", rGenesis[:8], genesis[:8]) 444 } 445 if rNetwork != p.network { 446 return errResp(ErrNetworkIdMismatch, "%d (!= %d)", rNetwork, p.network) 447 } 448 if int(rVersion) != p.version { 449 return errResp(ErrProtocolVersionMismatch, "%d (!= %d)", rVersion, p.version) 450 } 451 if server != nil { 452 //在我们拥有适当的对等连接API之前,允许LES连接到其他服务器 453 /*f recv.get(“servstatesince”,nil)==nil 454 返回errrresp(erruselesspeer,“需要的客户机,得到的服务器”) 455 */ 456 457 if recv.get("announceType", &p.announceType) != nil { 458 p.announceType = announceTypeSimple 459 } 460 p.fcClient = flowcontrol.NewClientNode(server.fcManager, server.defParams) 461 } else { 462 if recv.get("serveChainSince", nil) != nil { 463 return errResp(ErrUselessPeer, "peer cannot serve chain") 464 } 465 if recv.get("serveStateSince", nil) != nil { 466 return errResp(ErrUselessPeer, "peer cannot serve state") 467 } 468 if recv.get("txRelay", nil) != nil { 469 return errResp(ErrUselessPeer, "peer cannot relay transactions") 470 } 471 params := &flowcontrol.ServerParams{} 472 if err := recv.get("flowControl/BL", ¶ms.BufLimit); err != nil { 473 return err 474 } 475 if err := recv.get("flowControl/MRR", ¶ms.MinRecharge); err != nil { 476 return err 477 } 478 var MRC RequestCostList 479 if err := recv.get("flowControl/MRC", &MRC); err != nil { 480 return err 481 } 482 p.fcServerParams = params 483 p.fcServer = flowcontrol.NewServerNode(params) 484 p.fcCosts = MRC.decode() 485 } 486 487 p.headInfo = &announceData{Td: rTd, Hash: rHash, Number: rNum} 488 return nil 489 } 490 491 //字符串实现fmt.stringer。 492 func (p *peer) String() string { 493 return fmt.Sprintf("Peer %s [%s]", p.id, 494 fmt.Sprintf("les/%d", p.version), 495 ) 496 } 497 498 //peersetnotify是一个回调接口,用于通知服务有关添加或 499 //移除的对等体 500 type peerSetNotify interface { 501 registerPeer(*peer) 502 unregisterPeer(*peer) 503 } 504 505 //Peerset表示当前参与的活动对等机的集合 506 //光以太坊子协议。 507 type peerSet struct { 508 peers map[string]*peer 509 lock sync.RWMutex 510 notifyList []peerSetNotify 511 closed bool 512 } 513 514 //new peer set创建一个新的对等集来跟踪活动参与者。 515 func newPeerSet() *peerSet { 516 return &peerSet{ 517 peers: make(map[string]*peer), 518 } 519 } 520 521 //notify添加要通知的有关添加或删除对等点的服务 522 func (ps *peerSet) notify(n peerSetNotify) { 523 ps.lock.Lock() 524 ps.notifyList = append(ps.notifyList, n) 525 peers := make([]*peer, 0, len(ps.peers)) 526 for _, p := range ps.peers { 527 peers = append(peers, p) 528 } 529 ps.lock.Unlock() 530 531 for _, p := range peers { 532 n.registerPeer(p) 533 } 534 } 535 536 //寄存器向工作集中注入一个新的对等点,或者返回一个错误,如果 537 //对等机已经知道。 538 func (ps *peerSet) Register(p *peer) error { 539 ps.lock.Lock() 540 if ps.closed { 541 ps.lock.Unlock() 542 return errClosed 543 } 544 if _, ok := ps.peers[p.id]; ok { 545 ps.lock.Unlock() 546 return errAlreadyRegistered 547 } 548 ps.peers[p.id] = p 549 p.sendQueue = newExecQueue(100) 550 peers := make([]peerSetNotify, len(ps.notifyList)) 551 copy(peers, ps.notifyList) 552 ps.lock.Unlock() 553 554 for _, n := range peers { 555 n.registerPeer(p) 556 } 557 return nil 558 } 559 560 //注销从活动集删除远程对等,进一步禁用 561 //对该特定实体采取的行动。它还会在网络层启动断开连接。 562 func (ps *peerSet) Unregister(id string) error { 563 ps.lock.Lock() 564 if p, ok := ps.peers[id]; !ok { 565 ps.lock.Unlock() 566 return errNotRegistered 567 } else { 568 delete(ps.peers, id) 569 peers := make([]peerSetNotify, len(ps.notifyList)) 570 copy(peers, ps.notifyList) 571 ps.lock.Unlock() 572 573 for _, n := range peers { 574 n.unregisterPeer(p) 575 } 576 p.sendQueue.quit() 577 p.Peer.Disconnect(p2p.DiscUselessPeer) 578 return nil 579 } 580 } 581 582 //AllPeerIDs returns a list of all registered peer IDs 583 func (ps *peerSet) AllPeerIDs() []string { 584 ps.lock.RLock() 585 defer ps.lock.RUnlock() 586 587 res := make([]string, len(ps.peers)) 588 idx := 0 589 for id := range ps.peers { 590 res[idx] = id 591 idx++ 592 } 593 return res 594 } 595 596 //对等端检索具有给定ID的注册对等端。 597 func (ps *peerSet) Peer(id string) *peer { 598 ps.lock.RLock() 599 defer ps.lock.RUnlock() 600 601 return ps.peers[id] 602 } 603 604 //len返回集合中当前的对等数。 605 func (ps *peerSet) Len() int { 606 ps.lock.RLock() 607 defer ps.lock.RUnlock() 608 609 return len(ps.peers) 610 } 611 612 //BestPeer以当前最高的总难度检索已知的对等。 613 func (ps *peerSet) BestPeer() *peer { 614 ps.lock.RLock() 615 defer ps.lock.RUnlock() 616 617 var ( 618 bestPeer *peer 619 bestTd *big.Int 620 ) 621 for _, p := range ps.peers { 622 if td := p.Td(); bestPeer == nil || td.Cmp(bestTd) > 0 { 623 bestPeer, bestTd = p, td 624 } 625 } 626 return bestPeer 627 } 628 629 //all peers返回列表中的所有对等方 630 func (ps *peerSet) AllPeers() []*peer { 631 ps.lock.RLock() 632 defer ps.lock.RUnlock() 633 634 list := make([]*peer, len(ps.peers)) 635 i := 0 636 for _, peer := range ps.peers { 637 list[i] = peer 638 i++ 639 } 640 return list 641 } 642 643 //关闭将断开所有对等机的连接。 644 //关闭后不能注册新的对等方。 645 func (ps *peerSet) Close() { 646 ps.lock.Lock() 647 defer ps.lock.Unlock() 648 649 for _, p := range ps.peers { 650 p.Disconnect(p2p.DiscQuitting) 651 } 652 ps.closed = true 653 } 654