BTC-数据结构(区块链技术与应用)

哈希指针(hash pointers)

保存数据的地址还有这个数据的哈希值,通过哈希指针不仅能找到数据的位置,还能检测出数据有没有被篡改

区块链

区块链就是一个个区块(block)组成的链表。

与普通链表的区别:

  • 用哈希指针代替了普通的指针

走到底的区块是系统中产生的第一个区块(在区块链的最末尾,下图中最左),叫创世纪块(genesis block),而开头的区块是系统中最近产生的区块(在区块链的头部,下图中最右)(most recent block)。

每个区块都包含指向前一个区块的哈希指针,最后一个区块也有一个哈希指针保存在系统里

BTC-数据结构(区块链技术与应用)

取哈希是将整个区块的内容合在一起取哈希,将前一个区块里的所有内容(包括其保存的指向下一个区块的哈希指针)一起取哈希。(就是取块头的哈希)

  • temper-evident log(防篡改日志)

这个性质是说,不论是在哪个区块做了改动,都会导致系统中保存的哈希值的变化,也就是只要记录那一个哈希值就能检测出区块链任何位置有发生了修改。

因为修改了某个区块的内容,会导致它前面的区块(相较它新产生的)区块保存的哈希值对不上了,那个哈希值就也要改,然后再往前的就也要改

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

Merkle Tree

Merkle Tree和普通二叉树的区别就是用哈希指针代替普通指针,最底下的一层叶子结点是数据块,其上的若干层非叶子结点都是存储哈希指针

一个非叶子结点中的两个哈希值拼在一起,再取一个哈希值,也就是指向该结点的父结点存储的哈希指针的哈希值。对根节点也可以取一个哈希值,称为根哈希值(root hash)

BTC-数据结构(区块链技术与应用)

在Merkle Tree中,只要记录下根哈希值,就能检测出对树中任何部位的修改,也就是用根哈希值保护了整棵树上没有篡改。相比前面的区块链这个效率更高。

在比特币系统中,Merkle Tree的每个数据块代表着一个交易,整棵树也就是在记录比特币系统中的交易,用根哈希值防止这些交易信息被篡改。

区块链中的结点

在区块链中,每个区块分为两部分,块头(block header)和块身(block body)。在块头中存储了这个区块所包含的所有交易组成的Merkle Tree的根哈希值。只在块身中存储了交易列表

  1. 全节点:既有块头又有块身的区块,保存了交易的具体信息。
  2. 轻节点:只保存了块头,没有保存块身。eg:手机上的比特币钱包

Merkle proof

Merkle proof 验证Merkle Tree中某个交易存在

eg:在下图中,蓝色数据结点是待证明存在的交易,这里轻结点只有一个根哈希值是不够的,要向全结点请求下图中标红的三个哈希值,然后就只需在本地为交易的数据结点向上一步步计算和拼接计算哈希值,最终和根哈希值对比,来知晓这个交易是不是真实存在这个Merkle Tree中的了

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

BTC-数据结构(区块链技术与应用)

上一篇:BTC-比特币网络(区块链技术与应用)


下一篇:BTC-比特币的匿名性(区块链技术与应用)