1+ /**
2+ * Author: Juntaran
3+ * Email: Jacinthmail@gmail.com
4+ * Date: 2018/1/30 14:10
5+ */
6+
7+ package Merkle_Tree
8+
9+ import (
10+ "hash"
11+ "errors"
12+ )
13+
14+ // Merkle Tree 节点结构
15+ type MerkleNode struct {
16+ HashValue []byte
17+ lchild * MerkleNode
18+ rchild * MerkleNode
19+ }
20+
21+ // Merkle Tree 树结构
22+ type MerkleTree struct {
23+ Size uint64 // 节点数
24+ Nodes []MerkleNode // 所有 node
25+ Level [][]MerkleNode // 每层的 node
26+ }
27+
28+ // 创建一个节点
29+ func NewMerkleNode (h hash.Hash , block []byte ) (MerkleNode , error ){
30+ if h == nil || block == nil {
31+ return MerkleNode {}, nil
32+ }
33+ defer h .Reset ()
34+ _ , err := h .Write (block )
35+ if err != nil {
36+ return MerkleNode {}, err
37+ }
38+ return MerkleNode {
39+ HashValue : h .Sum (nil ),
40+ }, nil
41+ }
42+
43+ // 创建一棵树
44+ func NewMerkleTree () * MerkleTree {
45+ return & MerkleTree {
46+ Size : 0 ,
47+ Nodes : nil ,
48+ Level : nil ,
49+ }
50+ }
51+
52+ //// 返回树的根
53+ //func (merkleTree *MerkleTree) GetMerkleTreeRoot() *MerkleNode {
54+ // if merkleTree.Nodes == nil {
55+ // return nil
56+ // }
57+ // return merkleTree.Root
58+ //}
59+
60+ // 返回树的高度
61+ func (merkleTree * MerkleTree ) GetMerkleTreeHeight () uint64 {
62+ return uint64 (len (merkleTree .Level ))
63+ }
64+
65+ // 获取第 n 层的节点
66+ func (merkleTree * MerkleTree ) GetMerkleTreeNLevelNode (n uint64 ) []MerkleNode {
67+ if merkleTree .Level == nil || n == 0 || n > uint64 (len (merkleTree .Level )) {
68+ return nil
69+ }
70+ return merkleTree .Level [n - 1 ]
71+ }
72+
73+ // 返回 root
74+ func (merkleTree * MerkleTree ) GetMerkleTreeRoot () * MerkleNode {
75+ if merkleTree .Nodes == nil {
76+ return nil
77+ } else {
78+ return & merkleTree .Level [0 ][0 ]
79+ }
80+ }
81+
82+ // 返回叶子节点
83+ func (merkleTree * MerkleTree ) GetMerkleTreeLeaves () []MerkleNode {
84+ if merkleTree .Level == nil {
85+ return nil
86+ }
87+ return merkleTree .Level [len (merkleTree .Level ) - 1 ]
88+ }
89+
90+ // 根据节点数量判断树的高度
91+ func getMerkleTreeHeight (nodeCount uint64 ) uint64 {
92+ if nodeCount == 0 {
93+ return 0
94+ } else if nodeCount == 1 {
95+ return 2
96+ } else {
97+ return logBaseTwo (nextPowerOfTwo (nodeCount )) + 1
98+ }
99+ }
100+
101+ // 计算节点数
102+ func getNodeCount (height , size uint64 ) uint64 {
103+ if isPowerOfTwo (size ) {
104+ return 2 * size - 1
105+ }
106+ count := size
107+ prev := size
108+ for i := uint64 (1 ); i < height ; i ++ {
109+ next := (prev + prev % 2 ) / 2
110+ count += next
111+ prev = next
112+ }
113+ return count
114+ }
115+
116+ // 生成 MerkleTree
117+ func (merkleTree * MerkleTree ) Init (blocks [][]byte , h hash.Hash ) error {
118+ blockCount := uint64 (len (blocks ))
119+ if blockCount == 0 {
120+ return errors .New ("Empty tree" )
121+ }
122+ height := getMerkleTreeHeight (blockCount )
123+ nodeCount := getNodeCount (height , blockCount )
124+ levels := make ([][]MerkleNode , height )
125+ nodes := make ([]MerkleNode , nodeCount )
126+ size := nodeCount
127+
128+ // 创建叶子节点
129+ for k , v := range blocks {
130+ node , err := NewMerkleNode (h , v )
131+ if err != nil {
132+ return err
133+ }
134+ nodes [k ] = node
135+ }
136+ levels [height - 1 ] = nodes [:len (blocks )]
137+
138+ // 创建每个节点层
139+ current := nodes [len (blocks ):]
140+ var i uint64
141+ for i = height - 1 ; i > 0 ; i -- {
142+ below := levels [i ]
143+ wrote , err := merkleTree .initNodeLevel (below , current , h )
144+ if err != nil {
145+ return err
146+ }
147+ levels [i - 1 ] = current [:wrote ]
148+ current = current [wrote :]
149+ }
150+ merkleTree .Nodes = nodes
151+ merkleTree .Level = levels
152+ merkleTree .Size = size
153+
154+ return nil
155+ }
156+
157+ // 生成所有非叶子节点
158+ func (merkleTree * MerkleTree )initNodeLevel (below []MerkleNode , current []MerkleNode , h hash.Hash ) (uint64 , error ) {
159+ h .Reset ()
160+ size := h .Size ()
161+ data := make ([]byte , size * 2 )
162+ end := (len (below ) + len (below ) % 2 ) / 2
163+ for i := 0 ; i < end ; i ++ {
164+ node := MerkleNode {}
165+ ileft := 2 * i
166+ iright := 2 * i + 1
167+ left := & below [ileft ]
168+ var right * MerkleNode = nil
169+ if len (below ) > iright {
170+ right = & below [iright ]
171+ }
172+ if right == nil {
173+ b := data [:size ]
174+ copy (b , left .HashValue )
175+ node = MerkleNode {
176+ HashValue : b ,
177+ }
178+ } else {
179+ copy (data [:size ], below [ileft ].HashValue )
180+ copy (data [size :], below [iright ].HashValue )
181+ var err error
182+ node , err = NewMerkleNode (h , data )
183+ if err != nil {
184+ return 0 , err
185+ }
186+ }
187+ // Point the new node to its children and save
188+ node .lchild = left
189+ node .rchild = right
190+ current [i ] = node
191+
192+ // Reset the data slice
193+ data = data [:]
194+ }
195+ return uint64 (end ), nil
196+ }
0 commit comments