到目前为止,比特币的区块字段,只剩一个“Merkel树的根植”没讲了。 梅克尔(Merkel)树其实是由一堆原始数据不断哈希组成的树型结构。
比特币里用到的是最典型的二叉梅克尔树,如图:
区块里的交易信息做为原始数据,假如1个区块有10笔交易,那么把每两笔划为一组(因为是二叉树。如果是三叉树,就三笔划一组):交易-1和2一组,交易-3和4一组,依此类推。
那如果最后单出一个,比如还有个交易-10,怎么办?很好办,直接把交易-10复制一下,两个交易-10凑一组。然后,再把每组里的两个数据加在一起,做个哈希,比如交易-1和2加在一起得到哈希-A1,交易-3和4加在一起得到哈希-A2。
在这一层得到5个哈希,继续两两凑组,这里把哈希-A5单出来了,没关系,跟上面说的一样,复制出一个哈希-A,继续往上哈希,得到哈希-C系列和哈希-D1。哈希-D1是唯一的处在最顶层的那个哈希,被称之为这棵梅克尔树的根。比特币的区块头里就只存储了哈希-D1这个树根。
区块头里存储这么一个梅克尔树根有什么用呢?
答案是简单支付验证(SPV)。 我们知道,比特币一直都会有新的区块产生,这样,存储空间就会变得越来越大。最后,可能只有少数节点才有能力存储完整的区块数据。
节点越来越少的话,一个个好好的去中心化的比特币,岂不是会变成中心化?那就违背初衷了。所以,中本聪设计了一个方案,让不具备存储完整区块数据能力的节点,只需要存储区块头数据,就能够对交易进行验证。
在0625那篇里,我们说过区块头是固定的80个字节长,比特币约每10分钟产生一个区块,一年也就产生5万多个区块,如果只存储区块头,才4M多一点,对于现在的普通计算机来说,完全不是问题。
接下来看看,如何通过梅克尔根来验证交易。
据上图,假如我是一个只存储了区块头的节点,现在我要验证交易-5是不是在这区块上。光是看我自己存储的区块头,肯定不行,因为区块头里没有交易信息。
没办法,我只好找一个全节点求助。全节点收到我的请求后,并不会把整棵梅克尔树发给我,只会把交易-6、哈希-A4、哈希-B1、哈希-C2发给我,我收到这些信息后,做如下验证:
1、把交易-5和交易-6哈希得到哈希-A3;
2、把哈希-A3和哈希-A4进行哈希得到哈希-B2;
3、把哈希-B1和哈希-B2进行哈希得到哈希-C1;
4、把哈希-C1和哈希-C2进行哈希得到哈希-D1;
5、检查哈希-D1是否等于我自己存储的梅克尔树根,相等则通过验证。
这就是简单支付验证的过程。如果交易-5不在这个区块上,或者全节点恶意发假信息给我,都会原形毕露,因为整棵梅克尔树是一步步哈希出来的,任何一点数据不对,结果大不相同。
另外,因为梅克尔树是从交易数据哈希得来的,把梅克尔树根放在区块头,就相当于把所有交易数据的“指纹”放在了区块头。
所以,比特币用区块头的哈希做为这一个区块的标识,存储在下一个区块的数据里,其实效果和拿整个区块的哈希做标识一样,而前者处理起来更简单。
既然每个区块都包含上一个区块的几乎所有信息(除区块长度和神奇数这两个不太重要的字段)的指纹,那么要造假,就只能从创世区块开始一点点造,这难度就大了去了,所以比特币才那么安全。
至此,比特币区块里的字段我们已全部学完,对于比特币的学习,我们也暂告一段落。后面我们看看,区块链的边界是如何从比特币开始一点点扩张的。
不投资毋宁死
自由,就是拥有选择的权利,而每一次选择都是一次投资。
谢谢阅读
✬如果你喜欢这篇文章,欢迎分享到朋友圈✬
评论功能现已开启,灰常接受一切形式的吐槽和赞美☺
领取专属 10元无门槛券
私享最新 技术干货