Merkle Tree

Merkle Tree 是由计算机科学家 Ralph Merkle 在很多年前提出的,并以他本人的名字来命名。通常也被称作Hash Tree,就是存储hash值的一棵树。Merkle树的叶子是数据块的hash值。非叶节点是其对应子节点串联字符串的hash。
merkle tree(变体例如 merkle patricia tree:MPT)广泛地应用于比特币,以太坊,fabric等区块链项目上;也广泛地应用于一致性验证,数据校验,数据同步等服务中。

比特币与merkle tree

SPV

完整的比特币数据库(也就是区块链)已截止本文超过 200 GB 。因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本。随着越来越多的人使用比特币,这条规则使得开销非常大,所以不太可能每个人都去运行一个全节点。由于节点是网络中的完全参与者,它们负有相关责任:节点必须验证交易和区块。

另外,要想与其他节点交互和下载新块,也有一定的网络流量需求。中本聪的比特币原始论文中,对这个问题也有一个解决方案:简易支付验证(Simplified Payment Verification, SPV)。轻钱包并不保存完整的区块链,而是只保存每一个区块的区块头。区块体保存了完整的交易信息,而交易信息需要的存储量大部分都是交易头的千倍以上。所以,如果只保存交易头,就可以极大的减少本地客户端存储的区块链信息。

如果这个时候SPV要对某一个交易进行验证,而本地又没有这个交易的信息,那怎么验证呢?这时,区块头里面的merkle root,以及区块对应的merkle tree就要起作用了。

比特币用 Merkle tree来获取交易哈希,哈希被保存在区块头中,并会用于工作量证明系统。每个块都会有一个 Merkle 树,它从叶子节点(树的底部)开始,一个叶子节点就是一个交易哈希(比特币使用双 SHA256 哈希)。叶子节点的数量必须是双数,但是并非每个块都包含了双数的交易。因为,如果一个块里面的交易数为单数,那么就将最后一个叶子节点复制一份凑成双数。

Merkle 树的好处就是一个节点可以在不下载整个块的情况下,验证是否包含某笔交易。并且这些只需要一个交易哈希,一个 Merkle 树根哈希和一个 Merkle 路径。

验证交易真实性

在比特币网络中的交易,只有已经被记录到区块链,并且已经得到6个确认的,才被认为是真实的,只有基于这些真实交易发起的新交易(输入与输出的概念),才是合法的。
交易真实性前提:

  • 交易是否已被记录到区块链中
  • 交易所在的区块链是最长的一条,没有在分叉链上
  • 每个节点接收到一条交易广播时,要查询作为一笔新交易的输入的真实性
  • 矿工对交易进行打包之前,对所有的输入进行真实性验证

全节点: SPV会把该交易信息向一个全节点发送merkle block message的请求,全节点会利用传过来的交易信息在自己的区块链数据库上查询,得到交易对应的区块,此时可以获得该区块的merkle tree, 再通过遍历的方法把该交易的验证路径生成并发给SPV。

SPV 收到返回时,会把该交易的hash值和验证路径的hash值会做一次merkle校验,如果和可信的merkle root hash (从全节点对应的区块上获取)一致,则认为该交易是可信的。

例子:验证data1。 如图,验证路径为黄色节点,虚线部分是计算出的节点,然后和merkle root:0123比较,他们是一致的,所以data1是存在的,可信的。

fabric与merkle tree

在fabric1.2中,block 结构中,blockHeader中的datahash把blockdata的bytes采用sha256得出,其中涉及到merkle tree暂时并没有实现。
在fabric0.6中的世界状态采用bucket tree来组织,但是在fabric1.0以后随着pbft一起删掉了。
在这里既然没有采用,就不在细述。

以太坊与merkle tree

以太坊中采用了Merkle tree 与 Patricia Tree,即MPT。这部分阅读以太坊源码后再进行分析。

Merkle Tree操作示例代码

package mainimport ("crypto/sha256""fmt"
)type MerkleTree struct {RootNode *MerkleNode
}type MerkleNode struct {Left  *MerkleNodeRight *MerkleNodeData  []byte
}func NewMerkleNode(left, right *MerkleNode, data []byte) *MerkleNode {mNode := MerkleNode{}if left == nil && right == nil {hash := sha256.Sum256(data)mNode.Data = hash[:]} else {var data []byteif right != nil {data = append(left.Data, right.Data...)} else {data = left.Data}hash := sha256.Sum256(data)mNode.Data = hash[:]}mNode.Left = leftmNode.Right = rightreturn &mNode
}func NewMerkleTree(data [][]byte) *MerkleTree {var nodes []MerkleNodeif data == nil {fmt.Print("args error")}if len(data)%2 != 0 {data = append(data, data[len(data)-1])}for _, idata := range data {node := NewMerkleNode(nil, nil, idata)nodes = append(nodes, *node)}for i := 0; i < len(data)/2; i++ {var fathernodes []MerkleNodeif len(nodes) == 1 {break}for j := 0; j < len(nodes); j += 2 {if j+1 >= len(nodes) {node := NewMerkleNode(&nodes[j], nil, nil)fathernodes = append(fathernodes, *node)} else {node := NewMerkleNode(&nodes[j], &nodes[j+1], nil)fathernodes = append(fathernodes, *node)}}nodes = fathernodes}mTree := MerkleTree{RootNode: &nodes[0],}return &mTree
}

区块链与merkle tree相关推荐

  1. 区块链六-Merkle Tree

    2019独角兽企业重金招聘Python工程师标准>>> 基于Java语言构建区块链(六)-- 交易(Merkle Tree) Posted on 2018-03-26 |  In b ...

  2. [区块链] 密码学——Merkle 树

    在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是 ...

  3. 七、区块链如何运用merkle tree验证交易真实性

    转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证. Merkle Tre ...

  4. layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性

    大部分材料都会提到区块中保存了merkle根,并且利用它作交易真实性验证.但是具体如何作这个真实性验证,没有一篇文章可以通俗的讲出来.本文假设你已经知道区块链中merkle tree的原理,现在想搞明 ...

  5. 区块链系列教程之:比特币中的网络和区块链

    文章目录 简介 比特币的网络 网络发现与同步 SPV节点 区块链头 Merkle Tree 比特币中的区块链 区块标识符 创世区块 总结 简介 比特币的底层就是区块链技术,区块链也是因为比特币而广为人 ...

  6. 北大肖臻老师《区块链技术与应用》系列课程学习笔记[1]Bitcoin中用到的密码学原理和数据结构

    目录 一.比特币系统中用到的密码学原理 1.什么是比特币 2.哈希函数 3.非对称密码体系 4.数字签名 二.比特币中的数据结构--哈希指针和Merkle Tree 1.哈希指针 2.区块链 3.Me ...

  7. 区块链学习三——比特币的数据结构

    区块链学习三--比特币的数据结构 文章内容来源于北京大学肖臻老师<区块链技术与应用>公开课 文章目录 区块链学习三--比特币的数据结构 一.哈希指针(hash pointers) 二.区块 ...

  8. 哈希函数在区块链中的应用

    哈希指针 除了保存结构体在内存中的位置还要保存结构体的哈希值. 好处:不只可以找到结构体的位置,还可以检测这个结构体的哈希值. 区块链和普通链表的主要区别就在于用哈希指针代替了普通的指针. 识别区块数 ...

  9. Merkle Tree 概念

    Merkle Tree 概念 来源 https://www.cnblogs.com/fengzhiwu/p/5524324.html /*最近在看Ethereum,其中一个重要的概念是Merkle T ...

最新文章

  1. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
  2. vmware响应时间过长_性能调优高并发下如何缩短响应时间
  3. 计算机科学与技术历史步伐,计算机科学与技术1001班先进班级体申报材料.pdf
  4. 输入字符和数字 java,验证输入仅为字符串,数字仅为JAVA
  5. C#操作Office.word(三)
  6. java实现驾校考试系统_jsp驾校考试系统
  7. JAVA入门级教学之(方法-7)
  8. 实验六 调用函数 判断素数
  9. python 调用 C++ code
  10. Nginx高可用-Keepalived
  11. Markdown编辑器
  12. 非监督分类ecognition_ENVI遥感影像土地利用分类说明
  13. 数学建模MATLAB难不难,如何才能在数学建模竞赛中取得好成绩
  14. python用Selenium爬取携程网机票信息
  15. 澄清server push/websocket/sse的一些概念
  16. 出海竞争加剧,全球头部秀场直播平台LiveMe如何应对新挑战?
  17. 7-56 福到了 (15 分)
  18. 维特比算法(Viterbi algorithm) 的理解
  19. ant 的详细的入门教程
  20. JAVA基础(完结版)

热门文章

  1. 将复制文件ExtremeCopy整合到TC(Total commander)中
  2. Windows电脑键盘快捷键大全【最全的快捷键】
  3. 为什么直通车关键词点击率和转化率会低
  4. 字符串翻译python_字符串的这个东西-翻译表
  5. 智慧城市水质在线蓝绿藻监测传感器
  6. Cesium对三维模型建模的要求(建模人员必读)
  7. java计算点在圆内外_Java—PTA 点是否在圆内?
  8. Kylin cuboid算法修改
  9. Mac系统下TeXStudio中文显示的问题
  10. 用半角的特殊符号代替全角的特殊符号