/
merkletree.go
41 lines (35 loc) · 1.12 KB
/
merkletree.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package blockchain
import (
"crypto/sha256"
"github.com/0x5eba/Dexm/dexm-core/wallet"
protobufs "github.com/0x5eba/Dexm/protobufs/build/blockchain"
"github.com/golang/protobuf/proto"
"github.com/onrik/gomerkle"
)
// GenerateMerkleTree generate a merkletree and return its root
func GenerateMerkleTree(transactions []*protobufs.Transaction, receiptsContract []*protobufs.Receipt) ([]byte, error) {
var dataReceipt [][]byte
// For every transaction create its receipt and use it to create the tree
for _, t := range transactions {
r := &protobufs.Receipt{
Sender: wallet.BytesToAddress(t.GetSender(), t.GetShard()),
Recipient: t.GetRecipient(),
Amount: t.GetAmount(),
Nonce: t.GetNonce(),
}
rByte, _ := proto.Marshal(r)
dataReceipt = append(dataReceipt, rByte)
}
for _, r := range receiptsContract {
rByte, _ := proto.Marshal(r)
dataReceipt = append(dataReceipt, rByte)
}
treeReceipt := gomerkle.NewTree(sha256.New())
treeReceipt.AddData(dataReceipt...)
err := treeReceipt.Generate()
if err != nil {
return nil, err
}
merkleRootReceipt := treeReceipt.Root()
return merkleRootReceipt, nil
}