什么是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. Windows Server 2008 R2换SID要注意

    今天刚装Windows2008R2,准备做实验.同样,我对虚拟机采用了母盘和差异磁盘.在新建好的虚拟机上使用NewSID执行更新SID操作时,一切正常,但当更新完并重启进入系统后,竟然蓝屏了.   原 ...

  2. Windows:cmd的使用

    1.如果在cmd.exe中无法运行软件(如python),因为在系统的环境变量中,path中没有该软件的安装路径: 2.通过pip安装软件:pip install 文件路径\文件全名,将软件安装在指定 ...

  3. mycat sequence

    数据库方式原理在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设 ...

  4. python with open as f 写韩文中文乱码

    python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...

  5. a(+;-;*;/)b-----demo----bai

    页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&qu ...

  6. 第十六章 Velocity工作原理解析(待续)

    Velocity总体架构 JJTree渲染过程解析 事件处理机制 常用优化技巧 与JSP比较 设计模式解析之合成模式 设计模式解析之解释器模式

  7. 问题:c# json解析;结果:c# 解析JSON的几种办法

    c# 解析JSON的几种办法 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => Da ...

  8. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  9. java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

    执行Hive查询: Console是这样报错的 java.sql.SQLException: Error from org.apache.hadoop.hive.ql.exec.mr.MapRedTa ...

  10. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...