package tree
|
|
|
|
import (
|
|
"github.com/iden3/go-iden3/db"
|
|
"github.com/iden3/go-iden3/merkletree"
|
|
mkcore "github.com/iden3/go-iden3/core"
|
|
common3 "github.com/iden3/go-iden3/common"
|
|
"os/user"
|
|
)
|
|
|
|
type Tree struct {
|
|
namespace string
|
|
storage string
|
|
tree *merkletree.MerkleTree
|
|
}
|
|
|
|
func (t *Tree) init() error {
|
|
if len(t.storage) < 1 {
|
|
usr, err := user.Current()
|
|
if err == nil {
|
|
t.storage = usr.HomeDir + "/.dvote/Tree"
|
|
} else { t.storage = "./dvoteTree" }
|
|
}
|
|
mtdb, err := db.NewLevelDbStorage(t.storage, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mt, err := merkletree.New(mtdb, 140)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
t.tree = mt
|
|
return nil
|
|
}
|
|
|
|
func (t *Tree) close() {
|
|
defer t.tree.Storage().Close()
|
|
}
|
|
|
|
func (t *Tree) addClaim(data []byte) error {
|
|
claim := mkcore.NewGenericClaim(t.namespace, "default", data, nil)
|
|
return t.tree.Add(claim)
|
|
}
|
|
|
|
func (t *Tree) genProof(data []byte) (string, error) {
|
|
claim := mkcore.NewGenericClaim(t.namespace, "default", data, nil)
|
|
mp, err := t.tree.GenerateProof(claim.Hi())
|
|
if err!=nil {
|
|
return "", err
|
|
}
|
|
mpHex := common3.BytesToHex(mp)
|
|
return mpHex, nil
|
|
}
|
|
|
|
func (t *Tree) checkProof(data []byte, mpHex string) (bool, error) {
|
|
mp, err := common3.HexToBytes(mpHex)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
claim := mkcore.NewGenericClaim(t.namespace, "default", data, nil)
|
|
return merkletree.CheckProof(t.tree.Root(), mp, claim.Hi(), claim.Ht(), t.tree.NumLevels()), nil
|
|
}
|