BTC-数据结构

哈希指针 hash pointers

普通的指针存储的是某个数据在内存中的首地址。哈希指针不仅要保存地址,还要保存数据的哈希值。通过哈希指针不仅能找到数据的位置,还能检测出数据有没有被篡改(因为保存了哈希值)。

在这里插入图片描述

区块链

比特币的基本数据结构即区块链。
区块链就是一个个区块(block)组成的链表。和普通的链表相比有一些区别:用哈希指针代替普通指针
系统中产生的第一个区块(在区块链的最末尾,下图中最左),叫创世纪块(genesis block)。而开头的区块是系统中最近产生的区块(在区块链的头部,下图中最右)。

在这里插入图片描述
每个区块都包含指向下一个区块的哈希指针。即每个区块存放的是父区块的哈希值。

最近产生的区块,它前面没有别的区块,但是也会有一个哈希指针,保存在系统里。

为了计算哈希指针来给区块取哈希的时候,是把区块里的所有内容(包括其保存的指向下一个区块的哈希指针)一起取哈希。

防篡改temper-evident log

这个性质是说,不论是在哪个区块做了改动,都会导致系统中保存的哈希值的变化,也就是只要记录那一个哈希值就能检测出区块链任何位置有发生了修改。因为修改了某个区块的内容,会导致它前面的区块(相较它新产生的)区块保存的哈希值对不上了,那个哈希值就也要改,然后再往前的就也要改,就像多米诺骨牌一样。

这个也就是和普通链表的区别,普通链表可以修改里面任何一个结点,对整个链表其它结点没有影响,但在区块链里修改一个区块就会影响到所有比它后产生的区块。

有了这个性质,某一个用户也就没必要保存系统中的所有区块了,可以只保存最近的一些区块,如果要用到先前产生的区块,再向别人要就可以。


比如只保存了下图中绿线右侧的区块,这些是比较新产生的区块,然后如果要用到紫色圈圈出来的区块,可以向别人要。保存的哈希指针在这里可以校验给的区块是不是正确的(取个哈希值然后和保存的哈希指针的哈希值比较一下),只要用自己保存的哈希指针往下个区块校验,然后再拿校验好的区块的哈希指针再往下校验,如此反复就可以了。

在这里插入图片描述

Merkle Tree

Merkle Tree和普通二叉树的区别就是用哈希指针代替普通指针,最底下的一层叶子结点是数据块,其上的若干层非叶子结点都是存储哈希指针的。
一个非叶子结点中的两个哈希值拼在一起,再取一个哈希值,也就是指向该结点的父结点存储的哈希指针的哈希值。对根节点也可以取一个哈希值,称为根哈希值(root hash)。

在这里插入图片描述

和区块链一样,在Merkle Tree中,只要记录下根哈希值,就能检测出对树中任何部位的修改,也就是用根哈希值保护了整棵树上没有篡改。相比前面的区块链这个效率更高。
在比特币系统中,Merkle Tree的每个数据块代表着一个交易,整棵树也就是在记录比特币系统中的交易,用根哈希值防止这些交易信息被篡改。

区块链中的结点

在区块链中,每个区块分为两部分,区块头(block header)区块体(block body)。在区块头中存储了这个区块所包含的所有交易组成的Merkle Tree的根哈希值,没有交易的具体内容。在区块体中存储了交易列表。
(1)全结点
既有块头又有块身的区块,保存了交易的具体信息。
(2)轻结点
只保存了块头,没有保存块身。例如手机上的比特币钱包就使用的是轻结点。

Merkle tree用途:提供Merkle Proof

如何向轻结点证明某个交易是写入了区块链的?例如有人向自己转账比特币,在手机上的比特币钱包使用的是轻结点,轻结点没有块身也就没有存储交易列表,只有一个根哈希值,如何证明这笔交易是真实存在某个区块中的?

答:就需要用到merkle proof(那条路径上的节点)找到交易的位置,往上一直到根节点的路径。

Merkle proof要做的就是通过区块中的块头中的Merkle Tree的根哈希值证明某个交易是存在于这个区块所对应的Merkle Tree中的,简单的说就是验证一下Merkle Tree中存在某个交易,这也叫作proof of membership或proof of inclusion。这涉及在Merkle Tree中从指定交易的数据结点到根节点的路径。
例如,在下图中,天蓝色数据结点是待证明存在的交易,这里轻结点只有一个根哈希值是不够的,要向全结点请求下图中标红的三个哈希值,然后就只需在本地为交易的数据结点向上一步步计算和拼接计算哈希值,最终和根哈希值对比,来知晓这个交易是不是真实存在这个Merkle Tree中的了。

在这里插入图片描述

红色的部分到底怎么来?可以要求转账的人发过来,因为第一课学过collision resistance的性质,没有办法伪造这些红色部分,以使得交易的哈希值和他们拼接后取哈希,如此反复,最终得到的根哈希值和轻结点中保存的是一样的。

Merkle proof 验证Merkle Tree中某个交易存在,假设有n个交易(叶子结点),Merkle proof的时间复杂度是θ(logn)。

假如要在Merkle proof中搜索某个交易,即[证明其不存在,或在不知道它的路径上的哈希值的情况下证明其存在]

可以对交易排序,用排序好的默克尔树sorted merkle tree,但是比特币里只用到无序默克尔树,比特币不需要不存在证明。

哈希指针:在无环情况下都可以使用。即只要数据结构是无环的,都可以用普通指针代替哈希指针。有环的会以引起所保存的哈希值的循环依赖。

发布了10 篇原创文章 · 获赞 2 · 访问量 105

猜你喜欢

转载自blog.csdn.net/weixin_40976389/article/details/105445100
今日推荐