跳转到正文
buybitcoinsmart

术语表 /协议与升级

紧凑区块中继

又称 BIP152。

紧凑区块中继是什么?
紧凑区块中继在网络上用一份六字节标识符列表取代新区块,接收节点将这些标识符与自己已持有的交易进行匹配,并在本地重新组装区块。

规定于 BIP-152。

两个都在监视内存池的节点,已经共享了下一个区块中几乎所有的交易,因此再发送一次纯属浪费。Matt Corallo 将这一改进规范为 BIP152,Bitcoin Core 在0.13.0版本中启用了它,该版本于2016年8月23日发布。对于在家运行节点的人来说,它决定了带宽开销是可以承受还是难以承受。

运作方式

紧凑区块中继为协议增加了四种消息,其中最关键的是 cmpctblock,它描述一个区块,却不包含该区块本身。

cmpctblock 携带80字节的区块头、由发送方选定的8字节随机数(nonce),之后是区块中每笔交易对应的一个六字节短标识符。这些标识符由 SipHash-2-4生成,其密钥取自区块头与该随机数拼接后的 SHA-256哈希。随机数使这一方案得以保证安全:每个区块、每个发送方的标识符都各不相同,因此没有人能够预先准备两笔标识符相互冲突的交易,从而在整个网络中同时阻碍区块重建。

有些交易以完整形式传输,而不是以标识符传输。coinbase 交易始终如此,因为没有任何节点能事先见到它;发送方也可以预先附带任何它认为接收方不会持有的其他交易。

重建在接收方完成。节点用同一密钥对自己内存池中的每笔交易计算哈希,查找每个短标识符,并补全区块。节点还会保留一个小型的额外交易池,存放近期被逐出和被替换的交易,用来找回片刻之前刚从内存池中掉出的那些交易。仍然缺失的交易,通过 getblocktxn 按位置请求,发送方只在 blocktxn 消息中返回这些交易。

有两种情况会迫使节点退回到获取整个区块:缺失的交易过多,不值得再往返一次;或者两笔不同的交易生成了相同的六字节标识符。六字节可表示281万亿个值,因此偶然碰撞极其罕见,而蓄意制造的碰撞正是随机数所排除的。

区块通告有两种方式。在低带宽模式下,节点通告新区块后等待对方来请求。在高带宽模式下(节点最多对三个对等节点启用),区块一到达就立即推送 cmpctblock,在对传播速度最为关键的路径上省去一次往返。

在哪里会遇到它

紧凑区块中继会体现在您自己节点的日志中,每个区块一行,阅读日志是判断节点是否运行正常的最快方法。

Bitcoin Core 会输出一条重建摘要,列出预先附带的交易数、来自内存池的交易数、来自额外交易池的交易数,以及不得不请求的交易数。在已运行数小时的机器上,请求的交易数通常为零或接近零。在十分钟前才启动的机器上,内存池几乎是空的,几乎所有内容都要另行获取,最初的几个区块到达得很慢。

由此可得出一条实用规则,适用于运行节点以核对自己余额、而不是信任某个网站的人:让节点保持运行。在您需要之前刚刚重启的节点,就是一个正在下载完整区块的节点,在内存池重新充实之前,它看到的链顶会落后于公共区块浏览器。

请勿混淆

常见问题

紧凑区块中继会改变什么样的区块才算有效吗?

不会。它只改变字节在节点之间的传输方式。接收节点依据同样的共识规则,对重新组装的区块从头验证,因此以紧凑形式到达的区块,与完整下载的区块受到同样严格的检查。

为什么我的节点在重启后会下载完整区块?

因为重建需要内存池中已有交易。刚启动的节点几乎没有可用来匹配短标识符的内容,因此必须请求每个区块的大部分内容。随着内存池重新充实,这种情况会在大约一小时内自行恢复。

相关术语

协议与升级中的更多术语

阅读本页英文版