Skip to content

Commit

Permalink
add node iterator, delete leaf nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
weiihann committed Feb 18, 2025
1 parent 915d4d5 commit fe205cb
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
13 changes: 8 additions & 5 deletions core/trie2/trie.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,6 @@ func (t *Trie) Update(key, value *felt.Felt) error {
// Retrieves the value associated with the given key.
// Returns felt.Zero if the key doesn't exist.
// May update the trie's internal structure if nodes need to be resolved.
// TODO(weiihann):
// The State should keep track of the modified key and values, so that we can avoid traversing the trie
// No action needed for the Trie, remove this once State provides the functionality
func (t *Trie) Get(key *felt.Felt) (felt.Felt, error) {
if t.committed {
return felt.Zero, ErrCommitted
Expand Down Expand Up @@ -198,6 +195,10 @@ func (t *Trie) Commit() (felt.Felt, error) {
return rootHash, nil
}

func (t *Trie) NodeIterator() (db.Iterator, error) {
return t.db.NewIterator(t.owner)

Check warning on line 199 in core/trie2/trie.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/trie.go#L198-L199

Added lines #L198 - L199 were not covered by tests
}

func (t *Trie) Copy() *Trie {
return &Trie{
height: t.height,
Expand Down Expand Up @@ -373,9 +374,10 @@ func (t *Trie) delete(n Node, prefix, key *Path) (bool, Node, error) {
if match.Len() < n.Path.Len() {
return false, n, nil
}
// If the whole key matches, remove the entire edge node
// If the whole key matches, remove the entire edge node and its child
if match.Len() == key.Len() {
t.nodeTracer.onDelete(prefix)
t.nodeTracer.onDelete(prefix) // delete edge node
t.nodeTracer.onDelete(new(Path).Append(prefix, key)) // delete value node
return true, nil, nil
}

Expand Down Expand Up @@ -438,6 +440,7 @@ func (t *Trie) delete(n Node, prefix, key *Path) (bool, Node, error) {
// containing the other child as the child
return true, &EdgeNode{Path: bitPrefix, Child: n.Children[other], flags: newFlag()}, nil
case *ValueNode:
t.nodeTracer.onDelete(key)
return true, nil, nil
case nil:
return false, nil, nil
Expand Down
29 changes: 29 additions & 0 deletions core/trie2/triedb/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type TrieDB interface {
Get(buf *bytes.Buffer, owner felt.Felt, path trieutils.BitArray) (int, error)
Put(owner felt.Felt, path trieutils.BitArray, blob []byte) error
Delete(owner felt.Felt, path trieutils.BitArray) error
NewIterator(owner felt.Felt) (db.Iterator, error)
}

type Database struct {
Expand Down Expand Up @@ -91,6 +92,30 @@ func (d *Database) Delete(owner felt.Felt, path trieutils.BitArray) error {
return d.txn.Delete(buffer.Bytes())
}

func (d *Database) NewIterator(owner felt.Felt) (db.Iterator, error) {
buffer := dbBufferPool.Get().(*bytes.Buffer)
buffer.Reset()
defer func() {
buffer.Reset()
dbBufferPool.Put(buffer)
}()

Check warning on line 101 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L95-L101

Added lines #L95 - L101 were not covered by tests

_, err := buffer.Write(d.prefix.Key())
if err != nil {
return nil, err
}

Check warning on line 106 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L103-L106

Added lines #L103 - L106 were not covered by tests

if owner != (felt.Felt{}) {
oBytes := owner.Bytes()
_, err := buffer.Write(oBytes[:])
if err != nil {
return nil, err
}

Check warning on line 113 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L108-L113

Added lines #L108 - L113 were not covered by tests
}

return d.txn.NewIterator(buffer.Bytes(), true)

Check warning on line 116 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L116

Added line #L116 was not covered by tests
}

func (d *Database) dbKey(buf *bytes.Buffer, owner felt.Felt, path trieutils.BitArray) error {
_, err := buf.Write(d.prefix.Key())
if err != nil {
Expand Down Expand Up @@ -126,3 +151,7 @@ func (EmptyDatabase) Put(owner felt.Felt, path trieutils.BitArray, blob []byte)
func (EmptyDatabase) Delete(owner felt.Felt, path trieutils.BitArray) error {
return ErrCallEmptyDatabase

Check warning on line 152 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L151-L152

Added lines #L151 - L152 were not covered by tests
}

func (EmptyDatabase) NewIterator(owner felt.Felt) (db.Iterator, error) {
return nil, ErrCallEmptyDatabase

Check warning on line 156 in core/trie2/triedb/database.go

View check run for this annotation

Codecov / codecov/patch

core/trie2/triedb/database.go#L155-L156

Added lines #L155 - L156 were not covered by tests
}

0 comments on commit fe205cb

Please sign in to comment.