区块链-2-区块链中的数据结构
1.hash pointer 哈希指针
哈希指针与普通指针不同的是,哈希指针中不仅指向了某个结构体,并且还保存了该结构体的哈希值。
哈希指针不仅指向了结构体,并且还能检测该结构体是否被篡改。
2. block chain 区块链
区块链就是使用哈希指针代替普通指针的链表。
第一个区块称为 genesis block 创世纪块。
最后一个区块称为 most recent block 最近块,最近块的哈希值存储在系统内。
tamper-evident log 防篡改日志
我们只需要保存最近块的哈希值,就可以校验整个区块链是否被篡改。
3. merkle tree 默克尔树
默克尔树就是使用哈希指针代替普通指针的二叉树。
默克尔树的叶子节点是数据块,存储实际的数据;非叶子节点保存了其左右子节点的哈希值。
通过保存根节点的哈希值,就可以校验整个默克尔树是否被篡改。
比特币中,默克尔树存储于 block body 区块身,默克尔树的根哈希值存储于 block header 区块头。默克尔树的叶子节点(数据块)中存储 TX (Transaction) 交易。
merkle proof 默克尔证明
比特币的使用端有两种:全节点和轻节点
全节点:保存了整个区块的内容。
轻节点:仅保存了区块头的内容。
轻节点可以使用默克尔证明来校验某一个 TX 交易的真实性:
轻节点向全节点请求交易所在叶子节点到根节点路径上另一边的哈希值。
轻节点根据交易对象提供的 TX 交易计算哈希值。
将计算得到的哈希值与请求得到的另一边的哈希值结合为非叶子节点,然后对非叶子节点求哈希值。如此迭代,直到计算出一个根哈希值。
将计算得到的根哈希值与区块头中保存的根哈希值比较,最终校验交易是否已经写到区块链上。
默克尔证明的时间复杂度为 \(O(log(n))\)
sorted merkle tree 排序的默克尔树
默克树可以在\(O(log(n))\)的复杂度下证明交易存在于某个区块,而证明区块中不包含某个交易,则需要\(O(n)\)的时间复杂度。
对于排序的默克尔树,则可以实现\(O(log(n))\)复杂度证明区块中不存在某个交易。
比特币中没有用到排序的默克尔树。
4. 扩展其他的数据结构
无环的数据结构均可以通过让哈希指针替换普通指针形成新数据结构。
有环的区块下,哈希指针会产生循环依赖,因此较难找到这样的一个数据结构。