Merkle Tree
在分布式系统、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数据块不一致,我们对比根哈希,发现根哈希不一致,即,数据不一致,此时需要找出是那一块不一致,分别对比Hash0
和Hash1
,发现是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相关推荐
- Merkle Tree(梅克尔树)算法解析
Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...
- 基于Java语言构建区块链(六)—— 交易(Merkle Tree)
基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...
- 七、区块链如何运用merkle tree验证交易真实性
转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证. Merkle Tre ...
- 区块链六-Merkle Tree
2019独角兽企业重金招聘Python工程师标准>>> 基于Java语言构建区块链(六)-- 交易(Merkle Tree) Posted on 2018-03-26 | In b ...
- merkle tree(hash tree)
merkle tree即为hash tree,以下都用hash tree表示. hash tree使得可以对大型数据结构的内容进行有效且安全的校验. hash tree是hash list和hash ...
- layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性
大部分材料都会提到区块中保存了merkle根,并且利用它作交易真实性验证.但是具体如何作这个真实性验证,没有一篇文章可以通俗的讲出来.本文假设你已经知道区块链中merkle tree的原理,现在想搞明 ...
- Merkle Tree(默克尔树)原理解析
Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...
- 以太坊Eth2 deposit merkle tree
1. 引言 以太坊2.0(Eth2)采用sharded PoS协议,在早期阶段(名为Phase 0),与现有的PoW链(名为Eth1链)并行运行.Eth1由miners驱动,而PoS链(又名Beaco ...
- Sparse Merkle Tree
1. 引言 前序博客有: Merkle tree及其在区块链等领域的应用 Merkle tree proof 2. Merkle tree Merkle tree可看成是对一组数据的密码学承诺,类似: ...
- 什么是Merkle Tree(默克尔树)
强迫症居中了图片哈哈哈~~~ 觉得这篇文章写得很清晰,也转载分享给大家看看mua~ Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一 ...
最新文章
- 对比React Native、dcloud、LuaView三个框架技术(内部)
- Microbiome:浙大马忠华团队-生防细菌抑制病原真菌新机制
- 他考研3次,读博7年,英语极烂,却做出诺奖级成果,并获2020年度“菲列兹·伦敦奖”...
- eclipse导入jar包_在命令行上操作JAR,WAR和EAR
- IntelliJ IDEA sass环境配置及常见报错处理
- 网易笔试——混合颜料
- 无旋treap的简单思想以及模板
- Linux 进程状态【转】
- git 删除分之以及删除文件夹
- linux安装python_如何在 Windows 上安装 Python | Linux 中国
- 计算机默认网络密码是多少,中国电信的默认服务密码是什么
- 云计算和大数据的关系以及区别详细讲解
- Ci522 13.56MHz非接触式读写器芯片--Si522 Lowcost版本
- 阿里云免费SSL证书对IOS描述文件mobileconfig的签名认证
- 数据结构实训——运动会分数统计
- 《无主之地2》已经完工,内容已整理完整封盘送审
- 用计算机亩换算成平方,平方米亩换算(平方米换算亩计算器)
- Html 使用svg图标、iconfont的使用方法
- 程序员生存定律-六个程序员的故事(2) .
- 视觉平衡与物理平衡_设计中的构图平衡,对称与反对称
热门文章
- 关于event.cancelBubble和event.stopPropagation()的困惑
- 阻止冒泡和阻止默认事件——cancelBubble和stopPropagation
- NUIST LevOJ P1857 孤独摇滚
- MFC计算机图形学(2)
- 职场人生|软件测试的伙伴如何迈过瓶颈期?
- scrcpy 使用教程:将安卓设备投屏到 PC 端
- leetcode1049. 最后一块石头的重量 II(java)
- Java面试题2021,华为java工程师工资
- 多类型文件的上传和下载
- javascript面向对象精要学习总结(第二章 函数)