Implementation of Merkle tree
package main
import (
"crypto/md5"
"fmt"
"io/ioutil"
"github.com/saromanov/merkle"
)
func splitData(data []byte, size int) [][]byte {
count := len(data) / size
blocks := make([][]byte, 0, count)
for i := 0; i < count; i++ {
block := data[i*size : (i+1)*size]
blocks = append(blocks, block)
}
if len(data)%size != 0 {
blocks = append(blocks, data[len(blocks)*size:])
}
return blocks
}
func main() {
data, err := ioutil.ReadFile("file")
if err != nil {
fmt.Println(err)
return
}
blocks := splitData(data, 32)
tree := merkle.NewTree()
err = tree.Generate(blocks, md5.New())
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Height: %d\n", tree.Height())
fmt.Printf("Root: %v\n", tree.Root())
}