arnaucube
arnaucube/go-dvotePublic Self-hosted repository
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}