26 / 736MRKL

Merkle Tree

默克尔树

用一个指纹汇总交易,并在不下载整个区块的情况下验证某笔支付是否被纳入。

Merkle Tree 把数据的密码学指纹逐层合并成一个结果。在比特币中,这个结果就是存放在区块头里的 Merkle root。只需少量额外指纹,就能验证某笔交易是否与该根对应,无须传输其他全部交易。

钱包显示一笔支付已被纳入区块。若不想下载区块的全部内容,该怎样核实?这正是 Merkle Tree 的用途。交易先用哈希表示,也就是简短的密码学指纹,再逐层合并为一个共同指纹:树根。区块头包含这个 Merkle root,从而将区块与其交易联系起来。树根不是能还原所有支付的档案,而是用来验证所提供的数据。 [1] [2]

设想四笔交易 A、B、C、D。取它们的指纹,将 A 和 B 的指纹连接并计算新的哈希 AB;对 C 和 D 做同样处理,得到 CD。最后连接 AB 与 CD 的指纹,再计算树根。这里的字母只是交易和中间结果的标签,并非真实哈希。过程像一棵倒立的树:许多叶子沿分支汇聚成一个根。交易更多时,层数会增加,但原理不变。 [3]

要验证 B,你有它的数据,并计算出它的指纹。接下来只需要 A 的指纹和 CD 的合并指纹,以及正确的排列顺序。用 A 和 B 算出 AB,再用 AB 与 CD 算出树根,与区块头中的根比较。这条补充路径称为 Merkle proof。你不需要知道 A、C、D 的具体内容。在包含 1024 笔交易的平衡树中,路径上有 10 个兄弟哈希。因此,区块变大时,证明的增长速度远慢于完整交易列表。 [2] [3]

证明与根匹配,并不意味着可以盲目信任提供的区块头。还需要验证它的 Proof of Work,也就是挖矿计算的结果是否满足规定的难度,并检查区块头是否连接到相应的链。即使如此,Merkle proof 也不会检查区块中所有交易的全部签名和规则,这由 Full Node 完成。因此,whitepaper 中描述的简化支付验证 SPV,与完整验证有不同的安全假设。此外,链重组可能让区块退出当前分支:其内容仍可证明,但支付在当前历史中的位置可能改变。 [2]

比特币普通交易树的叶子是按区块内交易顺序排列的 txid,第一笔是 Coinbase Transaction,即矿工用来领取区块奖励的特殊交易。成对的值按字节连接,再用 SHA-256 哈希两次。如果某层最后剩下一个没有配对的哈希,就在本次计算中复制它;这不会新增一笔支付。只有一笔交易时,其 txid 本身就是根。复制规则要求实现仔细检查重复项。协议升级 SegWit 还将签名等 witness 数据分开。另一个记录在 Coinbase Transaction 中的密码学指纹将这些数据与区块联系起来,这个指纹称为 witness commitment。因此,普通 txid 树与 witness 树不能混为一谈。 [3] [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: Block, 交易, Block Header. 反向关联还来自: Block Header, Hash, SHA-256, 确认.

DOC · 001Bitcoin Developer Guide — Merkle Trees文档 DOC · 002Bitcoin whitepaper — Simplified Payment Verification一手来源 DOC · 003Bitcoin Core — Merkle tree implementation一手来源 DOC · 004BIP141: witness commitment一手来源
修订日期: 来源优先 · 非投资建议