我们为啥又聊 Merkle Tree 呢? 地球上大部分人应该连它的名字都没有听过。Merkle Tree 是由计算机科学家 Ralph Merkle 在很多年前提出的,并以他本人的名字来命名,中文翻译过来叫默克尔树,也叫哈希树。Merkle Tree 号称区块链面试必考题,因为的确太常用了。说到根本上 Merkle Tree 就是用来做完整性校验的,所谓的完整性校验,就是检查一下数据有没有损坏或者被恶意篡改Merkle Tree 的最大的应用场合就是在点对点网络上,Git 版本控制系统,IPFS 协议以及比特币以太坊等等项目,都用到了它。

一. 哈希 Hash

Merkle Tree 如果直接去看定义,会看到一张比较复杂的图,可能会把你一下子吓到,然后就不想学了。但是别忘了,Merkle Tree 还有另外一个名字,叫哈希树。这里,我会先讲哈希,再讲什么是哈希列表,最后在递进到哈希树,这样三步下来,每一步都其实很好理解,保证你能一下子就掌握 Merkle Tree 的概念。

先介绍什么是哈希。其实要实现完整性校验,最简单的方法就是对要校验的整个的数据文件做个哈希运算,把得到的哈希值公布在网上,这样我们把数据下载到手之后,再次运算一下哈希值,如果运算结果相等,就表示我们下载过程中文件没有任何的损坏。因为哈希的最大特点是,如果数据稍微变了一点点,那么经过哈希运算,得到的哈希值将会变得面目全非。没有人可以把数据篡改了,同时还能保证数据的哈希不变。

这种简单的采用哈希的方式做数据运算,比较适合数据本身不做分割,同时是放在一台服务器上的情况。例如,如果去某个公司网站上去下载他们的一个软件,就会看到公司网站上公布了这个下载包的哈希值,这个哈希值非常重要,因为有了这串数,我们就可以放心的去下载这个软件,下载完做一下完整性校验,就知道这个软件没有损坏。甚至可以放心从其他的不可信网站上去下载这个软件包,因为有了校验机制,也一样可以保证这个包是跟官方的包丝毫不差的。

二. 哈希列表 Hash List

但是在去中心化网络,或者叫点对点网络上,数据往往都是拆分成很多小碎片去下载的,而且其中很多机器可以认为是不稳定或者是不可信的,这时需要有更加巧妙的做法。最简单的方式就是用 Hash List ,也就是哈希列表。

实际中,点对点网络在传输数据的时候,其实都是把比较大的一个文件,切成小的数据块。这样的好处是,如果有一个小块数据在传输过程中损坏了,那我只要重新下载这一个数据块就行了,不用重新下载整个文件。当然这就要求对每个数据块计算哈希值,所有这些小数据块的哈希值都是兄弟关系,这样大家就组成了一个哈希列表。BT 下载的时候,在下载真正的数据之前,会先下载一个哈希列表的,这个就是所谓的种子文件。有了各个 hash 之后,数据本身就可以从任意的机器上下载了,不用管那些机器是否是安全可信的。

这时有一个问题就出现了,那么多的哈希,我们怎么保证它们本身都是正确地呢?

答案是我们需要一个根哈希,根就是树根的根。把每个小块的哈希值拼到一起,然后对整个这个长长的字符串再做一次哈希运算,最终的结果就是哈希列表的根哈希。于是,如果我们能够保证从一个绝对可信的网站,或者从我们的朋友手里拿到一个正确的根哈希,就可以用它来校验哈希列表中的每一个哈希都是正确的,进而可以保证下载的每一个数据块的正确性了。

Hash List 也就是哈希列表形式,就非常适合在点对点网络上存储的大型数据了。

三. Merkle Tree 哈希树

其实 Merkle Tree 本身也算是一个哈希列表,只不过是在这个基础上又引入了树形结构,从而获得了更高的灵活性。

我们先说计算机科学中的树的概念,树跟自然界一棵树有着类似的结构,只不过计算机科学中的树通常都是倒着画,根在上面,然后一路往下开枝散叶。举一个最简单的例子,所有的文件都存放在一个文件夹中,这个文件夹就叫根文件夹,根就是树根的意思,这个文件夹又会包含其他文件夹,子文件夹中又会包含孙子辈的文件夹。这样层层的包含或者说从属关系,画成图就是一棵倒挂的树,而这个结构就是计算机科学中随处可见的树的概念,怎么样,简单吧?

然后就说到主角 Merkle Tree 了。在最底层,和哈希列表一样,我们把数据分成小的数据块,有相应地哈希和它对应。但是往上走,并不是直接去运算根哈希,而是把相邻的两个哈希合并成一个字符串,然后运算这个字符串的哈希,这样每两个哈希就结婚生子,得到了一个”子哈希“。如果最底层的哈希总数是单数,那到最后必然出现一个单身哈希,这种情况就直接对它进行哈希运算,所以也能得到它的子哈希。于是往上推,依然是一样的方式,可以得到数目更少的新一级哈希,最终必然形成一棵倒挂的树,到了树根的这个位置,这一代就剩下一个根哈希了,我们把它叫做 Merkle Root。需要补充一下的是,根哈希有时候也叫主哈希 Master Hash ,也有人叫它顶哈希 Top Hash ,因为画图的时候通常都是倒着画这根树,反正不管叫什么,说的都是一个东西。

于是我们看到 Merkle Tree 比普通的哈希列表稍微复杂了一点点,那么优点是什么呢?相对于 Hash List,Merkle Tree 的明显的一个好处是可以单独拿出一个分支来(作为一个小树)对部分数据进行校验,这给很多使用场合就带来了哈希列表所不能比拟的灵活和高性能。

Merkle Tree 是三个概念的叠加,一个是哈希,第二个是哈希列表,第三个是树。

四. 总结

本节的内容就是为了讲清楚 Merkle Tree 这个概念,内容差不多了,来总结一下。哈希和树都是计算机科学中最基础最重要的两个概念,可以用在很多不同场合。单个哈希不能担当大文件在分布式点对点网络上的校验工作,于是我们有了哈希列表的概念。 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. 百度:I am from China, wait, am I?
  2. 实时搜索 elasticsearch vs solr
  3. P3293 [SCOI2016]美味 主席树 + 伪01trie
  4. 山体等高线怎么看_每日一题 | 此处向斜山,你看出来了吗?
  5. Mysql系列:高可用(HA)-keeplived
  6. java 等待线程结束 框架_深入理解Java多线程与并发框架——线程的状态
  7. java 找出调用的方法_如何找到用Java调用给定方法的所有方法?
  8. MyBatis源码阅读(十二) --- Spring加载MyBatis过程
  9. 皇帝的新脑-读书笔记
  10. python 快递分拣小程序
  11. 国内互联网大数据的发展现状和应用
  12. R语言使用oneway.test函数执行单因素方差分析(One-Way ANOVA)、使用aov函数执行单因素方差分析(aov函数默认组间方差相同)
  13. 本地安装brat标注平台
  14. 进阶篇:2)DFMA方法的运用
  15. 孙子兵法 三十六计(猫鼠版)
  16. 【java校招你不知道的那些事儿】校招和社招的区别是什么?为什么不参加社招
  17. vue使用阿里云视频点播
  18. 在.net gridview 更新回oracle数据库,.net 连接Oracle操作 - cathy_10 - 博客园
  19. eclipse导入工程报错Faceted Project Problem(1 item)
  20. Win7 注册ocx控件 “DllRegisterServer的调用失败,错误代码为0x80040200 ”

热门文章

  1. 2018年2月16日训练日记
  2. 第69页的gtk+编程例子——工具提示
  3. java题excel地址,(Java实现)蓝桥杯Excel地址
  4. 【Unity2D】实现人物跳跃二段跳以及掉落的动画和代码
  5. JAVA基于百度云文字(车牌、身份证、图片)识别提取
  6. Python最大的特点
  7. Rhodamine-PEG-Thiol,罗丹明B可以很容易追踪粉红色和红色荧光,罗丹明PEG巯基
  8. Adobe illustrator里边的蒙版是什么概念,怎么理解
  9. 关于Typora编辑器编写markdown文档的代码块出现前字吞后字的解决方法
  10. Mybatis 框架