在比特币白皮书中,描述了一种回收硬盘空间的方法,即删除区块中除最后一笔交易之外的所有交易。

bitcoin reclaiming disk space

上图中的左图表示所有交易按序可以计算出 Root Hash,图中的虚线表示是计算的,而非存储的; 所以,在没有回收硬盘空间是,区块中存储了所有的交易。

在上图中的右图中,交易被裁剪掉了,只剩下最后一笔交易以及一些 merkle 树中的关键节点(实线框的 hash 值), 这些节点之前是不存储的,现在,由于把交易裁剪了,所以,为了计算出更高层次的 hash, 需要存储下一层次的 hash。

那么,为什么不把所有的交易都裁剪掉呢?只保留 Root Hash 即可?

如果只留 Root Hash,那么就没法验证这个 hash 的真实性了,有可能是随意伪造的。

那么,是否可以把上图右图中的 Tx3 也裁剪掉,但是存储 Hash3(目前 Hash3 是不存储的,它是虚线框,计算而来) 呢?

也不行,原因和上面类似,只有一个哈希值字符串,无法验证真伪。

所以,至少需要保留一个交易,而交易中含有的信息是没法伪造的,否则比特币就完了,当然,除非是多数攻击。

那么,为什么是保留最后一个交易,而不是第一个交易呢?

我理解保留第一个交易也是一样的,甚至保留其中任何一个交易都是一样的,只是裁剪的方式就不一样了。

那么,为什么选择用 merkle 树呢?

看了上面的裁剪交易的巧妙设计应该可以知道了,merkle 树可以裁剪掉一些东西,节省存储,但是却不会破坏 hash, 而如果我们一股脑将所有交易塞进去,生成一个 hash,那么,很显然,裁剪任何交易,都会导致最后的 hash 值改变, 结果就是裁剪过后的块不能通过验证,因为在验证的时候,计算出的 hash 不一样了。

那么,如白皮书所说,如果把交易都裁剪掉,那么每年比特币区块增量才 1.2GB, 那么,为什么现在比特币区块已经快 160GB 了呢?

bc size

这是因为,比特币并没有实现白皮书中描述的硬盘空间回收技术,比特币实现了修剪技术(prune mode), 但是,全结点,或者说比特币链并不会自动修剪,也不会主动修剪,因为,一旦将交易修剪掉,那么这些交易就不能查询了。

所以,区块链的区块大小一直在增大。

另外一点,比特币实现的修剪技术,是指在同步了块,并且验证了块的合法性之后实现修剪,所以并不会节省带宽,只是节省磁盘空间, 当然,裁剪和同步是并行进行的,并不需要同步到最高块,才开始裁剪。