Golang --Merkle tree
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相关推荐
- Merkle Tree(梅克尔树)算法解析
Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶 ...
- 基于Java语言构建区块链(六)—— 交易(Merkle Tree)
基于Java语言构建区块链(六)-- 交易(Merkle Tree) 2018年04月16日 10:21:35 wangwei_hz 阅读数:480更多 个人分类: 区块链比特币bitcoin 最终内 ...
- 七、区块链如何运用merkle tree验证交易真实性
转载自:https://www.tangshuang.net/4117.html 本文假设你已经知道区块链中merkle tree的原理,现在搞明白具体怎么来实现交易真实性验证. Merkle Tre ...
- 区块链六-Merkle Tree
2019独角兽企业重金招聘Python工程师标准>>> 基于Java语言构建区块链(六)-- 交易(Merkle Tree) Posted on 2018-03-26 | In b ...
- merkle tree(hash tree)
merkle tree即为hash tree,以下都用hash tree表示. hash tree使得可以对大型数据结构的内容进行有效且安全的校验. hash tree是hash list和hash ...
- layui如何获取父节点的父节点_区块链如何运用merkle tree验证交易真实性
大部分材料都会提到区块中保存了merkle根,并且利用它作交易真实性验证.但是具体如何作这个真实性验证,没有一篇文章可以通俗的讲出来.本文假设你已经知道区块链中merkle tree的原理,现在想搞明 ...
- Merkle Tree(默克尔树)原理解析
Merkle Tree(默克尔树)原理解析 一.Merkle Tree 1.1 Merkle Tree的特点 二.Hash list 三.Merkle tree VS Hash list 四.Merk ...
- 以太坊Eth2 deposit merkle tree
1. 引言 以太坊2.0(Eth2)采用sharded PoS协议,在早期阶段(名为Phase 0),与现有的PoW链(名为Eth1链)并行运行.Eth1由miners驱动,而PoS链(又名Beaco ...
- Sparse Merkle Tree
1. 引言 前序博客有: Merkle tree及其在区块链等领域的应用 Merkle tree proof 2. Merkle tree Merkle tree可看成是对一组数据的密码学承诺,类似: ...
最新文章
- python 更新pip 失败问题总结
- CSS学习之多类别选择器
- “兴趣社区2.0”俘获年轻人
- 英特尔首推物联网云平台设备管理
- Ajax POST请求获取后台返回的数据
- java的excel导出_java 实现excel 导出功能
- CVE-2013-4547 文件名逻辑漏洞
- nuxt添加.html,Nuxt内导航栏的两种实现方式
- DELPHI TreeView 文件目录树和 设置节点图标 完整
- 阿里云mysql写入性能_如何评价阿里云新一代关系型数据库 PolarDB?
- GitHub CEO 回应源代码泄露:没有黑客!没有被入侵!
- 台式计算机计量单位,计算机常见计量单位解析
- oracle数据库怎么查实例名,查询oracle数据库实例的名字
- 深度学习环境配置:2080Ti+Ubuntu16.04+CUDA10+cuDNN7.3+TensorFlow-gpu1.12
- clt用MeGUI处理切割音频
- 电源管理IC临近爆发,详解四大市场趋势
- 解决mysql插入中文出现错误ERROR 1366 (HY000): Incorrect string value: ‘\x80\x85\xEF\xBC\x8C\xE6...‘ for column
- 【“您未被授权查看该页”的原因和解决办法】
- dubbo学习之本地存根实践
- Win2000请求拨号路由服务详解
热门文章
- 经典面试题 之 哨兵(Sentinel)模式
- Apache CXF Code Generation Maven2 Plugins plugin.xml
- 《扬帆优配》交易拥挤度达历史极值 当前A股TMT板块性价比几何?
- 22. Unity - 3D游戏开发小计01 --- 修复动画BUG、更改环境光照、导航网格、相机跟随、场景渲染后期处理
- TeeChart VCL/FMX v2023 crack
- 赋值运算符与赋值表达式
- stm32通用定时器用做外部脉冲计数器的例程
- Android_弹钢琴(多媒体应用)
- 【原创】【歌曲评论】【之一】【对不起,我爱你】
- 【音视频基础】(十三):YUV颜色空间之YUV和YCbCr