什么是Merkle Tree
Merkle Tree是一种基于哈希的数据结构。Merkle Tree是一种树状数据结构,该树中的每一个叶子结点都是一个数据块,而每一个非叶子结点都是其子结点组合的哈希。普遍性况下Merkle Tree是二叉树,也就是说Merkle Tree中的每一个结点有两个子结点。当然,Merkle Tree可以是多叉树,例如Ethereum平台所采用的。简单起见,本文我们仅讨论二叉Merkle Tree。
Merkle Tree在分布式系统中被广泛使用于进行数据校验。一般来说,在分布式系统中,由于我们将数据存储于许多不同的机器上,那么为了保证数据可靠性及一致性,数据的校验就显得尤为重要。例如我们如果更新了一台机器上的某一块数据,这一更新必须被传递到分布式系统中的所有机器上以保证数据的最终一致性,这样一来对比不同机器上的数据就是问题所在。
直接比较所有文件显然是一种既耗时又低效的方法。而且这样做会由于机器之间相互发送文件而产生大量的网络通信。考虑到我们往往想要尽量减少通过网络发送的数据量,发送文件的哈希就成了自然而然的选择。
Merkle Tree之所以能够高效进行数据校验,是因为其采用验证哈希值的形式进行校验。相比于直接比较整个文件,比较文件哈希值显然高效的多。而且验证哈希值能够大大减少分布式系统,或者peer-to-peer(p2p)系统中处于校验需求所需要互相发送的信息量。
当前,Merkle Tree主要被用于Tor,Bitcoin,Git这一类的分布式p2p系统中,或用于Apache Cassandra或HBase这样的分布式数据库中。
Merkle Tree的结构综述
如下图所示是一个二叉Merkle Tree。此处我们假设图中所使用的哈希方法