高级 #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 证明——不用下载完整链

为什么先学这个? 理解数据结构后,下一步看怎么”决定谁有权加新块”——工作量证明与共识