《区块链技术与应用》笔记(二)数据结构

哈希指针

指针

程序运行过程中需要时使用数据,当数据较大时,会使用指针,指针存储了所需数据的地址,程序只需要按照地址去对应位置读取数据即可。区块链结构本身为一链表,节点就是区块,通过各个指针将区块串联起来。而区块链使用的并不是普通指针,而是哈希指针

哈希指针

普通指针存储的是某个结构体在内存中的地址,而哈希指针不仅存储地址,还需要存储这个结构体的hash值H(),好处就是不仅可以从这个指针里找到结构体的位置,还可以检测出这个结构体的内容是否被篡改。
哈希指针

区块链与普通链表的区别

  • 使用哈希指针代替普通指针
    除了创世纪块,每个区块都保存着前一个区块的哈希指针。每个区块的哈希值是由前一个区块的内容包括哈希值合在一起取的哈希。这种数据结构可以实现 tamper-evident-log。即不论在哪个区块做了改动,都会导致系统中保存的哈希值的变化。用户只需要记住最后一个区块链的哈希地址,就可以检测区块链上内容是否被篡改。
    简易区块链

比特币中有些节点是恶意的,当某个节点提供了一个区块给你使用,只需创建计算出该区块的哈希值,对比后就可以知道是否正确

Markle Tree 默克尔树

默克尔树和区块链的特性类似,树中任何一个节点的修改,都可以检测出来。因为Root Hash是由其他节点一层层计算出来的。在区块链中,每个叶子节点就相当于一个交易,内节点是两个下层叶子节点(或两个Hash对)计算出来的Hash对,一直到Root节点同样是一个Hash对。root节点也可以计算出其对应的Hash值
默克尔树

区块中分为两个部分

  • Block Header:存储着默克尔树的Root Hash。即该区块所包含的所有交易组成的默克尔树的根hash值是存在,这里没有存交易的具体内容
  • Block Body:交易列表

比特币的节点分为两类:

  • 全节点 full node。全节点保存整个区块的所有内容,包括交易信息,需要验证每一个交易
  • 轻节点 light node。仅仅保存区块的块头信息(类似移动端比特币钱包)。
    Markle Proof:默克尔证明——某个交易所在的节点到Root节点的路径,就是Markle Proof。

如何向轻节点证明某条交易是否被写入区块链中?
Markle Tree
验证过程:需要使用到Markle Proof。它就可以证明一个Markle Tree里面包含了某个交易。某个区块的Markle Tree。如果一个轻节点想知道某个交易是否被包含再这个Markle Tree里,这个轻节点没有保存交易列表,也没有Makrle Tree的具体内容,只有一个Root Hash值。这个轻节点向某个全节点发出请求,请求一个能证明该交易被包含在这棵Markle Tree里面的Markle Proof,全节点收到情节之后,返回图中标记为红色的三个Hash值返回给轻节点,轻节点会根据这些Hash值计算出图中标为绿色的三个Hash值,最先算出该交易上一层节点所算出的Hash值,然后与全节点提供的Hash值拼接起来,算出再上一层几点的绿色哈希值,再拼接那一层全节点所提供的红色Hash值,再拼接到Root节点,再继续算出Root Hash。轻节点将计算后的Root Hash值跟Block Header中的Root Hash对比,就能知道黄色交易是否在这颗Markle Tree里。

验证时的安全问题
这个验证的过程看起来是有点问题的。因为在验证过程中,只知道当前Markle Proof那些Hash,其他节点都是由全节点提供的,那么这些Hash值是否正确我们是不清楚的。如果某个交易修改后,它的上层节点的hash值被计算出来了,但另一个hash被恶意修改,导致再上一层的hash值不变,那么这个交易就不存在。实际上这种做法就属于人为制造哈希碰撞,基本是做不到的。

比特币中一般要求证明某个交易是否存在,而不会证明某个交易是否不存在,因此Markle Tree中叶子节点无需排序,不需要用到Sorted Markle tree

posted @ 2022-04-04 21:14  我永远喜欢石原里美  阅读(197)  评论(0编辑  收藏  举报