术语表 /节点与软件
P2P 消息
又称消息、点对点消息。
- P2P 消息是什么?
- P2P 消息是比特币节点之间相互通信所用的固定词汇:version、inv、getdata、tx 和 block 等简短命令,通过普通的 TCP 连接发送。
网络中没有可供调用的中央服务器,因此节点与网络的全部关系就是这场对话。Bitcoin Core 通告的协议版本为70016,在端口8333上建立连接,整套词汇一页即可写完。您的提币之所以能送达矿工,是因为一台机器向另一台机器发送了 tx,并在几秒内被转发了几千次。
运作方式
每个连接都以握手开始,随后进入一小组反复出现的交换。
任何一方发出的第一条消息都是 version,其中包含它所使用的协议号、服务标志、当前时间、它认为对端所拥有的地址、用于检测是否意外连接到自身的随机数(nonce)、用户代理字符串,以及它所知最佳链的高度。双方各自回复 verack。在双方都完成之前,不会处理任何其他消息。
这个协议号并非装饰,而是按功能逐级递进的阶梯。直接通告区块头需要70012,协商紧凑区块需要70014,在完整验证之前通告紧凑区块需要70015,按见证标识符转发交易需要70016。节点读取对端的协议号后,会悄然不再提供对端无法使用的功能,网络正是这样在无需协调切换的情况下完成升级的。
按用途分组,这套词汇很短。寻找对等节点:getaddr、addr,以及来自 BIP155 的 addrv2 格式,它可以携带 Tor 和 I2P 地址。通告:inv 和 headers。请求:getheaders、getdata、getblocks、mempool。传送:tx、block、cmpctblock、blocktxn、notfound。日常维护:ping、pong、sendheaders、sendcmpct、wtxidrelay 和 feefilter,其中最后一项用于告知对端,不必转发低于所述费率的交易。
有两处沉默是刻意设计的。无法识别的命令会被忽略而不是被拒绝,这使新的消息类型得以在一个无人能一次性升级的网络中逐步推出。此外,对端无法告诉您它为何丢弃了您的交易:BIP61 的 reject 消息在 Bitcoin Core 0.18.0中已默认禁用,该选项在0.20.0中被彻底移除,原因是这些回复不可靠、极易伪造,并且常被误当作权威结论。
在哪里会遇到它
P2P 消息是您自己的节点整天都在做的事,而且很容易观察。
使用 -debug=net 启动 Bitcoin Core,日志会在每条消息到达时写出它的名称。getpeerinfo 调用会针对每个连接报告按消息类型细分的已发送和已接收字节数,这是发现某一个对等节点几乎提供了您全部数据、而其余节点闲置的最快方法。从指向您自己节点的钱包广播一笔付款,会产生一段容易辨认的小序列:发出一条 inv,收到一条 getdata,再发出一条 tx 作为回应。
P2P 消息 vs RPC
比特币有两种接口,二者不可互换。P2P 是节点对节点:无需认证,除非双方协商使用 v2 传输否则不加密,使用端口8333,其词汇没有任何单一参与者可以扩展。RPC 是程序对节点:需要认证,默认仅限本地,使用端口8332,其方法列表每个版本都会变化。您创建的一笔付款会经过这两者:它以 RPC 调用的形式进入您的节点,再以 P2P 消息的形式离开,而只有后半段才与他人有关。