区块链中的密码学(四)- Merkle树和SPV节点
什么是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节点的更多相关文章
- 区块链中的密码学(-)区块链中运用最广的散列算法-SHA256算法分析与实现
在很多技术人员的眼中,区块链并不是一种新的技术,而是过去很多年计算机技术的组合运用.而在这个方方面面技术的运用上,基于密码学的加密算法可以说是区块链各种特点得以表现的根本,一旦目前使用的加密算法被证实 ...
- cpp 区块链模拟示例(七) 补充 Merkle树
Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...
- 区块链中的密码学(二)-RSA算法分析和实现
密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...
- Merkle tree在区块链中的应用
上篇博文我们转载了一篇<Merkle Tree(默克尔树)算法解析>,那么大家是不是会有疑问,学习这个算法之后,我们改怎么去应用,区块链中又是如何应用的?今天这篇博客就以Merkle tr ...
- VRF在区块链中的应用
最近区块链领域流行了一种"怪病",许多区块链项目或者设计方案都加入了一个叫做VRFs的算法.那么, (1) 什么是VRFs? (2) VRFs在区块链中解决了什么问题? 本文旨在介 ...
- 信息摘要算法之七:SHA在区块链中的应用
最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...
- 【以太坊开发】区块链中的预言机:Oraclize原理介绍
智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的. 工作原理: 智能合约通过对Oraclize发布一个合约之间的调用请求来 ...
- 比特币区块结构Merkle树及简单支付验证分析
在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...
- [转帖]Merkle树
Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全.一个交易一旦发生那么就是 ...
随机推荐
- DCloud-HBulder:杂项
ylbtech-DCloud-HBulder:杂项 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- libstdc++.so.6
libstdc++.so.6遇到的问题: 1.提示version `GLIBCXX_3.4.14' not found /usr/lib64/libstdc++.so.: version `GLIBC ...
- 11-02SQLserver基础--字符串函数
数据库の函数 一.内置函数--字符串函数 1.--ASCII 返回字符串的首字母的ASCII编码 select ASCII('ame') select ASCII(xingming)from xues ...
- Hbase优化记录
<configuration><property><name>hbase.rootdir</name><value>hdfs://gagcl ...
- 基于ActiveMQ的Topic的数据同步——初步实现
一.背景介绍 公司自成立以来,一直以做项目为主,算是经累经验吧,自去年以来,我们部门准备将以前的项目做成产品,大概细分了几个小的产品,部们下面又分了几个团队,分别负责产品的研发,而我们属于平台团队,负 ...
- day70 12-存储过程和存储函数
什么是相关子查询? 这是一个子查询,子查询本身又是一个多表查询.where不能用组函数,但是可以用字符函数instr().除了order by排序没有考,查询语句的所有内容都考了.这个题有点难度. 今 ...
- codeforces 1064D 双端队列BFS
双端队列BFS解决的就是路径权值可能为0的图最短路问题,权值为0插入队头,否则插入队尾. 对于这个题,可以看作上下移动的路径的权值为0,左右移动权值为1,而且不能超过规定的步数. 直接广搜求覆盖的点的 ...
- Condition实现一个生产者一个消费者
Condition实现一个生产者一个消费者,实现一对一交替打印: import java.util.concurrent.locks.Condition; import java.util.concu ...
- Mac OS X 安装教程
1)10.8.3 http://bbs.pcbeta.com/viewthread-1317754-1-1.html 2)10.9 http://blog.csdn.net/kissing_huo/a ...
- p3163 [CQOI2014]危桥
传送门 分析 代码 #include<iostream> #include<cstdio> #include<cstring> #include<string ...