Golang Merkle tree

个人博客:https://www.huixinyixiao.xn–6qq986b3xl/

Golang 实现Merkle 树

实现Merkle树,需要使用:

"github.com/cbergoon/merkletree"

这个package中含有构造函数,以及接口函数,所有,通过这个包实现Merkle树的相关操作,是很好的。
官方实例代码

// 在这里编写代码
package mainimport ("crypto/sha256""github.com/cbergoon/merkletree""log"
)//TestContent implements the Content interface provided by merkletree and represents the content stored in the tree.
type TestContent struct {x string
}//CalculateHash hashes the values of a TestContent
func (t TestContent) CalculateHash() ([]byte, error) {h := sha256.New()if _, err := h.Write([]byte(t.x)); err != nil {return nil, err}return h.Sum(nil), nil
}//Equals tests for equality of two Contents
func (t TestContent) Equals(other merkletree.Content) (bool, error) {return t.x == other.(TestContent).x, nil
}func main() {//Build list of Content to build treevar list []merkletree.Content/*测试文件*/var list02 []merkletree.Contentlist02 = append(list02, TestContent{"shan"})list = append(list, TestContent{x: "Hello"})list = append(list, TestContent{x: "Hi"})list = append(list, TestContent{x: "Hey"})list = append(list, TestContent{x: "Hola"})//Create a new Merkle Tree from the list of Contentt, err := merkletree.NewTree(list)if err != nil {log.Fatal(err)}//Get the Merkle Root of the treemr := t.MerkleRoot()log.Println("Merkle Root:", mr)//Verify the entire tree (hashes for each node) is validvt, err := t.VerifyTree()if err != nil {log.Fatal(err)}log.Println("Verify Tree: ", vt)//Verify a specific content in in the treevc, err := t.VerifyContent(list02[0])if err != nil {log.Fatal(err)}log.Println("Verify Content: ", vc)//String representationlog.Println(t)
}

Note:我改变了验证的信息内容(list02),为了验证这个package 可用性。

1. 源package 解读

在package 中的interface,需要实现两个函数

//Content represents the data that is stored and verified by the tree. A type that
//implements this interface can be used as an item in the tree.
type Content interface {CalculateHash() ([]byte, error)Equals(other Content) (bool, error)
}

只是代码实现中需要注意的,可以添加自己实现的算法,比如更改sha256等。
其他函数的调用,不需要做任何改变,直接调用就好。

从上图中可以看出对于所有的交易数据,都是叶子,并且,如果添加的交易数是奇数,也就是黄色区域表示的那样,那么,就会复制最后一个交易,形成偶数个交易数,也就是最后的两个交易其实是一样的。

2. 查询数据路径,重新构造Merkle tree ,看看和我们想的是否一样。

通过插入四个数据:

func appendListData(number int) {//  随机产生数据for i := 0; i < number; i++ {nodeId := "hello" + strconv.Itoa(i)list = append(list, TestContent{nodeId})}}

上述代码,实现插入数据的功能。
主函数里面直接调用。另外需要将list全局声明。我们查询两个数据hello0和hello1的路径,此时,设置number为4:

从红色区域可以知道,两个叶子节点的父节点是一样的,也就是hello0和hello1叶子共同hash得到。
我们再次查询两个数据hello2和hello3的路径,此时,同样设置number为4:

看,结果如我们所说的那样。
如果我们将上面的两个图中的红色的数据进行hash,一定是root hash。

Golang --Merkle tree相关推荐

  1. Merkle Tree(梅克尔树)算法解析

    Merkle Tree概念   Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...

  2. 基于Java语言构建区块链(六)—— 交易(Merkle Tree)

    基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...

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

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

  4. 区块链六-Merkle Tree

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

  5. merkle tree(hash tree)

    merkle tree即为hash tree,以下都用hash tree表示. hash tree使得可以对大型数据结构的内容进行有效且安全的校验. hash tree是hash list和hash ...

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

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

  7. Merkle Tree(默克尔树)原理解析

    Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...

  8. 以太坊Eth2 deposit merkle tree

    1. 引言 以太坊2.0(Eth2)采用sharded PoS协议,在早期阶段(名为Phase 0),与现有的PoW链(名为Eth1链)并行运行.Eth1由miners驱动,而PoS链(又名Beaco ...

  9. Sparse Merkle Tree

    1. 引言 前序博客有: Merkle tree及其在区块链等领域的应用 Merkle tree proof 2. Merkle tree Merkle tree可看成是对一组数据的密码学承诺,类似: ...

最新文章

  1. python 更新pip 失败问题总结
  2. CSS学习之多类别选择器
  3. “兴趣社区2.0”俘获年轻人
  4. 英特尔首推物联网云平台设备管理
  5. Ajax POST请求获取后台返回的数据
  6. java的excel导出_java 实现excel 导出功能
  7. CVE-2013-4547 文件名逻辑漏洞
  8. nuxt添加.html,Nuxt内导航栏的两种实现方式
  9. DELPHI TreeView 文件目录树和 设置节点图标 完整
  10. 阿里云mysql写入性能_如何评价阿里云新一代关系型数据库 PolarDB?
  11. GitHub CEO 回应源代码泄露:没有黑客!没有被入侵!
  12. 台式计算机计量单位,计算机常见计量单位解析
  13. oracle数据库怎么查实例名,查询oracle数据库实例的名字
  14. 深度学习环境配置:2080Ti+Ubuntu16.04+CUDA10+cuDNN7.3+TensorFlow-gpu1.12
  15. clt用MeGUI处理切割音频
  16. 电源管理IC临近爆发,详解四大市场趋势
  17. 解决mysql插入中文出现错误ERROR 1366 (HY000): Incorrect string value: ‘\x80\x85\xEF\xBC\x8C\xE6...‘ for column
  18. 【“您未被授权查看该页”的原因和解决办法】
  19. dubbo学习之本地存根实践
  20. Win2000请求拨号路由服务详解

热门文章

  1. 经典面试题 之 哨兵(Sentinel)模式
  2. Apache CXF Code Generation Maven2 Plugins plugin.xml
  3. 《扬帆优配》交易拥挤度达历史极值 当前A股TMT板块性价比几何?
  4. 22. Unity - 3D游戏开发小计01 --- 修复动画BUG、更改环境光照、导航网格、相机跟随、场景渲染后期处理
  5. TeeChart VCL/FMX v2023 crack
  6. 赋值运算符与赋值表达式
  7. stm32通用定时器用做外部脉冲计数器的例程
  8. Android_弹钢琴(多媒体应用)
  9. 【原创】【歌曲评论】【之一】【对不起,我爱你】
  10. 【音视频基础】(十三):YUV颜色空间之YUV和YCbCr