optimize NewMerkleTree
This commit is contained in:
parent
fee9bfd3af
commit
b3e0fa8175
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue