-
Notifications
You must be signed in to change notification settings - Fork 3
/
stores.go
59 lines (45 loc) · 1.54 KB
/
stores.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package stores
import (
"log"
merkle_dag "github.com/HORNET-Storage/scionic-merkletree/dag"
"github.com/multiformats/go-multibase"
)
type Store interface {
InitStore(args ...interface{}) error
StoreLeaf(root string, leaf *merkle_dag.DagLeaf) error
RetrieveLeaf(root string, hash string) (*merkle_dag.DagLeaf, error)
StoreDag(dag *merkle_dag.Dag) error
BuildDagFromStore(root string) (*merkle_dag.Dag, error)
}
func BuildDagFromStore(store Store, root string) (*merkle_dag.Dag, error) {
encoding, _, err := multibase.Decode(root)
if err != nil {
log.Println("Failed to discover encoding:", err)
return nil, err
}
encoder := multibase.MustNewEncoder(encoding)
builder := merkle_dag.CreateDagBuilder()
var addLeavesRecursively func(builder *merkle_dag.DagBuilder, encoder multibase.Encoder, hash string) error
addLeavesRecursively = func(builder *merkle_dag.DagBuilder, encoder multibase.Encoder, hash string) error {
leaf, err := store.RetrieveLeaf(root, hash)
if err != nil {
log.Println("Unable to find leaf in the database:", err)
return err
}
builder.AddLeaf(leaf, encoder, nil)
for _, childHash := range leaf.Links {
if err := addLeavesRecursively(builder, encoder, childHash); err != nil {
log.Println("Error adding child leaf:", err)
}
}
return nil
}
if err := addLeavesRecursively(builder, encoder, root); err != nil {
log.Println("Failed to add leaves from database:", err)
return nil, err
}
return builder.BuildDag(root), nil
}
func StoreDag(store Store, dag *merkle_dag.Dag) error {
return nil
}