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 &eth.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", &params.BufLimit); err != nil {
   473  			return err
   474  		}
   475  		if err := recv.get("flowControl/MRR", &params.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