高级 #blockchain#merkle#crypto
区块链数据结构(Merkle Tree)
区块链是一个不断增长的"区块"链——每个区块链接到前一个区块的哈希。Merkle Tree 把区块中的交易组织成树状哈希结构,高效验证交易完整性
🔗 一本”不能撕页”的账本
想象一本记账本——每一页记着当天的所有交易。写满一页后,在页脚写上这一页内容的指纹(哈希值),然后把指纹写到下一页的开头。
如果有人想撕掉一页或修改某一笔交易——下一页的指纹就对不上了——所有人都知道”这账本被动过”。
区块链就是这个账本的数字版本:
区块 1 区块 2 区块 3
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 前块哈希:0│←──────────│ 前块哈希:A│←──────────│ 前块哈希:B│
│ Merkle根:A│ │ Merkle根:B│ │ Merkle根:C│
│ 交易1 │ │ 交易4 │ │ 交易7 │
│ 交易2 │ │ 交易5 │ │ 交易8 │
│ 交易3 │ │ 交易6 │ │ 交易9 │
└──────────┘ └──────────┘ └──────────┘
↑ ↑ ↑
创世块 普通区块 最新区块
📐 区块链 = 区块 + 链(哈希指针)
每个区块包含:
- 前一个区块的哈希(链接到”上一页”)
- Merkle Root(所有交易的指纹)
- 时间戳、Nonce 等元数据
- 交易列表
🌳 Merkle Tree——高效验证”这笔交易存在吗”
比特币全节点不直接存所有交易的历史——它们存的是 Merkle Tree 的根哈希。但你需要证明”某笔交易确实存在于某个区块”——不需要下载整个区块,只需要 Merkle 证明。
区块中有 4 笔交易:
Root(H(12)+H(34))
/ \
H12 H34
/ \ / \
H1=H(tx1) H2=H(tx2) H3=H(tx3) H4=H(tx4)
验证交易 tx3 是否在区块中:
给你:tx3、H4、H12、Root
验证过程:
1. 计算 H3 = H(tx3)
2. 计算 H34 = H(H3 + H4) ← 有了 tx3 和 H4,你就能算出 H34
3. 计算 Root' = H(H12 + H34) ← 有了 H34 和 H12,算出 Root'
4. 如果 Root' == Root → tx3 确实在区块中!
不需要知道 tx1、tx2、tx4——只需要 O(log n) 个哈希值就能验证
Merkle 证明的威力:轻钱包(手机上的比特币钱包)不用下载整个区块链(几百 GB)——只下载区块头(每个 80 字节),当需要验证某笔交易时,通过 Merkle 证明确认。
🔒 不可篡改——改一笔交易=改所有后续区块
如果有人想篡改区块 1 中的一笔交易:
篡改 tx1 为 tx1':
1. 区块 1 的 Merkle Root 变了(从 A 变成 A')
2. 区块 2 的"前块哈希"指向的是 A——指向不存在的块
3. 所以必须改区块 2 的"前块哈希"为 A'
4. → 区块 2 的 Merkle Root 变了
5. → 区块 3 的"前块哈希"指向出错
6. → 必须继续改下去……
7. → 必须掌握超过全网 51% 的算力才能追上诚实的链
这就是区块链不可篡改的保证——不是”改不了”,而是”改的成本远远超过收益”。
📝 小结
| 概念 | 一句话 |
|---|---|
| 区块链 | 区块 + 哈希链——像”不能撕页的账本” |
| Merkle Tree | 交易的哈希树——O(log n) 验证交易存在性 |
| 不可篡改 | 改一笔交易→后续所有区块哈希都要改→成本极高 |
| 轻钱包 | 只存区块头 + Merkle 证明——不用下载完整链 |
为什么先学这个? 理解数据结构后,下一步看怎么”决定谁有权加新块”——工作量证明与共识。