跳转到正文
buybitcoinsmart

术语表 /节点与软件

主动推送区块

主动推送区块是什么?
主动推送区块是指对等节点向您发送一个您从未请求过的区块,跳过通常的“公告后再请求”握手流程,以便为时间紧迫的数据省去一次往返。

在大多数协议中,未经邀请的推送是失礼的,而在这个协议中却是正当的。区块在传输途中每多花一次往返,就意味着某个矿工多花一段时间在已不存在的链尖上挖矿,因此 BIP152 将这条捷径正式化:至多三个选定的对等节点可以在拿到区块的那一刻就把它推送给您。您的节点无论如何都会从头开始验证该区块,对发送方没有任何亏欠。

运作方式

“主动推送区块”这一名称下流传着两种不同的东西,一种古老而非正式,另一种有明确规范。

旧形式只是一条没有对应 getdata 的 block 消息直接到达。协议从未禁止这种做法,接收方也一直会处理此类区块,只是附带条件。Bitcoin Core 会先检查区块头中的工作量证明,再做任何耗费资源的工作;在区块完整验证并连接到最佳链之前,不会将其继续转发;对于无法连接到任何已知区块的区块,则视为应丢弃的对象,而不是需要解开的谜题。这些规则之所以存在,是因为主动发来的数据对发送方没有成本,对接收方却代价高昂,而这正是协议中一切拒绝服务攻击的基本形态。

规范化的形式是 BIP152 的高带宽模式。节点向其对等节点发送一条 sendcmpct 消息,其第一个字节为1,含义是:不要公告,直接发送。此后该对等节点一得知新区块,就可以立即发送 cmpctblock,甚至可能在它自己尚未完成验证之前。BIP152 对这类对等节点设定了三个的硬性上限,Bitcoin Core 严格执行这一上限,保留一份至多三个节点的名单,入选依据是最先交付近期区块。三个是一种折中:冗余足以让某一个较慢的对等节点无法拖住您,数量又少到不会让您的每个连接都收到同一个区块。

由于高带宽模式下的公告可能先于验证,接收节点把它当作一种声明,而不是事实。工作量证明最先检查,因为它是区块中唯一无法低成本伪造的部分,其余内容则走正常流程。协议版本70015的存在,正是为了让节点能够表明:对于公告了后来被发现并未完整检查的区块的对等节点,它不会予以惩罚。

在哪里会遇到它

主动推送集中出现在秒数就是金钱的地方。

矿池之间以及矿池与 FIBRE 等中继网络之间保持着直接连接,这些网络的设计目标是在各大洲之间转发区块,尽可能减少受物理限制的握手次数。在普通机器上,getpeerinfo 调用会为每个对等节点报告两个标志,bip152_hb_to 和 bip152_hb_from,分别显示您请求了哪些对等节点向您推送区块,以及哪些对等节点向您提出了同样的请求。前一个标志出现三次是正常的,三个就是上限。

主动推送区块 vs 标准区块中继

标准区块中继与主动推送的区别,在于由谁决定字节是否传输。在标准中继下由接收方发出请求,因此它自己掌控带宽,并且可以拒绝任何已经持有的内容。在推送下由发送方决定,省去了一次往返,却把影响您资源的杠杆交到了外人手里。比特币的做法不是二选一:允许推送,将其限制在您自己选定的三个对等节点以内,在耗费任何资源之前先验证工作量证明,并且无论区块到达时多么客气,都对其进行完整验证。

请勿混淆

常见问题

对等节点能否通过主动推送迫使我的节点接受无效区块?

不能。主动推送的区块与请求得来的区块验证方式完全相同。Bitcoin Core 会先检查区块头的工作量证明,再投入实际运算,在区块通过验证并连接到最佳链之前拒绝转发,并丢弃任何无法连接到任何区块的内容。

最多有多少个对等节点可以向我的节点推送区块?

三个。BIP152 将高带宽模式限制为三个对等节点,Bitcoin Core 执行这一限制,选择最快交付近期区块的对等节点。getpeerinfo 调用通过 bip152_hb_to 和 bip152_hb_from 标志显示这些节点。

相关术语

节点与软件中的更多术语

阅读本页英文版