梅克尔树(Merkle trees)结构是拉尔夫.梅克尔(Ralph Merkle)在1979年发明并以他的名字命名的,由于在比特币系统里梅克尔树实际上是由一大堆数据通过不断地哈希运算组成的树形结构,故此应该叫梅克尔哈希树。
梅克尔树最典型的是两分叉形式,即两个交易组成一组,比特币系统就使用了这种形式。
以下图为例,交易1通过哈希运算得出哈希1值,交易2通过哈希运算得出哈希2值,然后再将哈希1值与哈希2值进行合并,在哈希运算得出哈希12值,以此类推,直到全部合并且哈希算完,得到只有一个哈希值的梅克尔树根。
在梅克尔哈希树结构中,交易1、交易2等被称作叶子。由于二叉梅克尔树要求叶子是偶数才能合并,当出现单独一个叶子没法合并时候,就采用将其复制的方式进行自我合并。以此类推,当叶子上面的子节点也出现相同情况时候,也是同样以复制方式自我合并,只有形成树根了才是一个单独的哈希值。
梅克尔树结构以及把梅克尔树根放在区块头的设计,对维持比特币系统以分布式网络存在有着十分重要的作用。因为比特币系统一年生产几万个区块,而每个节点都要对交易进行验证记账,储存数据的空间就要越来越大,长期下去就只有少数节点有足够的能力做到,到那时候系统只剩下这少数节点时候,去中心化网络就演变成了中心化,这并不是中本聪所希望看到的。
对此中本聪让没有足够存储能力的大多数节点只需要保存区块头就行了,一个区块头只有80字节,几万个区块的区块头加起来也没有10MB,对普通电脑来说绰绰有余了,这些节点就会始终存在,确保了整个网络始终处于分布式状态。
放在区块头的梅克尔树根还可以对交易进行验证,当需要验证一笔交易时候,系统会向存储了所有交易的节点发出请求,该节点(又称全节点)就会将该笔交易的叶子组合、子节点组合发送过来(并不会发送全部交易),最后算出来的梅克尔树根哈希值与区块头保存哈希值的对比,相互一致了就证明交易验证通过。
另外,每一个区块的梅克尔树根哈希值,都放进下一个区块的区块头里成为父区块哈希值,相当于下一个区块保存了上一个区块的所有交易。这样一环扣一环的链接,让任何虚假交易或伪造区块都难以混进系统的区块链接中,除非从创世区块开始修改交易内容,这个难度大于上青天,确保比特币系统拥有足够的安全性。