Hash pointers:除了存储指针所指结构体的地址外,还要保存这个结构体的hash值。
好处:通过这个hash指针,不仅可以找到这个结构体的位置,同时还可以检测该结构体的内容是否被篡改。
1.区块链
比特币中一个最基本的数据结构就是区块链。
区块链:一个一个区块组成的链表。
与普通链表的区别:
用hash指针代替了普通的指针。(改变前面的任一区块,都会影响到系统保存的最后一个区块的hash值,从而可以检测整个区块链是否被篡改;有些结点就可以不必保存所有区块的信息)
2.Merkle tree
比特币中的另一个数据结构是merkle tree。
Merkle tree与binary tree的区别:用hash指针代替了普通指针
Merkle tree好处:只要记住root hash就可以检测出对树中任何部位的修改。
Notes:
比特币当中各个区块之间用hash指针连接在一起,每个区块所包含的交易组织成一个merkle tree的形式。
每个块分为两部分,分为块头和块身。这个区块所包含的所有交易组成的merkle tree的root hash存在块头里,但块头里没有交易的具体内容,块身里有交易列表。
Merkle tree用途:提供merkle proof。
以下图为例说明过程:
假设一个轻结点想要知道黄色这个交易是否被包含在其merkle tree里,这个轻结点向某个全结点发出请求,请求一个能够证明黄色这个交易被包含在merkle tree里的merkle proof,全结点收到这个请求后,只需把标为红色的三个hash值发给轻结点即可,有了这三个红色的hash值,轻结点就可以在本地计算出绿色的hash值,最终可以算出root hash,与块头里的root hash比较一下,就可以知道黄色交易是否包含在merkle tree里。
(比特币中的结点分为两类:全结点:保存整个区块的内容;轻结点:只保存块头)
(图片来源于学习视频)
学习视频:https://www.bilibili.com/video/av37065233?p=3