什么是Merkle Tree?

Merkle Tree 的命名来自于美国密码学家Ralph C. Merkle ,关于他的个人资料:传送门https://en.wikipedia.org/wiki/Ralph_Merkle。与前面讲的几种算法不同,Merkle Tree是一种树结构,而并非具体的某种算法。

在具体讲之前,简单说一下哈希算法:

哈希算法是密码学中一种基础的算法,通常的特点:

1.任意的输入值经过哈希算法都能产生固定长度的输出。

2.输入值的微小变化都能导致输出值的巨大变化。

优秀的哈希算法通常还包括不能根据输入推算出输出。这在SHA256中有过介绍。那么Merkle Tree通常也被称做Hash Tree,实际上一个Merkle Tree就是由hash值构成的树结构,可以是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;

下面这张图就是一个典型的Merkle Tree:

通过对A进行hash运算得到的值和B经过一样哈希得到的值在进行一次哈希运算,层层网上,最后只有一个Top hash值。这个值就被称为 merkle root,摩尔根。

Merkle Tree在区块链中的应用

在比特币中,Merkle Tree的每个节点的值都是通过两次SHA256算法得到的:

HA = SHA256(SHA256(Transaction A)),HB = SHA256(SHA256(Transaction B)),

那么HA&B 就是对HA和HB串联起来在进行两次SHA256算法。关于SHA256算法可以学习本系列的第一篇。

都知道区块链是一个个区块连起来的结果,下面是比特币中一个区块的结构:

每个摩尔根是多个交易的集合,区块链中每个摩尔根的值都是唯一的。除此之外,merkle树还提供了一种在比特币网络中快速校验某个交易是否存在的有效途径。

spv节点中merkle的应用

比特币网络中并不是每个节点都包含了全网所有的数据,为了简化支付验证,比特币中存在一种spv节点,该节点不需要备份所有的数据就能验证一笔交易。我们的手机/pad/电脑上安装的很多钱包软件都属于spv节点。spv节点没有存储全网的区块链数据,但是存储了所有的去块头,这就类似于书架上没有存所有的书的内容,但是存储了所有的书的章节目录。SPV节点会收到少于1KB的有关区块头和Merkle路径的数据,其数据量比一个完整的区块(目前大约有1MB)少了一千多倍。减少了存储,又保有了交易的验证资格。

SPV负责判断该交易是否已经得到区块链的节点共识认证以及多少次确认。

比方说想验证下面的H(K)交易是否支付完成:

首先,节点从网络上获取需要验证的交易的认证路径,在节点上生成对应的一个路径,该路径的值就是图中蓝色标示的节点。在路径确认的情况下,节点只需要计算H(KL)、H(IJKL)、H(IJKLMNOP),H(ABCDEFGHIJKLMNOP)的两次hash值,这样得到的一个摩尔根的副本。前面讲过spv节点保存了整个区块链的所有去块头,所以只要拿这个副本和去块头中的摩尔根比较。如果存在就能证明该交易支付成功。

Merkle Tree在其他领域的应用

早在区块链出现之前摩尔树就在各个领域中得到了应用。列如文件下载,目前通常采用HASH值直接验证。但是如果下载的文件比较大,那么用户就需要知道是什么地方的文件下载出错,直接重新下载出错的部分而不需要重新下载全部文件,节省了大量的时间。还有在数字签名上的应用,git版本控制,eth。本质来讲,摩尔根树是通过一个优秀的hash算法不可逆的特性来设计出的一个树结构,在验证某个节点是否存在时节省了大量的计算。由此可见,一些优秀的方法应用并不是需要特别专业的技能,而是需要敏锐的观察和结合知识的能力。所以我们期待,密码学这座宝山,正在熠熠闪光等着广大从业者去开采。

区块链中的密码学(四)- Merkle树和SPV节点的更多相关文章

  1. 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现

    在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...

  2. cpp 区块链模拟示例(七) 补充 Merkle树

    Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...

  3. 区块链中的密码学(二)-RSA算法分析和实现

    密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...

  4. Merkle tree在区块链中的应用

    上篇博文我们转载了一篇<Merkle Tree(默克尔树)算法解析>,那么大家是不是会有疑问,学习这个算法之后,我们改怎么去应用,区块链中又是如何应用的?今天这篇博客就以Merkle tr ...

  5. VRF在区块链中的应用

    最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...

  6. 信息摘要算法之七:SHA在区块链中的应用

    最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...

  7. 【以太坊开发】区块链中的预言机:Oraclize原理介绍

    智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的. 工作原理: 智能合约通过对Oraclize发布一个合约之间的调用请求来 ...

  8. 比特币区块结构Merkle树及简单支付验证分析

    在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...

  9. [转帖]Merkle树

    Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全.一个交易一旦发生那么就是 ...

随机推荐

  1. 一文读懂非关系型数据库(NoSQL)

    为了更好的理解非关系型数据库,我又深入的度娘了下 原文地址:https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&co ...

  2. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  3. 设置android的versionCode

    在config.xml里面设置 android-versionCode="1" AndroidManifest.xml 将会修改 android:versionCode=" ...

  4. [git更新中]版本控制工具git初步使用

    逐渐开始写规模稍大的程序, 如果在像以前一样每写完一次保存一个版本, 修改起来太蛋疼了, 而且还会忘记都有修改过哪里, 最终如果写完的话, 各种不方便, 于是便开始接触版本控制工具. 因为是在Linu ...

  5. cURL使用教程及实例演示

    curl里面的函数不多,主要有: curl_init — 初始化一个CURL会话curl_setopt — 为CURL调用设置一个选项curl_exec — 执行一个CURL会话curl_close ...

  6. asp.net的验证码插件及方法、ashx验证码一般处理程序

    需要引入一个ashx的一般处理程序! 把这个程序在前台当作一个图片使用就可以! 前台代码: <td> <img title="看不清?" style=" ...

  7. request 10.0 模块安装

     https://pypi.python.org/packages/49/6f/183063f01aae1e025cf0130772b55848750a2f3a89bfa11b385b35d7329d ...

  8. 第三天:Servlet运行原理

    1.  如何不重启tomcat就可以重新加载一个web应用?? 方法:进入tomcat的manager之后点击reload即可. 2.开发一个Servlet,该Servlet可以输出自己的名字并显示当 ...

  9. [codevs1159]最大全0子矩阵(悬线法)

    解题关键:悬线法模板题.注意此模板用到了滚动数组. #include<cstdio> #include<cstring> #include<algorithm> # ...

  10. 按钮控件JButton的使用

    ---------------siwuxie095                             工程名:TestUI 包名:com.siwuxie095.ui 类名:TestButton. ...