# 对等节点结构

对等节点信息用 `CNode` 类来表示，重要的字段有下面一些。

* nServices

  节点支持的服务，接收 `version` 消息时，设置的。当前支持的服务有：

  * NODE\_NETWORK

    节点可以提供完整的区块而不仅仅是区块头。所有没有进行修剪的比特币核心客户端都是这个值，SPV客户端和其他轻量级客户端不设置这个值。
  * NODE\_GETUTXO

    节点支持 `getutxo` 协议请求，比特币核心客户端不支持这个，但 Bitcoin XT 补丁支持这个。详见 BIP 0064。
  * NODE\_BLOOM

    节点有能力并且愿意支持布隆过滤器，比特币核心默认支持此功能而不用公告这个位。详见 BIP 0111。
  * NODE\_WITNESS

    节点可以响应包含隔离见证的区块和交易请求。详见 BIP 0144。
  * NODE\_XTHIN

    节点支持 Xtreme Thinblocks。
  * NODE\_NETWORK\_LIMITED

    基本等于 `NODE_NETWORK`，除了只提供 288 个区块，即2天内的区块。
* hSocket
* nSendSize
* nSendOffset
* nSendBytes
* vSendMsg
* vProcessMsg
* nProcessQueueSize
* vRecvGetData

  接收到的请求数据队列，接收 `getdata` 消息时，设置的。
* nRecvBytes
* nRecvVersion

  版本信息，服务器发送的版本与 70015 这个版本的小者，接收 `verack` 消息时，设置的。
* nLastSend
* nLastRecv
* nTimeConnected
* nTimeOffset
* addr

  对待节点的地址对象，类型为 `CAddress`。
* addrBind
* nVersion

  客户端发送的版本，接收 `version` 消息时，设置的。
* fWhitelisted

  布尔型，节点是否为白名单节点
* fFeeler

  布尔型，节点是否为临时的引导节点
* fOneShot
* m\_manual\_connection

  布尔型，节点是否为手工指定连接的
* fClient

  布尔型，节点是否可以提供区块服务。如果节点没有设置 `NODE_NETWORK`、或 `NODE_NETWORK_LIMITED` ，这个值为假，即不能提供区块服务。如果设置其中一个，这个值就为真，即可以提供区块服务。
* m\_limited\_node

  布尔型，节点是否为限制型节点。节点设置了 `NODE_NETWORK_LIMITED`，但没有设置 `NODE_NETWORK`，这值就为真。
* fInbound

  布尔型，节点是否为入站节点
* fSuccessfullyConnected

  布尔型，对等节点完全连接成功。只有在收到版本确认时，才会设置这个标志。
* fDisconnect

  布尔型，节点是否已经断开
* fRelayTxes

  布尔型，是否中继交易，接收 `version` 消息时，设置的。
* fSentAddr

  是否发送过请求地址标志。
* grantOutbound
* pfilter

  类型为 CBloomFilter 的智能指针，在接收 `filterload` 消息时设置。
* nRefCount
* nKeyedNetGroup
* fPauseRecv
* fPauseSend
* mapSendBytesPerMsgCmd
* mapRecvBytesPerMsgCmd
* hashContinue
* nStartingHeight

  节点最后一个区块的高度，也即节点开始接收区块的高度，接收 `version` 消息时，设置的。
* vAddrToSend

  等待发送的地址，自身要发送的地址也放在这个集合中。
* addrKnown

  已知的地址集合，类型为 `CRollingBloomFilter` 。
* fGetAddr

  布尔型，是否向这个节点请求过地址。
* setKnown
* nNextAddrSend
* nNextLocalAddrSend
* filterInventoryKnown
* setInventoryTxToSend
* vInventoryBlockToSend
* setAskFor
* mapAskFor
* nNextInvSend
* vBlockHashesToAnnounce

  使用区块头部进行区块公告的集合
* fSendMempool
* timeLastMempoolReq
* nLastBlockTime
* nLastTXTime
* nPingNonceSent

  无符号 64 位，期待的 pong 中继，如果是 0，就是非期待的。
* nPingUsecStart
* nPingUsecTime
* nMinPingUsecTime
* fPingQueued
* minFeeFilter
* lastSentFeeFilter
* nextSendTimeFeeFilter
* nLocalHostNonce

  在进行 `version` 时，生成的随机值。
* nLocalServices
* nMyStartingHeight
* nSendVersion

  版本信息，客户端发送的版本与 70015 这个版本的小者，接收 `version` 消息时，设置的。
* vRecvMsg
* addrName
* addrLocal

  对等节点的地址，接收 `version` 消息时，设置的。
* hashContinue
* nLastTXTime

  最后一次收到交易的时间
* nLastBlockTime

  最后一次收到区块的时间
