go-dvote/tree/tree.go
tree/tree.goRaw
1package tree
2
3import (
4 "github.com/iden3/go-iden3/db"
5 "github.com/iden3/go-iden3/merkletree"
6 mkcore "github.com/iden3/go-iden3/core"
7 common3 "github.com/iden3/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}