-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathmerkle_proof.go
53 lines (46 loc) · 1.18 KB
/
merkle_proof.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
package boc
type MerkleProver struct {
root *immutableCell
}
func NewMerkleProver(root *Cell) (*MerkleProver, error) {
immRoot, err := newImmutableCell(root, make(map[*Cell]*immutableCell))
if err != nil {
return nil, err
}
return &MerkleProver{root: immRoot}, nil
}
type Cursor struct {
cell *immutableCell
pruned map[*immutableCell]struct{}
}
func (p *MerkleProver) Cursor() *Cursor {
return &Cursor{cell: p.root, pruned: make(map[*immutableCell]struct{})}
}
func (p *MerkleProver) CreateProof(cursor *Cursor) ([]byte, error) {
immRoot, err := p.root.pruneCells(cursor.pruned)
if err != nil {
return nil, err
}
mp := NewCell()
mp.cellType = MerkleProofCell
if err := mp.WriteUint(3, 8); err != nil {
return nil, err
}
if err := mp.WriteBytes(p.root.Hash(0)); err != nil {
return nil, err
}
if err := mp.WriteUint(uint64(p.root.Depth(0)), 16); err != nil {
return nil, err
}
if err := mp.AddRef(immRoot); err != nil {
return nil, err
}
mp.ResetCounters()
return SerializeBoc(mp, false, false, false, 0)
}
func (c *Cursor) Prune() {
c.pruned[c.cell] = struct{}{}
}
func (c *Cursor) Ref(ref int) *Cursor {
return &Cursor{cell: c.cell.refs[ref], pruned: c.pruned}
}