默克尔树 Merkle Tree

基础概述

默克尔树(Merkle Tree),可以被用于验证任何类型的数据的存储。通常被用作与其他节点的计算机之间进行数据转移的数据完整性以及正确性的校验。
在比特币中。每个区块都有自己的 block header 其中包含了上一个区块的 hash 指针、难度 target 以及 nonce 等信息,最重要的是其中包含的 Merkle root hash。这个信息是当前区块中所有包含的交易信息组成的一颗 默克尔树 的根节点的值。有了这个值就可以保证当前区块包含的所有交易信息都不会被改变。

默克尔树的构成原理

首先来看一张默克尔树的构造图。

图片加载失败...

上图是维基百科的图片,从上图可以看到最底下的一层节点是数据块,对每两个相邻的数据块取hash并将它们的值再次进行hash得到一个新的节点。再向上将得到的两个相邻的新节点的值做一次hash得到一个上层节点。知道最终得到一个根节点。
只需要保存这个根节点的值即可随时验证整个树的所有数据的正确性。因为 hash 的特点,这颗树只要有一个节点的值被更改都会导致最终根节点的值产生变化。
因为这些特性,默克尔树的数据块顺序是不可更改的,一旦顺序更改那么所得到的根hash值都会不一样。即使两棵树的数据库一样。

比特币中默克尔树

在比特币中,默克尔树主要负责做交易打包的校验,在 block header 中保存了该区块中打包的所有交易组成的一颗默克尔树的根hash值。默克尔树的特性保证了一旦这个区块被链上其他的节点接受,成为最长有效链的一部分之后。这个节点中的交易就不会再被改变,因为一旦改变其中的交易,就会导致整棵树的根hash值产生变化,最终当前区块的hash值也会改变。这个区块就不会被其他节点接受。