区块链/等级 II · 运作机制/2.3 区块与链/课程 2
默克尔树
绑定数千笔交易的32字节指纹
材料具有默克尔分支可视化功能的区块浏览器四个简短的字母数字标签(A、B、C、D)双SHA-256哈希工具
好奇
- 一个哈希值如何能够证明其中包含了四千笔不同的交易?
- 中本聪为什么选择让落单的最后一个条目与自身配对?这一选择又付出了什么代价?
- 在比特币早期版本中,重复配对规则引发了何种具体的安全漏洞?
探索
- 1979年,拉尔夫·默克尔为二叉哈希树申请了专利(1982年获批),这是一种旨在高效概括大型数据集的数据结构。在比特币中,这一结构将数千个交易标识符归约为一个32字节的值,即默克尔根。默克尔根被直接嵌入80字节的区块头中,从而对该区块内的每一笔交易形成不可更改的密码学承诺。
- 构建过程自下而上递归进行。交易ID两两拼接,经过双SHA-256哈希生成父节点。这种配对逐层进行,直到只剩下一个根哈希。如果某一层的条目数为奇数,则最后一个条目与自身配对,以维持二叉结构,确保树在每一层都能正确平衡。
- 这种结构的对数特性使简化支付验证(SPV)成为可能。轻客户端不下载完整区块,而是向全节点请求一条默克尔分支。该分支只包含从特定交易到根的路径上的兄弟哈希。对于包含4,000笔交易的区块,这一证明只需约12个哈希值,仅占总数据量的极小部分。
- 轻客户端将自身交易的哈希与这些提供的兄弟哈希组合,重新计算默克尔根,并与已下载的区块头中的值进行比对。如果两者一致,即可在不存储整条链的情况下,以密码学方式验证该交易已被包含。这一机制使移动钱包能够在存储容量和处理能力有限的设备上安全运行。
- 隔离见证(SegWit)于2017年8月激活,引入了第二棵默克尔树。原有的树承诺的是交易ID,而见证树承诺的是见证交易ID。第二棵树的根并不存放在区块头中,而是承诺在coinbase交易的一个OP_RETURN输出里;旧节点会将其视为普通数据,从而保持兼容性。
- 自配对规则隐藏着一个缺陷(CVE-2012-2459)。由于落单的最后一个条目会与自身配对,以一对重复条目结尾的交易列表,与去掉重复项后的列表会产生相同的默克尔根。攻击者可以广播某个有效区块的这种畸形变体;拒绝它的节点可能会把真实区块的哈希标记为无效,从而与网络失去同步。2012年的修复让节点能够识别这种模式,而不是将该区块作为无效区块缓存。
关键事实
- 默克尔根是存放在区块头中的单个32字节哈希值,它对区块中的所有交易作出承诺。
- 比特币在构建默克尔树的所有层级中都使用双SHA-256哈希算法。
- 对于任意层级中数量为奇数的条目,会将其最后一个条目与自身配对处理。
- 在大型区块中,一条交易的默克尔证明通常需要大约十二个兄弟哈希值。
- SegWit针对见证交易ID增加了第二棵默克尔树,并在coinbase交易中对其作出承诺。
- CVE-2012-2459是早期Bitcoin Core版本中与重复配对逻辑相关的漏洞。
练习 九、六、三、一
9收集列出9个利用哈希树进行数据完整性验证的实际系统或协议。
6归类按所保护的对象,将这9项分为6组:文件、软件包、证书、数据库、区块链或其他。
3提炼将这6组归纳为3个核心理由,说明为何对于大型数据集,对数级证明结构优于线性扫描。
1凝结用一句话解释叶节点中单个比特的改变如何改变整个根哈希。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。