惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
A
About on SuperTechFans
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
The Cloudflare Blog
F
Fortinet All Blogs
小众软件
小众软件
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
罗磊的独立博客
量子位
有赞技术团队
有赞技术团队
V
V2EX
Engineering at Meta
Engineering at Meta

博客园 - daviyoung

Windows 11 22H2 安装 .NET Framework 3.5 完整教程 System.Threading.Timer 详细讲解 Agent 开发入门(一):从零构建你的第一个智能体 用 C# 开发一个解释器语言——基于《Crafting Interpreters》的实战系列(五)表达式求值 python使用plotly绘制图表 手把手搭建OPC UA服务器 图像处理库Pillow的使用:批量裁剪图片 python-docx库的使用:图片插入到word文档里 modbus(二)用NModbus4库实现Modbus tcp从站 Jenkins 容器化实践:Docker 部署与 CI/CD 流水线配置 Streamlit实战 用pycdc批量反编译pyc文件 以ENS 的 BaseRegistrarImplementation 合约为例,用web3.py调用合约 虚拟环境下安装包后,vs code仍然有下滑波浪线及显示找不到包(运行是正常的)的解决办法 用 C# 开发一个解释器语言——基于《Crafting Interpreters》的实战系列(四)可视化 语法树 Solidity开发ERC20智能合约claim token的功能 Solidity开发ERC20智能合约demo及部署到测试网 用 C# 开发一个解释器语言——基于《Crafting Interpreters》的实战系列(三)表达式的抽象语法树设计(Expr) 用 C# 开发一个解释器语言——基于《Crafting Interpreters》的实战系列(二)词法分析器
Merkle Tree
daviyoung · 2025-08-12 · via 博客园 - daviyoung

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);
    }