optimize NewMerkleTree

This commit is contained in:
bboyjing 2018-04-19 13:54:38 +08:00
parent fee9bfd3af
commit b3e0fa8175
1 changed files with 17 additions and 13 deletions

View File

@ -2,6 +2,7 @@ package main
import ( import (
"crypto/sha256" "crypto/sha256"
"log"
) )
// MerkleTree represent a Merkle tree // MerkleTree represent a Merkle tree
@ -19,29 +20,32 @@ type MerkleNode struct {
// NewMerkleTree creates a new Merkle tree from a sequence of data // NewMerkleTree creates a new Merkle tree from a sequence of data
func NewMerkleTree(data [][]byte) *MerkleTree { func NewMerkleTree(data [][]byte) *MerkleTree {
var nodes []MerkleNode var nodes []MerkleNode
if len(data)%2 != 0 {
data = append(data, data[len(data)-1])
}
for _, datum := range data { for _, datum := range data {
node := NewMerkleNode(nil, nil, datum) node := NewMerkleNode(nil, nil, datum)
nodes = append(nodes, *node) nodes = append(nodes, *node)
} }
for i := 0; i < len(data)/2; i++ { if len(nodes) == 0 {
log.Panic("No merkel nodes")
}
for len(nodes) > 1 {
if len(nodes)%2 != 0 {
nodes = append(nodes, nodes[len(nodes)-1])
}
var newLevel []MerkleNode var newLevel []MerkleNode
for i := 0; i < len(nodes); i += 2 {
for j := 0; j < len(nodes); j += 2 { node := NewMerkleNode(&nodes[i], &nodes[i+1], nil)
node := NewMerkleNode(&nodes[j], &nodes[j+1], nil)
newLevel = append(newLevel, *node) newLevel = append(newLevel, *node)
} }
nodes = newLevel nodes = newLevel
} }
mTree := MerkleTree{&nodes[0]} mTree := MerkleTree{&nodes[0]}
return &mTree return &mTree
} }