梅克尔树和简单支付验证

到目前为止,比特币的区块字段,只剩一个“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不在这个区块上,或者全节点恶意发假信息给我,都会原形毕露,因为整棵梅克尔树是一步步哈希出来的,任何一点数据不对,结果大不相同。

另外,因为梅克尔树是从交易数据哈希得来的,把梅克尔树根放在区块头,就相当于把所有交易数据的“指纹”放在了区块头。

所以,比特币用区块头的哈希做为这一个区块的标识,存储在下一个区块的数据里,其实效果和拿整个区块的哈希做标识一样,而前者处理起来更简单。

既然每个区块都包含上一个区块的几乎所有信息(除区块长度和神奇数这两个不太重要的字段)的指纹,那么要造假,就只能从创世区块开始一点点造,这难度就大了去了,所以比特币才那么安全。

至此,比特币区块里的字段我们已全部学完,对于比特币的学习,我们也暂告一段落。后面我们看看,区块链的边界是如何从比特币开始一点点扩张的。

不投资毋宁死

自由,就是拥有选择的权利,而每一次选择都是一次投资。

谢谢阅读

✬如果你喜欢这篇文章,欢迎分享到朋友圈✬

评论功能现已开启,灰常接受一切形式的吐槽和赞美☺

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180927G1GYEE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券