Merkle树gydF4y2Ba
默克尔树是一棵gydF4y2Ba基于散列的数据结构gydF4y2Ba这是一般化的gydF4y2Ba哈希表gydF4y2Ba.这是一个gydF4y2Ba树gydF4y2Ba结构,其中每个叶节点是数据块的哈希值,而每个非叶节点是其子节点的哈希值。通常,默克尔树的分支因子为2,这意味着每个节点最多有2个子节点。gydF4y2Ba
在分布式系统中使用默克尔树进行有效的数据验证。它们是高效的,因为它们使用散列而不是完整文件。哈希是一种编码文件的方法,它比实际文件本身小得多。目前,它们的主要用途是gydF4y2Ba对等网络gydF4y2Ba如Tor,gydF4y2Ba比特币gydF4y2Ba, Git。gydF4y2Ba
内容gydF4y2Ba
概述gydF4y2Ba
默克尔树通常被实现为gydF4y2Ba二叉树gydF4y2Ba,如下图所示。但是,可以将默克尔树创建为gydF4y2Ba 连树,gydF4y2Ba 孩子们每个节点。gydF4y2Ba
在这幅图中,我们看到输入的数据被分解成标记为L1到L4的块。每个块都使用一些哈希函数进行哈希。然后对每个节点进行递归散列,直到我们到达根节点,根节点是它下面所有节点的散列。gydF4y2Ba
福利和协议gydF4y2Ba
在各种分布式和点对点系统中,数据验证是非常重要的。这是因为相同的数据存在于多个位置。因此,如果一段数据在一个位置发生了变化,那么数据在任何地方都发生变化是很重要的。数据验证用于确保数据在任何地方都是相同的。gydF4y2Ba
然而,每当系统想要验证数据时,检查每个文件的整体是非常耗时和计算成本高的。这就是为什么要用默克尔树。基本上,我们希望尽可能地限制通过网络(如Internet)发送的数据量。因此,我们不是通过网络发送整个文件,而是发送文件的哈希值,看看它是否匹配。协议是这样的:gydF4y2Ba
- 计算机A将文件的哈希值发送给计算机B。gydF4y2Ba
- 计算机B检查哈希与默克尔树的根。gydF4y2Ba
- 如果没有区别,我们就完了!否则,请转步骤4。gydF4y2Ba
- 如果单个哈希中存在差异,计算机B将请求该哈希的两个子树的根。gydF4y2Ba
- 计算机A创建必要的哈希并将它们送回计算机B。gydF4y2Ba
- 重复步骤4和步骤5,直到找到不一致的数据块。可以找到多个错误的数据块,因为数据中可能存在多个错误。gydF4y2Ba
注意,每次找到匹配的散列时,我们需要gydF4y2Ba 下一个层次的更多比较gydF4y2Ba 是树的分支因子。gydF4y2Ba
这个算法是基于网络的假设gydF4y2BaI / OgydF4y2Ba执行散列的时间比本地I/O长。这一点尤其正确,因为计算机可以并行运行,一次计算多个哈希值。gydF4y2Ba
因为计算机只是通过网络发送散列(而不是整个文件),所以这个过程可以进行得非常快。另外,如果发现不一致的数据块,插入一小块固定数据要比完全重写整个文件来解决问题容易得多。gydF4y2Ba
Merkle树在分布式系统中有用的原因是,检查整个文件来检查问题的效率很低。Merkle树在点对点系统中有用的原因是,它们可以帮助您验证信息,即使其中一些信息来自不可信的来源(这是点对点系统的一个问题)。gydF4y2Ba
默克尔树在点对点系统中发挥作用的方式与信任有关。在从对等源(比如tor)下载文件之前,根哈希是从可信源获得的。之后,可以从不可信的对等体中获取Merkle树的下节点。所有这些节点都存在于上面描述的相同的树状结构中,它们都是相同数据的部分表示。来自不可信源的节点将根据可信散列进行检查。如果它们与可信源匹配(意味着它们属于同一默克尔树),则接受它们,并继续处理。如果它们不好,它们就会被丢弃,并从另一个来源重新寻找。gydF4y2Ba
用例gydF4y2Ba
如上所述gydF4y2Ba以上gydF4y2Ba在分布式点对点系统中,相同的数据应该存在于多个位置,Merkle树尤其有用。这些系统在其实现中使用默克尔树或默克尔树的变体。gydF4y2Ba
Git是一种流行的版本控制系统,主要由程序员使用。所有保存的文件都一直保存在每个用户的电脑上。因此,检查这些更改在每个人的电脑上是否一致是非常重要的。gydF4y2Ba
比特币是一种流行的在线匿名货币。所有比特币交易都存储在区块链上的区块中。这个区块链存在于每个比特币用户的电脑上。比特币使用的默克尔树的叶子通常是单个块的哈希。每当有人想要更改区块链(例如通过添加事务)时,这种更改需要在所有地方反映出来。gydF4y2Ba
默克尔树不仅可以用于检查文件和基本数据结构(如区块链)中的不一致性。Apache Cassandra和其他NoSQL系统使用Merkle树来检测整个数据库副本之间的不一致性。想象一个全世界都在使用的网站。该网站可能需要遍布世界各地的数据库和服务器,以保证良好的加载时间。如果其中一个数据库被更改,那么其他每个数据库都需要以同样的方式更改。哈希可以由数据库的大块组成,默克尔树可以检测不一致。gydF4y2Ba
复杂性gydF4y2Ba
与散列表相比,默克尔树的开销非常小。二叉默克尔树,如图所示gydF4y2Ba以上gydF4y2Ba的作用类似于gydF4y2Ba二叉搜索树gydF4y2Ba因为它们的深度受分支因子2的限制。下面是分枝因子为的默克尔树的最坏情况分析gydF4y2Ba .gydF4y2Ba
平均gydF4y2Ba | 最糟糕的gydF4y2Ba | |
空间gydF4y2Ba | ||
搜索gydF4y2Ba | ||
遍历gydF4y2Ba | *gydF4y2Ba | *gydF4y2Ba |
插入gydF4y2Ba | ||
删除gydF4y2Ba |
*gydF4y2Ba摊销gydF4y2Ba
但是,Merkle树的一个非常重要的方面(以及它们最大的用例)是数据的同步。在典型情况下,此同步将是gydF4y2Ba 操作,因为它基于遍历和搜索。然而,有一个gydF4y2Ba最坏的gydF4y2Ba没有共同节点的情况。在这个场景中,同步类似于制作文件的完整副本,它将是gydF4y2Ba 操作。gydF4y2Ba
平均gydF4y2Ba | 最糟糕的gydF4y2Ba | |
同步gydF4y2Ba |
参考文献gydF4y2Ba
- zaghal,。gydF4y2Ba维基百科Merkle树gydF4y2Ba.2016年4月27日,从gydF4y2Bahttps://en.wikipedia.org/wiki/Merkle_treegydF4y2Ba