1 Star 1 Fork 0

zhangjiangyuan/比特币

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
merkle_tree.go 1.39 KB
一键复制 编辑 原始数据 按行查看 历史
zhangjiangyuan 提交于 2018-11-29 16:06 . 梅克尔树、钱包
package main
import (
"crypto/sha256"
"log"
"math"
)
type MerkleTree struct {
RootNode *MerkleNode
}
type MerkleNode struct {
Left *MerkleNode
Right *MerkleNode
Data []byte
}
func NewMerkleTree(data [][]byte) *MerkleTree {
var nodes []MerkleNode
for _, datum := range data {
node := NewMerkleNode(nil, nil, datum)
nodes = append(nodes, node)
}
for i := 0; math.Pow(2, i) < len(data); i++ {
var newLevel []MerkleNode
nodeNums := len(nodes)
for j := 1; j < nodeNums; j += 2 {
node := NewMerkleNode(&nodes[j-1], &nodes[j], nil)
newLevel = append(newLevel, *node)
}
if nodeNums%2 != 0 {
node := NewMerkleNode(nil, &nodes[nodeNums-1], nil)
newLevel = append(newLevel, *node)
}
nodes = newLevel
}
mTree := MerkleTree{&nodes[0]}
return mTree
}
func NewMerkleNode(left, right *MerkleNode, data []byte) *MerkleNode {
mNode := MerkleNode{}
//规定子节点为单数时,落单的节点为父节点的right分支。
if left == nil && right == nil {
hash := sha256.Sum256(data)
mNode.Data = hash[:]
} else if left != nil && right == nil {
log.Panic("规定子节点为单数时,落单的节点为父节点的right分支。")
} else if left == nil && right != nil {
mNode.Data = right.Data
} else {
prevHashs := append(left.Data, right.Data)
hash := sha256.Sum256(prevHashs)
mNode.Data = hash[:]
}
mNode.Left = left
mNode.Right = right
return &mNode
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/jackbot/bitcoin.git
git@gitee.com:jackbot/bitcoin.git
jackbot
bitcoin
比特币
master

搜索帮助