本篇文章主要介绍比特币中的数据结构:Merkle Tree。
一、Merkle Tree
Merkle Tree翻译中文的意思是梅克尔树。Merkle Tree是BTC的区块中的交易组织方式,它和传统的二叉树主要区别在于Merkle tree的指针均为Hash指针。
下图就是一个Merkle Tree
在这个merkle tree 中最底层的叶子节点表示的是数据块data block,在区块链中代表的就是交易信息tx,图中总共由8个tx块,对其从左往右编号为1-8。在tx块这一层的上面三层均为hash指针,在最顶层为包含两个hash指针的节点,对这个节点取hash值便可以得到这颗merkle tree的根hash值merkle root。这个根hash值是存储在区块中的。区块分为block header和block body 两部分,根hash值存储在block header中,但在bloker header 并不存储具体的交易内容,而在blocker body里存有交易列表。比特币中的节点由两种,一种为全节点,包括blocker header 和blocker body,另一种为轻节点仅有blocker header。观察merkle tree这种数据结构,所有的节点相连均使用了hash指针,显然是使用这种数据结构可以确保数据是无法被篡改的,一旦想要修改某个交易信息tx,就必须往上修改hash指针中的hash值,而修改了hash指针中的hash值就必须再修改上一层hash指针中的hash值,如此以往直到根hash指针,你只需要保存根hash的值不被篡改就可以保证所有交易不被篡改。通过使用这种数据结构可以实现merkle proof,它的应用场景主要是在节点为轻节点的情形下,轻节点种仅有根hash的值,如果交易发生,要如何向轻节点证明已经将交易写入区块中,也就是merkle proof的过程,具体过程如图。图中描述的是向轻节点证明黄色的交易块tx,也就是编号3已经写入区块链中merkle proof的过程。首先轻节点要向全节点发出请求,请求能证明黄色方块在这颗merkle tree中的mekle proof。之后全节点将返回给轻节点图中标注红色的hash值,在有了红色的hash值之后,轻节点能在本地计算出所有绿色的hash值,进而计算出根hash的值,再和blocker header中原先保存的根hash值进行对比即可知道交易是否已经写入区块中。这个过程其实就是在二叉树从叶子节点出发找到一条到达节点的路径,所以merkle proof 的时间复杂度是log(n)级别的。
网友评论