Compact Blocks 是 BIP 152 定义的 Bitcoin 区块传输方式,通过减少重复数据来节省带宽。它不缩小块本身,也不放宽规则;接收方仍需恢复完整内容,并在接受前完成验证。
安娜想把新块发给彼得,但其中很多交易彼得已经有了。区块把交易组成一批,加入共同历史记录。全部重发,就会重复传输。Compact Blocks 改为发送块头和一份短标识清单,让彼得找到已知交易。块头是区块中较短的一部分,包含基本信息,包括对前一个区块的引用和交易的校验指纹。给技术读者的补充:短标识长 48 比特,也就是 6 字节,由 SipHash-2-4 函数结果截短而来。函数参数根据块头和本次传输额外加入的数字 nonce 派生。因此,短标识不是整个 Bitcoin 网络中永久不变的交易名称。 [1] [2] [7]
清单不能代替所有内容。安娜会完整发送部分交易,并标明它们在块中的位置。常见例子是 Coinbase Transaction,即块中分配挖矿奖励的第一笔交易;它与同名交易所没有关系。这笔交易是为该块专门创建的,彼得的待确认交易集合中通常还没有它。完整交易和短标识在重建时相互配合。 [1] [2]
彼得的 Mempool 是节点已知、但尚未在接受链中确认的本地交易集合。他为已有交易计算相同的短标识,寻找与安娜清单匹配的项目。他并不假定所有人的集合都相同。由于一个短标识偶尔可能对应多笔交易,匹配成功本身还不能最终证明内容正确。 [1] [2]
如果某些位置仍为空白,或者无法确定对应哪笔交易,彼得会按位置请求具体交易。请求消息叫 getblocktxn,携带交易的回复叫 blocktxn。不必记住这些名字;关键是获取真实数据,而不是猜测内容。多一次请求与响应就多一段往返时间。重建失败时,也可以下载完整的块。 [1] [3]
彼得必须按正确顺序恢复准确的交易,并检查它们与块头的关联。Merkle Tree 把交易归纳成一个用于检查的指纹,帮助验证这种关联。但拼装正确不能代替规则检查。Full Node 是彼得用来独立验证 Bitcoin 规则的程序,例如检查是否有权花费资金,以及奖励金额是否符合规定。数字签名利用私钥这个秘密数值证明付款获得授权,同时不泄露私钥。紧凑传输不会给无效块开例外。 [1] [8]
相邻节点用 sendcmpct 商定模式。在快速模式中,携带重建数据的 cmpctblock 消息直接宣布新块。发送方完成规定的前置检查后,可以在所有交易检查结束前开始转发。检查包括与已验证链的连接、作为计算工作证据的 Proof of Work,以及块头对交易的承诺关系。接收方仍须完整验证,才能把块纳入自己的历史。 [1] [4]
另一种模式先用 inv 或 headers 公告一个已经验证的块。彼得需要时才请求紧凑数据。这样可以避免再次收到已从别处获得的块,代价是多一道通信步骤。与重发所有交易相比,两种模式都可能节省数据。区别在于何时发送、是否需要提前请求,而不是采用两套有效性标准。 [1] [7]
两笔不同交易可能有相同的短标识,这称为碰撞。就像两个人有一样的姓名首字母,缩写已经不足以区分他们。软件会根据问题出现的位置,请求补充数据,或改为下载完整块。碰撞并不破解 Bitcoin 的签名,也不会让无效块变成有效块。必须检查真实内容,而不能只看短标识是否一致。 [1] [2]
紧凑协议的版本 2 支持 SegWit。SegWit 把签名及其他验证数据分离到 witness 部分。该版本使用包含这些数据的交易标识 wtxid,而不是不包含它们的 txid。完整交易按照 BIP 144 携带所需的 witness 数据传输,并不是为了让消息看起来更小而丢弃这些数据。此外,传输协议的版本号也不是块本身的版本号。 [1] [6]
如果安娜和彼得已知的交易有很多重合,新块就能以少得多的重复数据完成传输。这也能缓解家庭网络在块突然到达时的负担。重合很少时,额外请求会增加,节省随之减少。主要目标是减少传输数据;更快送达是可能的收益,不是零等待或固定消息大小的保证。Bitcoin 的块大小限制也不会因此改变。 [5] [7]
要获得更完整的理解,请将本词条与以下词条结合阅读: Block Propagation, Initial Block Download, Eclipse Attack, vByte, Bitcoin, Coinbase交易. 反向关联还来自: Stale Block, Eclipse Attack, Selfish Mining, Block Propagation.