内容简介:Banyan树的启示:印度banyan树,最大的一颗可以长到1万平方米以上。其如此巨大的秘密就在于其枝干也会产生根,起到支撑,从而作为附属树干,继续生成分支。大自然给人太多启示……Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树是一种数据结构,Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。Merkle树是使区块链发挥作用的基本组成部分。虽然理论上可以在没有Merkle树的情况下制
大自然的启示
Banyan树的启示:印度banyan树,最大的一颗可以长到1万平方米以上。其如此巨大的秘密就在于其枝干也会产生根,起到支撑,从而作为附属树干,继续生成分支。大自然给人太多启示……
Merkle Tree
Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树是一种数据结构,Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
Merkle树是使区块链发挥作用的基本组成部分。虽然理论上可以在没有Merkle树的情况下制作区块链,但只需创建直接包含每个事务的巨型块头,这样做会带来巨大的可扩展性挑战,可以说无可置疑地使用区块链的能力超出了所有范围,从长远来看,功能强大的电脑。感谢Merkle树,可以构建在所有计算机和大小笔记本电脑上运行的以太网节点,智能手机,甚至是物联网设备
比特币中默克尔树的构建过程:
第一笔hash: 16f0eb42cb4d9c2374b2cb1de4008162c06fdd8f1c18357f0c849eb423672f5f 大小端转换为: 5f2f6723b49e840c7f35181c8fdd6fc0628100e41dcbb274239c4dcb42ebf016 第二笔hash: cce2f95fc282b3f2bc956f61d6924f73d658a1fdbc71027dd40b06c15822e061 大小端转换为: 61e02258c1060bd47d0271bcfda158d6734f92d6616f95bcf2b382c25ff9e2cc 将两个拼接在一起: 5f2f6723b49e840c7f35181c8fdd6fc0628100e41dcbb274239c4dcb42ebf01661e02258c1060bd47d0271bcfda158d6734f92d6616f95bcf2b382c25ff9e2cc 将上面拼接的字符串进行两次hash如下: 第一次hash结果: 9b2ec096d49fee8b310752082d63d8fe198386ae2172d90533d9186bb28df63d 将上面计算出的hash值再次进行hash: 525894ddd0891b36c5ff8658e2a978d615b35ce6dedb5cb83f2420dbcd40a0c7 大小端转换即为结果: c7a040cddb20243fb85cdbdee65cb315d678a9e25886ffc5361b89d0dd945852
go语言实现上面的验证过程
package main
import (
"encoding/hex"
"crypto/sha256"
"fmt"
)
func ReverseBytes2(data []byte){
for i,j :=0,len(data) - 1;i<j;i,j = i+1,j - 1{
data[i],data[j] = data[j],data[i]
}
}
func main(){
//字符串hash转换为字节
hash1,_:= hex.DecodeString("16f0eb42cb4d9c2374b2cb1de4008162c06fdd8f1c18357f0c849eb423672f5f")
hash2,_:= hex.DecodeString("cce2f95fc282b3f2bc956f61d6924f73d658a1fdbc71027dd40b06c15822e061")
//大小端的转换
ReverseBytes2(hash1)
ReverseBytes2(hash2)
//拼接在一起
rawdata:=append(hash1,hash2...)
//double hash256
firsthash:=sha256.Sum256(rawdata)
secondhash:= sha256.Sum256(firsthash[:])
merkroot := secondhash[:]
//反转,与浏览器当中的数据对比
ReverseBytes2(merkroot)
fmt.Printf("%x",merkroot)
}
参考资料
[csdn 默克尔树解释] https://blog.csdn.net/wo541075754/article/details/54632929
https://github.com/ZtesoftCS/go-ethereum-code-analysis/blob/master/trie源码分析.md
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 通过python构建一个区块链来学习区块链
- 构建第一个 Swift 区块链应用
- 构建第一个 Swift 区块链应用
- 用Go构建一个简单的区块链
- 刘大鸿:移动区块链技术构建分布式商业
- 使用Go构建区块链 第1部分:基本原型
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java多线程编程实战指南(设计模式篇)
黄文海 / 电子工业出版社 / 2015-10 / 59.00
随着CPU 多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而 解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的实际工作相去甚远。《Java多线程编程实战指南(设计模式篇)》采用Java(JDK1.6)语言和UML 为描述语言,并结合作者多......一起来看看 《Java多线程编程实战指南(设计模式篇)》 这本书的介绍吧!