术语表 /协议与升级
紧凑区块中继
又称 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 会输出一条重建摘要,列出预先附带的交易数、来自内存池的交易数、来自额外交易池的交易数,以及不得不请求的交易数。在已运行数小时的机器上,请求的交易数通常为零或接近零。在十分钟前才启动的机器上,内存池几乎是空的,几乎所有内容都要另行获取,最初的几个区块到达得很慢。
由此可得出一条实用规则,适用于运行节点以核对自己余额、而不是信任某个网站的人:让节点保持运行。在您需要之前刚刚重启的节点,就是一个正在下载完整区块的节点,在内存池重新充实之前,它看到的链顶会落后于公共区块浏览器。