/
Merkle.go
68 lines (64 loc) · 1.68 KB
/
Merkle.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package BLC
import "crypto/sha256"
//Merkle树实现管理
type MerkleTree struct{
//根节点
RootNode *MerkleNode
}
//Merkle节点结构
type MerkleNode struct {
//左子节点
Left *MerkleNode
//右子节点
Right *MerkleNode
//数据
Data []byte
}
//创建Merkle树
//txHashes:区块中的交易哈希列表
//Merkle根节点之外的其它层次的节点数量必须是偶数个,如果是奇数个,则将最后一个节点复制一份
func NewMerkleTree(txHashes [][]byte) *MerkleTree {
//节点列表
var nodes []MerkleNode
//判断交易数据条数,如果是奇数,则拷贝最后一份
if len(txHashes)%2!=0{
txHashes=append(txHashes,txHashes[len(txHashes)-1])
}
//遍历所有交易数据,通过哈希生成叶子节点
for _,data:=range txHashes{
node:=MakeMerkleNode(nil,nil,data)
nodes=append(nodes,*node)
}
//通过叶子节点创建父节点
for i:=0;i<len(txHashes)/2;i++{
var parentNodes []MerkleNode //父节点列表
for j:=0;j<len(nodes);j+=2{
node:=MakeMerkleNode(&nodes[j],&nodes[j],nil)
parentNodes=append(parentNodes,*node)
}
if len(parentNodes)%2!=0{
parentNodes= append(parentNodes, parentNodes[len(parentNodes)-1])
}
//最终nodes中只保存了根节点的哈希值
nodes=parentNodes
}
mtree:=MerkleTree{&nodes[0]}
return &mtree
}
//创建Merkle节点
func MakeMerkleNode(left,right *MerkleNode,data []byte) *MerkleNode {
node:=&MerkleNode{}
//判断叶子节点
if left==nil&&right==nil{
hash:=sha256.Sum256(data)
node.Data=hash[:]
}else{
//非叶子节点
prevHashes:=append(left.Data,right.Data...)
hash:=sha256.Sum256(prevHashes)
node.Data=hash[:]
}
//子节点的赋值
node.Left=left
return node
}