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
@ -20,20 +21,23 @@ type MerkleNode struct {
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 {
var newLevel []MerkleNode log.Panic("No merkel nodes")
}
for j := 0; j < len(nodes); j += 2 { for len(nodes) > 1 {
node := NewMerkleNode(&nodes[j], &nodes[j+1], nil) if len(nodes)%2 != 0 {
nodes = append(nodes, nodes[len(nodes)-1])
}
var newLevel []MerkleNode
for i := 0; i < len(nodes); i += 2 {
node := NewMerkleNode(&nodes[i], &nodes[i+1], nil)
newLevel = append(newLevel, *node) newLevel = append(newLevel, *node)
} }