go-dvote/tree/tree.go
tree/tree.goRaw
1package tree
2
3import (
4 "github.com/vocdoni/go-iden3/db"
5 "github.com/vocdoni/go-iden3/merkletree"
6 mkcore "github.com/vocdoni/go-iden3/core"
7 common3 "github.com/vocdoni/go-iden3/common"
8 "os/user"
9)
10
11type Tree struct {
12 Namespace string
13 Storage string
14 Tree *merkletree.MerkleTree
15}
16
17func (t *Tree) Init() error {
18 if len(t.Storage) < 1 {
19 usr, err := user.Current()
20 if err == nil {
21 t.Storage = usr.HomeDir + "/.dvote/Tree"
22 } else { t.Storage = "./dvoteTree" }
23 }
24 mtdb, err := db.NewLevelDbStorage(t.Storage, false)
25 if err != nil {
26 return err
27 }
28 mt, err := merkletree.New(mtdb, 140)
29 if err != nil {
30 return err
31 }
32 t.Tree = mt
33 return nil
34}
35
36func (t *Tree) Close() {
37 defer t.Tree.Storage().Close()
38}
39
40func (t *Tree) AddClaim(data []byte) error {
41 claim := mkcore.NewGenericClaim(t.Namespace, "default", data, nil)
42 return t.Tree.Add(claim)
43}
44
45func (t *Tree) GenProof(data []byte) (string, error) {
46 claim := mkcore.NewGenericClaim(t.Namespace, "default", data, nil)
47 mp, err := t.Tree.GenerateProof(claim.Hi())
48 if err!=nil {
49 return "", err
50 }
51 mpHex := common3.BytesToHex(mp)
52 return mpHex, nil
53}
54
55func (t *Tree) CheckProof(data []byte, mpHex string) (bool, error) {
56 mp, err := common3.HexToBytes(mpHex)
57 if err != nil {
58 return false, err
59 }
60 claim := mkcore.NewGenericClaim(t.Namespace, "default", data, nil)
61 return merkletree.CheckProof(t.Tree.Root(), mp, claim.Hi(), claim.Ht(), t.Tree.NumLevels()), nil
62}