听了新大的区块链课程,每个字都能听清连在一起就不知道什么意思,所以想到把文字整理出来,为的是可以反复看反复理解,于是就有了这篇文章,这是第五课的后半部分内容。
三、区块的验证链接
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,它是很简单的版本系统。在这里可以看到代码的实现情况。
四,Merkle Tree
1.什么是树?
为了更直观,图片中的树的结构是倒立着的树,树根在顶端。进入这个树,验证在这个交易中是否包含某个数据的时候,是从根节点进入,按规则一步步去查找、验证的。
图三
父节点:从根节点开始,上面一级的是父节点,下面一级的是子节点。
比如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里。
Merkle Tree的建立
它的建立是从子节点开始建立,从下往上到ROOT,并且子节点是成对出现,父节点是基于两个子节点计算出来的。在图四中的子节点HA是交易A的哈希值,子节点HB是交易B的哈希值,根据HA和HB的哈希值做个总哈希计算得出父节点HAB,子节点HCC由两个子节点HC的哈希值计算得出。(当这个交易非常大的时候,这个区块里只能放下三个交易,这时由于Mrekle Tree有交易必须成对出现的要求,所以此时需要把交易凑成对,就凑了个一模一样的HC做它的兄弟节点)。
根据HAB和HCC的哈希值做总哈希计算最终得出HABCC,到此Tree就建成了。
五、验证路径
如何验证一笔交易是否已存在于区块中呢,也就是当别人说给你钱包里发送了1个比特币的时候,你要如何验证他是否真的给你钱包里发送了呢?这就是Melrkle Tree的作用---实现便捷的验证、防篡改。
验证在N个数值中是否包含某个数值需要的工作量是log2(N)
Number ofTransactions:表示区块里交易的数量
Approx.Size ofBlock:表示区块里交易数量相对应的size
Path Size(Hashers):验证一个交易是否存在于这个区块需要的工作量(需要几步)
例:想验证Hk是否在这个区块里,需要四步,也就是说给出四个数(HL、HIJ、HMNOP、HABCDEFGH)就可以验证出HK是否在这个区块中了,验证路径如下:
第一步,HK和HL做哈希运算得出HKL
第二步,HIJ和HKL做哈希运算得出HIJKL
第三步,HIJKL和HMNOP做哈希运算得出HIJKLMNOP
第四步,HABCDEFGH和HIJKLMNOP做哈希运算得出HABCDEFGHIJKLMNOP,并和区块中的ROOT对比。
相符即是TRUE不符就是FALSE 。