Merkle Tree
1. Merkle Tree 是什么
Merkle Tree 是一种 二叉哈希树(Binary Hash Tree),它的作用是把大量数据的哈希值组织成树状结构,用 一个根哈希(Merkle Root) 来代表全部数据的完整性。
你可以把它理解成:
"用一个短短的指纹(Merkle Root)证明整个数据库的内容没有被篡改。"
2. 结构示意
假设我们有 4 个数据块:A, B, C, D
-
对每个数据块做哈希:
hA = hash(A) hB = hash(B) hC = hash(C) hD = hash(D) -
两两合并再哈希:
hAB = hash(hA + hB) hCD = hash(hC + hD) -
最终合并得到根哈希:
root = hash(hAB + hCD)
结构像这样:
Merkle Root
/ \
hAB hCD
/ \ / \
hA hB hC hD
3. 它的好处
✅ 快速验证数据是否在集合中
- 你只需要提供少量节点的哈希值(Merkle Proof),就能证明某个数据在这棵树里。
- 不用下载整个数据集。
✅ 节省存储和传输
- 例如区块链节点,只需要保存 Merkle Root 就能校验交易。
✅ 高效的防篡改机制
- 任何一个数据块被改动,最终的 Merkle Root 都会变化。
4. 在区块链中的用途
-
比特币 / 以太坊
- 区块头(Block Header)里会存 交易的 Merkle Root,保证交易列表不可篡改。
-
airdrop白名单
-
如果一个airdrop活动有 100 万个地址,直接存到合约里会非常贵。
-
解决方法:
- 离线计算 Merkle Tree,把所有地址做成
Merkle Root。 - 部署合约时只存 Root。
- 领取空投时,用户提交自己的地址和 Merkle Proof(验证路径所需的所有兄弟节点哈希值的集合),合约用
Merkle Root验证地址是否在白名单中。
- 离线计算 Merkle Tree,把所有地址做成
-
5. Merkle Proof 验证过程
假设要验证 A 在树中:
- 你提交:
hA+ 需要的兄弟节点哈希(比如hB和hCD)。 - 链上合约按顺序拼接和哈希,直到算出
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);
}

浙公网安备 33010602011771号