Merkle Tree


1. Merkle Tree 是什么

Merkle Tree 是一种 二叉哈希树(Binary Hash Tree),它的作用是把大量数据的哈希值组织成树状结构,用 一个根哈希(Merkle Root) 来代表全部数据的完整性。

你可以把它理解成:

"用一个短短的指纹(Merkle Root)证明整个数据库的内容没有被篡改。"


2. 结构示意

假设我们有 4 个数据块:A, B, C, D

  1. 对每个数据块做哈希:

    hA = hash(A)
    hB = hash(B)
    hC = hash(C)
    hD = hash(D)
    
  2. 两两合并再哈希:

    hAB = hash(hA + hB)
    hCD = hash(hC + hD)
    
  3. 最终合并得到根哈希:

    root = hash(hAB + hCD)
    

结构像这样:

        Merkle Root
        /        \
     hAB          hCD
    /  \         /   \
  hA    hB    hC     hD

3. 它的好处

✅ 快速验证数据是否在集合中

  • 你只需要提供少量节点的哈希值(Merkle Proof),就能证明某个数据在这棵树里。
  • 不用下载整个数据集。

✅ 节省存储和传输

  • 例如区块链节点,只需要保存 Merkle Root 就能校验交易。

✅ 高效的防篡改机制

  • 任何一个数据块被改动,最终的 Merkle Root 都会变化。

4. 在区块链中的用途

  1. 比特币 / 以太坊

    • 区块头(Block Header)里会存 交易的 Merkle Root,保证交易列表不可篡改。
  2. airdrop白名单

    • 如果一个airdrop活动有 100 万个地址,直接存到合约里会非常贵。

    • 解决方法:

      • 离线计算 Merkle Tree,把所有地址做成 Merkle Root
      • 部署合约时只存 Root
      • 领取空投时,用户提交自己的地址和 Merkle Proof(验证路径所需的所有兄弟节点哈希值的集合),合约用 Merkle Root 验证地址是否在白名单中。

5. Merkle Proof 验证过程

假设要验证 A 在树中:

  • 你提交:hA + 需要的兄弟节点哈希(比如 hBhCD)。
  • 链上合约按顺序拼接和哈希,直到算出 Merkle Root
  • 如果结果等于合约存的 Root,说明验证通过。

6. MerkleProof库

// Merkle树验证,调用MerkleProof库的verify()函数
    function _verify(bytes32 leaf, bytes32[] memory proof)
    internal view returns (bool)
    {
        return MerkleProof.verify(proof, root, leaf);
    }
posted @ 2025-08-12 09:24  daviyoung  阅读(48)  评论(0)    收藏  举报