在分布式系统、P2P应用中或者是区块链中,会经常使用一种数据结构Merkle tree(默克尔树),这里我们将详细讨论一下这个常用数据结构。

Merkle tree

Merkle树看起来非常像二叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值,所以有时候Merkle tree也表示为Hash tree,如下图所示:

在构造Merkle树时,首先要对数据块计算哈希值,通常,选用SHA-256等哈希算法。但如果仅仅防止数据不是蓄意的损坏或篡改,可以改用一些安全性低但效率高的校验和算法,如CRC。然后将数据块计算的哈希值两两配对(如果是奇数个数,最后一个自己与自己配对),计算上一层哈希,再重复这个步骤,一直到计算出根哈希值。

Merkle树大多用来进行完整性验证,比如分布式环境下,从多台主机获取数据,怎么验证获取的数据是否正确呢,只要验证Merkle树根哈希一致,即可。例如,下图中L3数据块发生错误(比如数据被修改了),错误会传导到计算hash(L3),接着传导到计算hash(Hash1-0+Hash1-1),最后传导到根哈希,导致根哈希的不一致,可以说,任何底层数据块的变化,最终都会传导到根哈希。另外如果根哈希不一致,也可以通过Merkle树快速定位到导致不一致的数据。

Merkle树还可以用来对数据进行快速比对,快速定位到不一致的数据。比如分布式存储中,一份数据会有多个副本,并且分布在不同的机器上。为了保持数据一致性,需要进行副本同步,而首要的就是比对当前副本是否一致,如一致,则无需同步,如不一致,还需找出不一致的地方,然后进行同步。很明显,如果采用直接传输数据进行比对,非常低效,一般采用对数据进行哈希,传输哈希值进行对比的方法。为此,可以对每台机器需要比对的数据构造Merkle树,如果根哈希一致,则数据相同,如果根哈希不一致,则通过Merkle树快速检索到不一致的数据。下面举例说明快速检索的过程,如下图蓝色标注所示。假设两台机器中L3数据块不一致,我们对比根哈希,发现根哈希不一致,即,数据不一致,此时需要找出是那一块不一致,分别对比Hash0Hash1,发现是Hash1不一致,接着向下发现是Hash1-0不一致,这样就定位到是L3数据块不一致。定位过程的算法复杂度为O(log(n))

还有一种数据结构,在一定程度上可以看做是Merkle树的子树,但又不完全一样,这个数据结构是Hash list(为了避免中文哈希列表与哈希表的误解,这里使用英文名称),我们下面看一下这个Hash list。

Hash list

在点对点网络中数据传输的时候,为了提高效率往往会同时从多个机器下载数据的不同部分,即,不是从一台机器下载整个数据,而是将完整数据分成不同的部分,分别同时从不同的机器获取完整数据的不同组成部分。这样分块传输不但可以同时从多台机器下载数据,另一个好处是如果这一小块数据传输过程中损坏了,只要重新下载这一小数据块就可以了,不用重新下载整个数据。

但这种分布式环境下,很多机器应该认为是不稳定或者不可信的,如何校验整个数据的完整性及每一小数据块的完整性呢?


Merkle tree 对比 Hash list
两种数据结构都有验证数据完整性的功能,都可以通过根哈希保证整体数据完整性。所不同的是,在数据庞大,数据块非常多的情况下,当根哈希检测到数据不一致时,Merkle tree可以快速的定位到导致不一致的数据块,复杂度为O(log(n)),而Hash list只能遍历庞大的哈希列表定位到导致不一致的数据块,复杂度为O(n),很显然,此时Merkle tree的效率要高很多。

Merkle Tree相关推荐

  1. Merkle Tree(梅克尔树)算法解析

    Merkle Tree概念   Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...

  2. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

  3. 七、区块链如何运用merkle tree验证交易真实性

    转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证. Merkle Tre ...

  4. 区块链六-Merkle Tree

    2019独角兽企业重金招聘Python工程师标准>>> 基于Java语言构建区块链(六)-- 交易(Merkle Tree) Posted on 2018-03-26 |  In b ...

  5. merkle tree(hash tree)

    merkle tree即为hash tree,以下都用hash tree表示. hash tree使得可以对大型数据结构的内容进行有效且安全的校验. hash tree是hash list和hash ...

  6. layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性

    大部分材料都会提到区块中保存了merkle根,并且利用它作交易真实性验证.但是具体如何作这个真实性验证,没有一篇文章可以通俗的讲出来.本文假设你已经知道区块链中merkle tree的原理,现在想搞明 ...

  7. Merkle Tree(默克尔树)原理解析

    Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...

  8. 以太坊Eth2 deposit merkle tree

    1. 引言 以太坊2.0(Eth2)采用sharded PoS协议,在早期阶段(名为Phase 0),与现有的PoW链(名为Eth1链)并行运行.Eth1由miners驱动,而PoS链(又名Beaco ...

  9. Sparse Merkle Tree

    1. 引言 前序博客有: Merkle tree及其在区块链等领域的应用 Merkle tree proof 2. Merkle tree Merkle tree可看成是对一组数据的密码学承诺,类似: ...

  10. 什么是Merkle Tree(默克尔树)

    强迫症居中了图片哈哈哈~~~ 觉得这篇文章写得很清晰,也转载分享给大家看看mua~ Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一 ...

最新文章

  1. 对比React Native、dcloud、LuaView三个框架技术(内部)
  2. Microbiome:浙大马忠华团队-生防细菌抑制病原真菌新机制
  3. 他考研3次,读博7年,英语极烂,却做出诺奖级成果,并获2020年度“菲列兹·伦敦奖”...
  4. eclipse导入jar包_在命令行上操作JAR,WAR和EAR
  5. IntelliJ IDEA sass环境配置及常见报错处理
  6. 网易笔试——混合颜料
  7. 无旋treap的简单思想以及模板
  8. Linux 进程状态【转】
  9. git 删除分之以及删除文件夹
  10. linux安装python_如何在 Windows 上安装 Python | Linux 中国
  11. 计算机默认网络密码是多少,中国电信的默认服务密码是什么
  12. 云计算和大数据的关系以及区别详细讲解
  13. Ci522 13.56MHz非接触式读写器芯片--Si522 Lowcost版本
  14. 阿里云免费SSL证书对IOS描述文件mobileconfig的签名认证
  15. 数据结构实训——运动会分数统计
  16. 《无主之地2》已经完工,内容已整理完整封盘送审
  17. 用计算机亩换算成平方,平方米亩换算(平方米换算亩计算器)
  18. Html 使用svg图标、iconfont的使用方法
  19. 程序员生存定律-六个程序员的故事(2) .
  20. 视觉平衡与物理平衡_设计中的构图平衡,对称与反对称

热门文章

  1. 关于event.cancelBubble和event.stopPropagation()的困惑
  2. 阻止冒泡和阻止默认事件——cancelBubble和stopPropagation
  3. NUIST LevOJ P1857 孤独摇滚
  4. MFC计算机图形学(2)
  5. 职场人生|软件测试的伙伴如何迈过瓶颈期?
  6. scrcpy 使用教程:将安卓设备投屏到 PC 端
  7. leetcode1049. 最后一块石头的重量 II(java)
  8. Java面试题2021,华为java工程师工资
  9. 多类型文件的上传和下载
  10. javascript面向对象精要学习总结(第二章 函数)