什么是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. uboot指令和环境变量

    一.uboot指令 1.printenv(pri) - 打印环境变量 2.setenv - 设置环境变量,和saveenv 配合使用 3.saveenv - 保存环境变量 4.run - 执行设置好的 ...

  2. AngularJS核心特性(四大点)

    本人刚刚接触AngularJS,还不太熟悉,就说说我目前遇到的一些注意点吧. 1.调用外来文件script文件 AngularJS核心特性一  MVC MVC设计模式 html文件 <!DOCT ...

  3. 关于java中getClass()和getSuperClass()的讲解

    为了讲解这个问题,我们先来看一下下面的代码: package com.yonyou.test; import java.util.Date; class Test extends Date{ priv ...

  4. altium designer 中器件原理图库中,将一个器件分成几部分是如何操作的?就是如何用part表示?

    在SCH Library的Components中选中你要添加part的器件,tools菜单--new part即可

  5. 【转】前端上传组件Plupload使用指南

    http://www.cnblogs.com/2050/p/3913184.html Plupload有以下功能和特点: 1.拥有多种上传方式:HTML5.flash.silverlight以及传统的 ...

  6. c语言-树的基础知识

    第一.树的定义:   1.有且只有一个称为根的节点   2.有若干个互不相交的子树,这些子树本身也是一颗树 第二.专业术语: 树的深度:从根节点到最低层,节点的层数 ,称之为树的深度.  根节点是第一 ...

  7. 2016.5.30实现透明Panel及控件置顶的方法

    想放置一个透明Panel在某控件上端,实现效果是可透过此Panel看见下面控件,但鼠标点击却无任何反应. 1.新建置自定义Panel类 using System; using System.Colle ...

  8. Solaris10如何确认DirectIO是否已经启用

    对于Oracle而言,如果数据库存储在UFS文件系统上,启用DirectIO能够提高数据库性能.Oracle有个参数filesystemio_options可以控制数据库是否使用DirectIO.  ...

  9. SqlServer——事务一编程进阶(SqlServer技术内幕 T-SQL程序设计 第九章

    事务格式如下: 1.开启事务: begin tran 2.提交事务:commit tran 3.回滚事务:rollback tran 判断事务是提交还是应该回滚有两种方式,一是全局变量 @@error ...

  10. 【Android异常】The specified child already has a parent. You must call removeView() on the child's parent first.

    错误信息: Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must ...