默克尔树(也称为二叉哈希树)是区块链中用于高效汇总和验证大型数据集的数据结构。每个叶节点包含一个数据块(交易)的哈希值,每个非叶节点包含其子节点的哈希值,而根节点则包含其所有子节点的哈希值。 默克尔根 — 是一个代表整个区块中所有交易的单个哈希值。
比特币和以太坊都使用默克尔树来组织每个区块中的交易。默克尔根存储在区块头中,这使得它们能够…… 默克尔证明 — 仅需少量哈希值(O(log n))即可证明特定交易包含在区块中,而无需下载所有交易。这使得SPV和轻客户端无需下载整个区块链即可进行轻量级验证。
默克尔树结构
4 transactions in a block: Tx1, Tx2, Tx3, Tx4
Step 1: Hash each transaction (Bitcoin uses double SHA-256)
H1 = SHA256(SHA256(Tx1)) = "abc..."
H2 = SHA256(SHA256(Tx2)) = "def..."
H3 = SHA256(SHA256(Tx3)) = "ghi..."
H4 = SHA256(SHA256(Tx4)) = "jkl..."
Step 2: Hash pairs of child nodes
H12 = SHA256(SHA256(H1 + H2)) = "mno..."
H34 = SHA256(SHA256(H3 + H4)) = "pqr..."
Step 3: Hash to root
Merkle Root = SHA256(SHA256(H12 + H34)) = "stu..."
Tree structure:
Merkle Root (stu...)
/ \
H12 (mno...) H34 (pqr...)
/ \ / \
H1(abc) H2(def) H3(ghi) H4(jkl)
| | | |
Tx1 Tx2 Tx3 Tx4
Merkle Proof for Tx3 (prove Tx3 is in block):
Provide: H4, H12
Verifier computes:
H3 = hash(Tx3) ← from the transaction itself
H34 = hash(H3 + H4) ← H4 provided
Root = hash(H12 + H34) ← H12 provided
If computed Root matches block header Root → Tx3 confirmed ✓
Data required: 2 hashes (not all 4 transactions)
For a block with 4,096 transactions:
Proof requires only 12 hashes — not 4,096
For 1,000,000 transactions: ~20 hashes
关于异常交易数量的说明: 如果一个区块包含奇数笔交易,则最后一笔交易的哈希值会被复制以形成一对——这是比特币默克尔树实现的一个已知怪癖。
默克尔树应用
| 应用领域 | 默克尔树是如何使用的 |
|---|---|
| 比特币区块 | 交易默克尔根存储在区块头中;为轻钱包启用SPV证明 |
| 以太坊状态 | Merkle Patricia Trie (MPT) 用于账户状态、存储和交易/收据记录;Verkle Trees 计划作为升级方案。 |
| 空投资格 | Merkle证明可在链上验证单个地址,而无需在合约中存储完整的收件人列表。 |
| 零知识证明 | Merkle证明可以在ZK电路中进行验证,用于紧凑型包含证明。 |
| Git(版本控制) | Git 使用内容寻址的 DAG(有向无环图)来组织对象——这种结构受到默克尔树的启发,并与之密切相关。 |
| 证书透明度 | 仅追加的 Merkle 日志允许对所有已颁发的 TLS 证书进行公开审计。 |
| 无状态客户端 | Merkle/Verkle 证明允许节点在不存储完整状态的情况下验证区块。 |
常见问题解答
问:DeFi空投如何使用默克尔树?
空投使用默克尔树在链上验证资格,无需将所有符合条件的地址存储在合约中,从而避免大规模存储带来的高昂成本。该协议会创建一个包含所有符合条件的地址和金额的默克尔树,并将根节点存储在链上。符合条件的用户提交他们的地址以及一个默克尔证明——一组简短的哈希值。合约会将该证明与存储的根节点进行比对,如果有效,则发放空投。这使得只需在链上存储一个 32 字节的默克尔根节点,即可高效地验证数百万个符合条件的地址。
问:什么是 Merkle Patricia Trie?
以太坊使用了一种更复杂的变体,称为 Merkle Patricia Trie (MPT) — 将默克尔树(用于完整性验证的加密哈希)与帕特里夏树(一种用于高效键值查找的前缀压缩结构)相结合。以太坊每个区块维护三个独立的MPT: 状态树 (所有账户余额和合约存储), 事务树 (区块中的所有交易),以及 收据尝试 (交易执行结果和日志)。这使得高效的状态证明成为可能——证明任何账户在任何历史区块的余额或任何存储值。以太坊的路线图包括从 MPT 过渡到 韦尔克尔树这样就能生成更小的证明,并支持无状态客户端。
问:默克尔证明如何帮助轻客户端(SPV钱包)?
轻钱包(例如移动比特币钱包)不会下载完整的区块链,而只会下载区块头(每个区块头 80 字节)。为了验证交易是否已确认,它会向完整节点请求默克尔证明:一组证明该交易包含在特定区块中的哈希值。对于包含数千笔交易的比特币区块,此证明大约只需要 20 个哈希值,而无需下载所有交易。这使得交易验证只需几千字节的数据,而不是几千兆字节,从而实现了实用的移动加密钱包。
问:如果默克尔树的叶子数量为奇数,会发生什么情况?
在比特币的实现中,如果交易数量为奇数,则最后一笔交易的哈希值会被复制,以便进行配对和哈希运算。这是比特币原始默克尔树设计的一个已知特性,实际上并不会带来安全隐患,尽管协议研究人员指出这种设计不够优雅。
问:默克尔树与维克尔树有何不同?
Verkle 树是以太坊中 Merkle Patricia Tries 的一种拟议替代方案。它们使用 矢量承诺 (基于椭圆曲线密码学)Verkle 证明取代了基于哈希的承诺,从而生成体积显著更小的证明。对于大量叶子节点,Verkle 证明的大小可能仅为等效 Merkle 证明的几分之一——这对于实现无需存储完整状态的无状态以太坊客户端至关重要。
相关条款
SHA-256 · 加密哈希函数 · 比特币 · 以太坊 · 轻客户端(SPV) · 空投 · ZK 证明 · Verkle 树 · Merkle Patricia Trie
UPay小贴士: 默克尔树是区块链验证高效而非仅仅理论上完备的关键所在。在 Etherscan 上验证交易时,实际上就是在验证一个默克尔证明。通过提交链上交易领取空投时,实际上是在提交一个证明你符合资格的默克尔证明。当移动钱包在无需下载完整区块链的情况下确认比特币支付时,它使用的是带有默克尔证明的特殊目的实体(SPV)。理解默克尔树有助于你理解为什么区块链验证既具有密码学上的可证明性,又具有实际的高效性——你无需下载所有内容即可验证任何内容。
免责声明:本内容仅供教育用途,不构成财务建议。










