Elea Notes.

词条 · 加密与分布式 · 核心

剪枝

把已经花掉的老交易从本地删掉,只留 Merkle 树上必要的哈希,区块头链条依然完整可验。

也称:剪枝、pruning、prune、回收磁盘空间

先看一个麻烦

一条永不删除的链,会一直长。十年后新节点要下载全部历史才能参与,这个门槛会把小设备全部挤出去。

但你不能随便删——链的安全性正来自”每个区块都指着前一个的哈希”,删掉中间任何东西,后面的哈希就全对不上了。

朴素办法:只留最近的区块

砍掉一年前的所有数据,只留最近的。

行不通。你需要老区块来验证”这笔钱确实存在过、且还没被花掉”。删掉它们,你就无法独立判断一笔交易是否合法,只能相信别人告诉你的。

机制:删交易,留哈希

白皮书第 7 节的做法利用了 Merkle 树的一个性质:一个区块里所有交易被压成一个根哈希,而验证根哈希不需要全部叶子

所以:一笔交易的所有输出都被花掉之后,把这笔交易本身删掉,只保留 Merkle 树上重建根哈希所必需的那几个中间节点。

原文的示意图很清楚:一个有 Tx0–Tx3 四笔交易的区块,剪掉 Tx0、Tx1、Tx2 之后,只剩

       Root Hash
      /         \
  Hash01       Hash23
               /    \
           Hash2    Hash3
                      |
                     Tx3

Hash01 被留下来了(它替代了整个左半边),Hash2 也留着,但 Tx0Tx1Tx2Hash0Hash1 都没了。根哈希仍能算出来,所以区块头依然可验,链条依然完整。

原文那句话是关键:

The interior hashes do not need to be stored.

内部哈希不需要全部存储。

回访:这就是 80 字节那个算式的意义

白皮书紧接着算了一笔账:一个不含交易的区块头约 80 字节,每十分钟一个区块,那么

80 bytes * 6 * 24 * 365 = 4.2MB per year

一年 4.2 MB。这个数字之所以重要,是因为它意味着光是区块头链就足以维护链的完整性,而它小到可以放进内存。剪枝把”必须保存的东西”和”可以丢掉的东西”分开了。

这也是轻节点(见节点)能成立的理论基础:只跟区块头,不存交易。

边界与常见误解

剪枝不改变链的历史,也不是”区块变小了”。它是每个节点各自的本地存储优化——你剪掉的数据在别人那里还有,网络整体并未遗忘。

另外白皮书里没有 prune 这个词,第 7 节标题是 Reclaiming Disk Space。“剪枝”是后来的通行叫法。

来源

  1. Bitcoin: A Peer-to-Peer Electronic Cash System