1. 哈希指针
普通的指针存储的是某个结构体在内存中的地址,哈希指针除了要存地址还要保存结构体的哈希值。
2. 区块链
区块链就是一个一个的区块组成的链表,区块链和普通的链表的区别在于区块链使用哈希指针。比特币中一个区块主要包含两部分,一个是block header 这里主要包含上一个区块的哈希值、时间戳、挖矿难度、工作量证明随机数、该区块链交易Merkle Tree的根哈希值。下面是一张区块链示意图。
取哈希的时候是将整个区块的header内容放在一起取哈希,每一个区块哈希的取得是将前一个区块header里面的全部内容拼接在一起取哈希得到的,如区块3的哈希是将区块2 header里面的值拼接在一起取哈希得到的。这种数据结构有一个很重要的性质是我们只要保存最后的哈希值就可以检测出对区块链中任何部位的修改。有了这个性质比特币节点中有些节点就不必保存整条区块链的内容。比如一个节点只保存最近的几个节点,如果要用到以前的节点可以从系统中的其它节点来要这个区块。
3. Merkle Tree
比特币系统中的节点分为两类,一类是全节点一类是轻节点,全节点保存整个块,轻节点只保存block header。这样就带来了一个问题,如何证明一个交易被写在了区块里。
上面是一个Merkle Tree示意图。现在假设某一个轻节点要证明黄色的交易存在。轻节点会像某一个全节点发送一个Merkle Proof请求,全节点收到请求后只要把这三个红色的哈希值发送给这个轻节点就可以了。有了这些哈希值轻节点可以计算出图中绿色的哈希值。比如我们对黄色的交易取哈希后让它在与旁边的哈希值合并取哈希,依此类推,这样最后我们就能计算出一个根哈希值,将此哈希值与block header里保存的根哈希值比较一下就可以确定黄色的交易是否存在这颗Merkle Tree里。
原文地址:https://www.cnblogs.com/yishi-san/p/12562073.html