区块的生成和链接(二)

听了新大的区块链课程,每个字都能听清连在一起就不知道什么意思,所以想到把文字整理出来,为的是可以反复看反复理解,于是就有了这篇文章,这是第五课的后半部分内容。


区块的生成和链接(二)_第1张图片
图一、区块的验证和链接(图片来自新生大学课程)


三、区块的验证链接

1.之前说每个交易需要验证,区块挖到之后NONCE值如果算的不对,区块立刻会被作废。

2.另外会检查时间戳是否是小于当前时间两个小时,这个说法和很多书籍上的描述也不一样,看源代码发现和书上描述并不一致。

3.检查MERKLE树根是否正确,会重新把MERKLE TREE建立一遍,看里边包含的交易、哈希算出来的是否一样。

4.检查区块的大小要符合当前区块的大小,超过极为非法。

5检查区块内的第一笔交易是否是COINBASE。

6.验证每笔交易。

7.http://btc.yt/lxr/satoshi/ident?_i=CheckBlock(对代码感兴趣可以看这个网站,这个lxr是lunix以前做的一套开源的“工具”,是一个非常方便的查看代码的工具。

这个链接是可以查看BTC源代码的链接,打开之后有很多版本可以选择,有最新的版本也有最初的版本,刚开始学比特币的话可以看0.1.5,它是很简单的版本系统。在这里可以看到代码的实现情况。


区块的生成和链接(二)_第2张图片
图二、图片来自新生大学课程


四,Merkle Tree

1.什么是树?

为了更直观,图片中的树的结构是倒立着的树,树根在顶端。进入这个树,验证在这个交易中是否包含某个数据的时候,是从根节点进入,按规则一步步去查找、验证的。

区块的生成和链接(二)_第3张图片

                                                                                  图三

父节点:从根节点开始,上面一级的是父节点,下面一级的是子节点。

比如12是根节点,也是父节点,5、18也是父节点

子节点:下面一级的节点就是子节点。例:5、18是子节点,2,9,15,19都是子节点

兄弟节点:5和18是兄弟节点,2和9是兄弟节点

如果规定兄弟节点只能有两个就是二叉树。

树的最大好处就是当数据量很大时,搜索某个数是否在这一堆数据当中会非常快。

2.如何构建一个二叉搜索树?(图三)

例:12 5 2 18 19 15 17 16 9

第一个是12作为Root;

第二个是5,判断5<12,于是放入左边形成12的一个子节点;

第三个是2,2先和12比较大小,它小于12于是就放到左侧,接着和5比较大小,2<5,于是2放在5的左侧成为5的子节点;

第四个是18,先和12比较大小,它大于12于是放到右侧,成为12的一个子节点

第五个是19,先和12比较,大于12于是放到右侧,接着再和18比较大小,它大于18,于是放在右侧成为18的子节点。

以此类推,后面的数据都依据这样的规则最终建立起树的结构。

3.Merkle Tree

在这个Merkle Tree中存的不是一笔交易的所有信息,而是交易数据的哈希值,如果某个交易被改了的话,整个Merkle Tree就会有翻天覆地的变化,因为某个值的变化就会造成单个哈希的变化,然后就会造成上一步哈希值的变化,最后的ROOT都不相符,所以这个Tree就可以防止篡改,并且能快速验证某个交易是否在这个Tree里。

区块的生成和链接(二)_第4张图片
图四、Merkle Tree (图片来自新大课程)

Merkle Tree的建立

它的建立是从子节点开始建立,从下往上到ROOT,并且子节点是成对出现,父节点是基于两个子节点计算出来的。在图四中的子节点HA是交易A的哈希值,子节点HB是交易B的哈希值,根据HA和HB的哈希值做个总哈希计算得出父节点HAB,子节点HCC由两个子节点HC的哈希值计算得出。(当这个交易非常大的时候,这个区块里只能放下三个交易,这时由于Mrekle Tree有交易必须成对出现的要求,所以此时需要把交易凑成对,就凑了个一模一样的HC做它的兄弟节点)。

根据HAB和HCC的哈希值做总哈希计算最终得出HABCC,到此Tree就建成了。

五、验证路径

如何验证一笔交易是否已存在于区块中呢,也就是当别人说给你钱包里发送了1个比特币的时候,你要如何验证他是否真的给你钱包里发送了呢?这就是Melrkle Tree的作用---实现便捷的验证、防篡改。

区块的生成和链接(二)_第5张图片
图五、图片来自新大课程

验证在N个数值中是否包含某个数值需要的工作量是log2(N)

Number ofTransactions:表示区块里交易的数量

Approx.Size ofBlock:表示区块里交易数量相对应的size

Path Size(Hashers):验证一个交易是否存在于这个区块需要的工作量(需要几步)

例:想验证Hk是否在这个区块里,需要四步,也就是说给出四个数(HL、HIJ、HMNOP、HABCDEFGH)就可以验证出HK是否在这个区块中了,验证路径如下:

第一步,HK和HL做哈希运算得出HKL

第二步,HIJ和HKL做哈希运算得出HIJKL

第三步,H­IJKL和HMNOP做哈希运算得出HIJKLMNOP

第四步,HABCDEFGH和HIJKLMNOP做哈希运算得出HABCDEFGHIJKLMNOP,并和区块中的ROOT对比。

相符即是TRUE不符就是FALSE 。

你可能感兴趣的:(区块的生成和链接(二))