找到交易所在的位置(最底行的其中一个区块),这时该区块一直往上到根节点的路径就叫merkleproof。
(**我的理解是:**由于是全网给出,一定正确?所以不存在修改红色值导致merkleproof失败的情况)首先算出*交易的哈希值,即它正上方的那个绿的哈希值,然后跟旁边红色的哈希值拼接起来,可以算出上层节点绿色的哈希值。然后再拼接,再算出上层绿色哈希值,再拼接,就可以算出整棵树的根哈希值。
merkleproof可以证明merkletree里面包含了某个交易,所以这种证明又叫proofofmembership或proofofinclusion。
对于一个轻节点来说,验证一个merkleproof复杂度是多少?假设最底层有n个交易,则merkleproof复杂程度是θ(log(n))。
因此比特币没有要保存所有区块的内容,可以只保留最近的几千个区块。如果要用到以前的区块,可以向系统中其他节点要这个区块。有些节点是有恶意的,怎么判断?这里要用到哈希值一个性质,如下:
,每个区块所包含的交易组织成一个merkletree的形式,最下面一行datablocks每个区块实际上是一个交易,每个区块分为两部分,
,最后一个区块是最近产生的区块(mostrecentblock)每一个区块都包含指向前一个区块的哈希指针
是把前面整个区块的内容,包括里面的hashpointer,合在一起取哈希值。通过这种结构,可以实现
轻节点把这个根哈希值和blockheader里的根哈希值比较一下,就能知道*的交易是否在这颗merkletree里。
普通链表可以改变任意一个元素,对链表中其他元素是没有影响的。而区块链是牵一发而动*,因为只需要保存最后一个哈希值,就可以判断区块链有没有改变,在哪里改变了。
只要一个数据结构是无环的(非循环链表),都能用哈希指针代替普通指针。有环的话存在一个问题,他们的哈希值没法计算,没法确定一个哈希值固定的区块。
全节点在merkleproof里提供的这几个哈希值,就是从*的交易所在的节点的位置到树根的路径上用到的这些哈希值。轻节点收到这样一个merkleproof之后,只要从下往上验证,
标签: #比特币 #区块 #数据结构
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:goldenhorseconnect@gmail.com