比特币 二、数据结构
作者:互联网
什么是数据结构?简言之,一个比特币区块中大约有4000多条交易,这4000多条交易,我们用一种怎样的结构进行排列。是像表格一样一个一个往下排,还是两个两个一对,两对两对一组……这样(这叫二叉树),或者其它的方法,就是数据结构。研究数据结构的目的,主要是为了查找的方便。
而区块链是用哈希指针代替了普通指针。哈希指针是一个可以指向数据存储位置及位置的数据的哈希值的指针
②哈希指针的防篡改性
区块链第一个区块叫作创世纪块(genesis block) ,最后一个区块是最近产生的区块(most recent block),每一个区块都包含指向前一个区块的哈希指针
一个区块的哈希指针怎么算:是把前面整个区块的内容,包括里面的hash pointer ,合在一起取哈希值。通过这种结构,可以实现tamper-evident log。如果有人改变了一个区块的内容,后面一个区块的哈希指针就对不上,因为后一个区块哈希指针是根据前一个区块的内容算出来的,所以后一个哈希指针也得改,以此类推,我们保留的是最后一个哈希值也会变化。
使用哈希指针,可以实现tamper-evident log (篡改证明记录),因为只要前面任意一个区块进行了修改,后面哈希指针存储的哈希值都会随之发生改变,产生多米诺骨牌效应
根据上面理论,举如下例子:
8笔交易依次排开,然后分别取哈希。(tx是交易,H()是这笔交易的哈希值)。上图中红框内,就是下面8笔交易分别取哈希的结果。
而每个框内的两个哈希值,在一起取哈希,就是上框内的哈希值,如下图箭头表示
而最上面的两个哈希值取哈希(下图),取得的哈希值,我们称为根哈希值(Root Hash)
这种数据结构的好处在于,只要记住根哈希值,就能检测出该树下的任何数据的篡改。
如下图跟随箭头,圆圈内黄色的tx被修改,那么必然导致上方绿色的H()被修改,从而导致了上方绿色的H()被修改,从而导致了上方绿色的H()被修改,最终导致了root hash这个值的修改。
3.Merkle Proof
前面提到过,比特币网络参与者包括全节点和轻节点,全节点保存了区块的所有信息,包括block header和block body,而轻节点只保存了block header。
现在假设某轻节点想要知道某笔交易是否写入了某区块中,应当怎么做?(实际中,类似A向B买东西,使用比特币支付,A告诉B这笔交易已完成,钱已付,在某区块中,B是轻节点,他该如何验证?)即,问题:A-->B 10 BTC,B为轻节点,B如何验证这比交易在区块链中?
使用merkle proof就可以解决这个问题,具体操作步骤如下:假设下图中的黄色交易是这笔交易。
有环的用哈希指针会出现循环依赖
这种结构的好处:只要记住根哈希值,就能检测出对树中任何部位的修改。
它们的区别:①用哈希指针代替了普通指针。
比特币当中各区块之间用哈希指针连接在一起,每个区块所包含的交易组织成一个merkle tree的形式,最下面一行data blocks每个区块实际上是一个交易,每个区块分为两部分,分别是块头和块身(block header ,block body)。块头里面有根哈希值,每个区块所包含的所有交易组成的merkle tree的根哈希值存在于区块的块头里面,但是,块头里没有交易的具体内容,只有一个根哈希值,块身里面是有交易的列表的。
- 复杂度为1表示,一下子就能找到。这种算法/数据结构是最好的
- 复杂度为n表示,随着数据量的增大,找到特定数据的消耗时间与数据量成同比例增长,是比较差的
- 复杂度为logn的算法/数据结构的好坏,是介于1与n之间的
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221329138-1481092142.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221413206-861714304.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221422145-80763927.png)
- Ho保存了 1)创世区块整体求哈希的值与 2)创世区块的地址
- Ha保存了 1)结构体A(包括了Ho)整体求哈希的值与 2)结构体A的地址
- Hb保存了 1)结构体B(包括了Ha)整体求哈希的值与 2)结构体B的地址
- ……
- Hd保存了 1)结构体D(包括了Hc)整体求哈希的值与 2)结构体D的地址。Hd保存在了用户本地
- 全节点full node:全节点是是拥有完整区块链账本的节点,全节点需要占用内存同步所有的区块链数据,能够独立校验区块链上的所有交易并实时更新数据,主要负责区块链的交易的广播和验证。
- 轻节点light node:没有拥有完整区块链账本的节点。比如,手机比特币钱包客户端就是一个轻节点,他没有必要去保存所有的账本。
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221435948-188579970.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221444853-1098496573.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221451418-353696291.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221457927-1147656464.png)
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221505477-1660509607.png)
- 全节点收到了B请求验证这笔交易的信息,全节点可以看到这笔在merkle tree中的位置,他给B提供三个数据,即上图中红色的H()。
- B在本地通过运算得到上图手指绿色H(),再和获得的红色H()一起,再在本地算出上方的绿色H(),再和获得的红色H()一起,再在本地算出上方的绿色H()……最终算到root hash值,设为H1。
- B将算出来的root hash值H1与本地的root hash值H进行对比,如果H1=H,则这笔交易存在在该区块中。
![](https://www.icode9.com/i/l/?n=20&i=blog/1466240/202102/1466240-20210209221514883-1573509057.png)
标签:数据结构,比特,proof,哈希,merkle,区块,节点,指针 来源: https://www.cnblogs.com/B1ueyuan/p/14394397.html