术语表 /节点与软件
主动推送区块
- 主动推送区块是什么?
- 主动推送区块是指对等节点向您发送一个您从未请求过的区块,跳过通常的“公告后再请求”握手流程,以便为时间紧迫的数据省去一次往返。
在大多数协议中,未经邀请的推送是失礼的,而在这个协议中却是正当的。区块在传输途中每多花一次往返,就意味着某个矿工多花一段时间在已不存在的链尖上挖矿,因此 BIP152 将这条捷径正式化:至多三个选定的对等节点可以在拿到区块的那一刻就把它推送给您。您的节点无论如何都会从头开始验证该区块,对发送方没有任何亏欠。
运作方式
“主动推送区块”这一名称下流传着两种不同的东西,一种古老而非正式,另一种有明确规范。
旧形式只是一条没有对应 getdata 的 block 消息直接到达。协议从未禁止这种做法,接收方也一直会处理此类区块,只是附带条件。Bitcoin Core 会先检查区块头中的工作量证明,再做任何耗费资源的工作;在区块完整验证并连接到最佳链之前,不会将其继续转发;对于无法连接到任何已知区块的区块,则视为应丢弃的对象,而不是需要解开的谜题。这些规则之所以存在,是因为主动发来的数据对发送方没有成本,对接收方却代价高昂,而这正是协议中一切拒绝服务攻击的基本形态。
规范化的形式是 BIP152 的高带宽模式。节点向其对等节点发送一条 sendcmpct 消息,其第一个字节为1,含义是:不要公告,直接发送。此后该对等节点一得知新区块,就可以立即发送 cmpctblock,甚至可能在它自己尚未完成验证之前。BIP152 对这类对等节点设定了三个的硬性上限,Bitcoin Core 严格执行这一上限,保留一份至多三个节点的名单,入选依据是最先交付近期区块。三个是一种折中:冗余足以让某一个较慢的对等节点无法拖住您,数量又少到不会让您的每个连接都收到同一个区块。
由于高带宽模式下的公告可能先于验证,接收节点把它当作一种声明,而不是事实。工作量证明最先检查,因为它是区块中唯一无法低成本伪造的部分,其余内容则走正常流程。协议版本70015的存在,正是为了让节点能够表明:对于公告了后来被发现并未完整检查的区块的对等节点,它不会予以惩罚。
在哪里会遇到它
主动推送集中出现在秒数就是金钱的地方。
矿池之间以及矿池与 FIBRE 等中继网络之间保持着直接连接,这些网络的设计目标是在各大洲之间转发区块,尽可能减少受物理限制的握手次数。在普通机器上,getpeerinfo 调用会为每个对等节点报告两个标志,bip152_hb_to 和 bip152_hb_from,分别显示您请求了哪些对等节点向您推送区块,以及哪些对等节点向您提出了同样的请求。前一个标志出现三次是正常的,三个就是上限。
主动推送区块 vs 标准区块中继
标准区块中继与主动推送的区别,在于由谁决定字节是否传输。在标准中继下由接收方发出请求,因此它自己掌控带宽,并且可以拒绝任何已经持有的内容。在推送下由发送方决定,省去了一次往返,却把影响您资源的杠杆交到了外人手里。比特币的做法不是二选一:允许推送,将其限制在您自己选定的三个对等节点以内,在耗费任何资源之前先验证工作量证明,并且无论区块到达时多么客气,都对其进行完整验证。