MerkleTree
一、什么是MerkleTree
MerkleTree,是一种树(数据结构中所说的树),网上大都称为MerkleHashTree,这是因为它所构造的MerkleTree的所有节点都是Hash值。MerkleTree具有以下特点:
1.它是一种树,可以是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;
2.Merkle树的叶子节点上的value,是由你指定的,这主要看你的设计了,如MerkleHashTree会将数据的Hash值作为叶子节点的值;
3非叶子节点的value是根据它下面所有的叶子节点值,然后按照一定的算法计算而得出的。
在特币网络中, Merkle树被用来归纳一个区块中的所有交易, 同时生成整个交易集合的数字指纹, 且提供了一种校验区块是否存在某交易的有效效途径。 生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希, 并将新生成的哈希节点插入到Merkle树中, 直到只剩一个哈希节点, 该节点就是Merkle树的根。 在比特币的Merkle树中两次使用到了SHA256算法, 因此其加密哈希算法也被称为double-SHA256。
当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中, 这使得该数据结构非常有效。
Merkle树是自底向上构建的。 在如下的例子中, 我们从A、 B、 C、 D四个构成Merkle树树叶的交易开始,如下图。起始时所有的交易都还未存储在Merkle树中,而是先将数据哈希化, 然后将哈希值存储至相应的叶子节点。 这些叶子节点分别是HA、 HB、 HC和HD:
H~A~ = SHA256(SHA256(交易A))
通过串联相邻叶子节点的哈希值然后哈希之, 这对叶子节点随后被归纳为父节点。 例如, 为了创建父节点HAB, 子节点A和子节点B的两个32字节的哈希值将被串联成64字节的字符串。 随后将字符串进行两次哈希来产生父节点的哈希值:
H~AB~=SHA256(SHA256(H~A~ + H~B~))
继续类似的操作直到只剩下顶部的一个节点, 即Merkle根。 产生的32字节哈希值存储在区块头, 同时归纳了四个交易的所有数据。
二、 Merkle Tree的应用
2.1对比与验证
目前, 在计算机领域,Merkle Tree大多用来进行比对以及验证处理。比在处理比对或验证的应用场景中时,特别是在分布式环境下进行比对或验证时,Merkle Tree会大大减少数据的传输量以及计算的复杂度。例如,假如是 15,16.......30是一个个数据块的hash值,我把这些数据从A传输到B,数据传输到B后,我想验证下传输到B上的数据的有效性型(验证数据是否在传输过程中发生变化),只需要验证A 和 B上所构造的Merkle。
Tree的root节点值是否一致即可,如果一致,表示数据是有效的,传输过程中没有发生改变。假如在传输过程中,15对应的数据被人篡改,通过Merkle Tree很容易定位找到(因为此时,节点0,1,3,7,15对应的hash值都发生了变化),定位的时间复杂度为O(log(n))。
2.2认证
为了证明区块中存在某个特定的交易,一个节点只需要计算log2(N)个32字节的哈希值, 形成一条从特定交易到树根的认证路径或者Merkle路径即可。 随着交易数量的急剧增加, 这样的计算量就显得异常重要, 因为相对于交易数量的增加, 以基底为2的交易数量的对数的增长会缓慢许多。 这使得比特币节点能够高效地产生一条10或者12个哈希值( 320-384字节) 的路径, 来证明了在一个巨量字节大小的区块中上千交易中的某笔交易的存在。
在下图中,一个节点能够通过生成一条仅有4个32字节哈希值长度( 总128字节) 的Merkle路径, 来证明区块中存在一笔交易K。该路径有4个哈希值(在图7-5中由蓝色标注) HL、 HIJ、 HMNOP和HABCDEFGH。 由这4个哈希值产生的认证路径,再通过计算另外四对哈希值HKL、 HIJKL、 HIJKLMNOP和Merkle树根( 在图中由虚线标注) , 任何节点都能证明HK( 在图中由绿色标注) 包含在Merkle根中。
如何认证:
1.准备阶段:得到Merkle认证路径,即蓝色标注;
2.计算阶段:
a.由HK(待验证的节点)和认证路径中的HL计算可以得到HKL;
b.由HKL和认证路径中的HIJ可以得到HIJKL;
以此类推可以得到根,只要比较根的大小,就可以知道HK是否在这个区块中了。
MerkleTree相关推荐
- MerkleTree 构建QT实现UI
MerkleTree 构建QT实现UI 区块链学习笔记(三) 使用qt实现Merkle Tree构造以及存在性验证 目录 MerkleTree 构建QT实现UI 前言 一.树上存在 二.树上不存在 三 ...
- 用零知识证明解决投票安全
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 背景 我们经常会遇到需要给别人投票的情况,比如有些公司会组织员工给领导做反向打分,但是往往员工都不敢"真心实意 ...
- 零知识证明实践教程,第二部分
本文是零知识证明简单实践教程的第二部分, 第一部分见:零知识证明第一部分 第三部分见:零知识证明第三部分 现在一个问题是,prover(证明者)可能撒谎,比如原本它应该向verifier(验证者)揭露 ...
- Cassandra使用的各种策略
1. 背景介绍 Cassandra 使用分布式哈希表(DHT)来确定存储某一个数据对象的节点.在 DHT 里面,负责存储的节点以及数据对象都被分配一个 token.token 只能在一定的范围内取值, ...
- cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
四.副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中. Cassandra有三种副本配置策略: 1) SimpleStrategy (Rac ...
- Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...
转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ...
- 基于Java语言构建区块链(六)—— 交易(Merkle Tree)
基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...
- 跨链Cosmos(7)普通交易流程
1. 普通交易 Cosmos的普通交易和以太坊类似,也是一个帐户模型,有着From,To和Amount关键字段. 1.1 Msg结构 type MsgSend struct { FromAddress ...
- 用Go语言建立一个简单的区块链part6(2):交易(2)
交易(2) 引言 在这个系列文章的一开始,我们就提到了,区块链是一个分布式数据库.不过在之前的文章中,我们选择性地跳过了"分布式"这个部分,而是将注意力都放到了"数据库& ...
最新文章
- redis桌面管理工具 redis-desktop-manager使用指南(转)
- Design verification经验总结
- XMPP键盘订制实现图文混排
- Idea 插件 lombok 的安装和使用
- 【知乎摘要】女生婚前应该清楚男友哪些方面了才能嫁给他
- 三维卷积神经网络预测MNIST数字详解
- leetcode—25.链表排序题目leetcode总结
- 大数据毕设/课设 - 基于大数据的通用可视化模板
- Highcharter绘制中国地图
- 如何下载centos7的iso文件
- SOLIDWORKS教程:solidworks常用技巧大全
- 【Web】CSS(No.18)Css经典案例(二)《畅销书排行榜》
- 微软苏州2018冬季实习面试经历
- 【转】悟空,你变成避孕套吧,今天为师要亲自收拾这个女妖精
- 游戏原画和3D游戏建模,哪个更胜一筹?
- mysql如何查看事务日记_Mysql事务和Mysql 日志
- 怎样将好多个字符串组装成一个数组
- 【?】【9908】守望者的逃离
- Android Training Note
- smart200+步进控制
热门文章
- 高考考了657分想重新复读一年,又害怕白费一年
- libnuma.so.1()(64bit) is needed by mysql-community-server-5.7.9-1.el6.x86_64
- htmlparser的使用java_java htmlparser 简单使用入门
- 【Python】实训7:航空公司客户价值分析(K-means聚类)
- 如何利用Xshell 5对服务器进行远程访问 (妈妈再也不用担心我在家还不学习了系列一)
- Rising Temperature
- c++ 字符串转换函数---atof()函数详解
- 我的位置定位服务器,定位我现在的位置
- 自助取款机(ATM)与自助存款机(CDM)工作原理
- HDU-2066 一个人的旅行(dijkstra)