比特币--Merkle树

Merkle树

在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通过简单支付验证可以在不必存储完整区块链下对交易进行验证,下面将分析区块结构Merkle树及如何进行交易验证。

简单单一文件验证

一般下载网站同时会提供下载的文件和该文件对应的MD5 sum。

这样我们在下载完文件后,对该文件计算MD5,如果计算出的MD5值和网站提供的MD5值相同,则说明文件在下载过程中没有被损坏。

多点下载文件验证

P2P网络中下载文件时,通常把大文件切分成多个小文件,同时从多个节点并发下载,此时怎么验证呢?

以BT下载为例,在下载真正的数据之前,我们会先下载一个哈希列表(每个下载小块计算出一个哈希),如果一个小块数据载传输过程中损坏了,那只需重新下载这个小块数据就可以了,此时,怎么保证这个哈希列表下载时没有损坏呢?

答案是把每个小块数据的哈希值拼到一起,然后对这个长字符串作一次哈希运算,得到哈希列表的根哈希。只要根哈希校队一样就说明哈希列表是正确的,再通过哈希列表校验小数据块,如果所有小数据块验证通过则说明大文件没有损坏。

SPV节点的merkle树验证

验证交易的过程和文件验证很相似,可以认为每个交易是一个小数据块,但比特币使用Merkle树的方式进行验证,相当于哈希列表。Merkle树是一种哈希二叉树,它的明显的一个好处是可以单独拿出来一个分支(作为一棵小树)对部分数据进行校验,更加高效。

image

我们回看下上面的区块结构图,区块体就是这样一个Merkle树,被用来归纳一个区块中的所有交易。每个叶子节点是每个交易信息的哈希,往上对相邻的两个哈希合并字符串再哈希,继续类似的操作直到只剩下顶部一个节点,即Merkle根,存入区块头。

因为Merkle树是二叉树,所以它需要偶数个叶子节点。如果有奇数个交易需要归纳,那最后的交易就会被复制一份以构成偶数个叶子节点,这种偶数个叶子节点的树也被称为平衡树。

SPV节点不保存所有交易也不会下载整个区块,仅仅保存区块头,我们来看看它是如何对交易数据进行验证的。

假如要验证区块结构图中交易6,SPV节点会通过向相邻节点索要(通过Merkleblock消息),包括从交易6哈希值沿Merkle树上溯至区块头根哈希处的哈希序列(即哈希节点6,5,56,78,5678,1234,1-8 – 称为认证路径)来确认交易的存在性和正确性。

在N个交易组成的区块中确认任意一笔交易只需要计算log2(N)个字节的哈希值,非常快速高校。