中本聪在原《A Peer-to-Peer Electronic Cash System》中指出:
一旦某种货币的最新交易被足够多的块覆盖,先前的支付交易可以被丢弃以节省磁盘空间。为了在不破坏块的散列值的情况下促进这一点,事务将被散列到Merkel树[7][2][5]中,并且只有根节点将被包括在块的散列值中。旧块可以通过剪去树枝来压缩。分支内部的Hash不需要保留。
占多大空间?
我们来看看2009-2022年比特币规模变化趋势图。统计数据来自:https://www . statista . com/statistics/647523/world wide-bit coin-区块链-size/。
从上图可以看出,2009年刚发布的时候,占用的存储空间可以忽略不计。到2022年7月,占用的磁盘空间高达400G。这意味着比特币网络中所有节点的数据规模都达到了400G,也就是说如果一个新节点想要同步比特币网络的块数据,就必须同步至少400G的数据。虽然网络上的所有节点不一定都是节点,但事实上,中本聪只是在他的论文中提出了一个解决方案,来解决日益增长的数据空间需求。
什么时候由谁来回收?
该论文指出,一旦某种货币的最新交易被足够多的块覆盖,就可以丢弃先前的支付交易以节省磁盘空间。其实空间回收有两个方向,一是删除旧数据腾出空间,二是切割底层数据结构。但是为了保存全网账本的数据,需要所有有特定要求的节点,普通节点可以通过空间回收算法腾出硬盘空间。
怎么回收?
它由块头和事务信息组成。为了保证块的hash值不被破坏(非常重要),事务信息被hash构造成Merke树,块的hash值中只包含根。
要点如下:
每个事务都会生成一个哈希值。每个事务都是一个叶节点。父节点的哈希值是通过将左右子节点的哈希值相加而生成的。如果父节点只有一个左子节点,则将左子节点的副本作为右子节点来计算父节点的哈希值。分支拔出后,只保留最右边和最下面的事务,即只留下最后一个事务中会影响根节点哈希计算的子节点的哈希值进行空间求值。
没有事务的每个块标题约为80字节。按照设计,块输出速度是10分钟左右,实际上会慢一些。每年生成的块空间约为80字节* 6 * 24 * 265=4.2 MB。根据摩尔定律,内存和硬盘的价格会越来越低,设备的内存空间会逐渐变得越来越大。即使再过120年到2140年左右,所有的块都会存储在内存中,存储不是问题。
数据结构为什么要用Merkle树?
枫树是区块链的基本组成部分。如果没有Merkle树,区块链也可以基于其他数据结构实现。如果不回收空间,整个网络中只有最强大的计算机可以在区块链网络中运行。
Merkle树本质上是用hash构建的树,一种二叉树结构。树的每个父节点都是通过哈希左右子节点的值生成的,树的顶层节点称为默克尔根。如果在树的某一层中有奇数个散列,则将该层的最后一个散列复制并补充到右边的子节点。
试想一下,如果我们篡改交易数据,那么我们将修改后的父节点的hash自下而上的传递,一直传递到根节点,这样块的hash就被篡改了,篡改后没有人会承认,所以这个特性自然适用于区块链的交易数据篡改防控。
空间回收后会遇到什么问题?
没有通过Merkle树进行分支裁剪,减少了一个块的空间占用,但也减少了块中的事务记录。请注意,中本聪说的是,当足够多的节点收到数据块时,空间回收就开始了。如果执行回收逻辑后某个节点的账本不完整,只能验证链接是否合理,接收新块或者基于最长的链挖掘新块。但是如果这个节点需要查询一个块的数据但是台账不全怎么办?
实际上,这个节点此时无法跟踪事务。幸运的是,网络上还有其他节点存储这个块的事务信息。因此,此时丢失事务信息的节点需要向包含该块的其他节点(包括所有节点)寻求帮助。
备注:比特币网络是指运行比特币P2P协议的所有节点的集合。每个节点的地位是平等的,但由于偏向的功能点不同,它包含了不同角色的节点。节点的功能主要有钱包、挖矿、保存所有账本和路由,分别对应钱包节点、矿工节点、全链节点和路由节点。钱包只关心钱包内与地址相关的交易,不会下载完整的区块链,也就是所谓的光节点。矿工的主要工作是采矿,这是独立的。如果没有加入挖掘池的节点想要挖掘,需要下载所有的区块链,也是整个节点,但是不验证交易。所有节点功能最全,包括所有账簿,还可以有钱包和挖掘的能力。所有节点都具有路由功能,只有所有节点才能真正验证事务。
以下文章将逐步发布,探讨Web3.0的奥秘,包括但不限于:各种形式和底层原理。