Skip to content

Commit 584e500

Browse files
refactor(trie2): use more descriptive felt.Address type instead of felt.Felt (#3295)
* Commits from maksym/rawdb (squashed) * address comments * Commits from maksym/rawdb (squashed) * Refactor the state to use more descriptive `felt.Address` type instead of `felt.Felt` * unit tests, linter * linter * Refactor the state to use more descriptive `felt.Address` type instead of `felt.Felt` * unit tests, linter * comments * address comments * address comments * linter * address comments * address comments * linter * address comments
1 parent eb67192 commit 584e500

34 files changed

+431
-187
lines changed

core/felt/utils.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package felt
2+
3+
func IsZero[F FeltLike](v *F) bool {
4+
f := Felt(*v)
5+
return f.IsZero()
6+
}
7+
8+
func Equal[F FeltLike](a, b *F) bool {
9+
fa := Felt(*a)
10+
fb := Felt(*b)
11+
return fa.Equal(&fb)
12+
}

core/state/database.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,13 @@ func (s *StateDB) ContractTrie(stateComm *felt.Felt) (*trie2.Trie, error) {
3838

3939
// Opens a contract storage trie for the given state root and contract address
4040
func (s *StateDB) ContractStorageTrie(stateComm, owner *felt.Felt) (*trie2.Trie, error) {
41-
return trie2.New(trieutils.NewContractStorageTrieID(*stateComm, *owner), ContractStorageTrieHeight, crypto.Pedersen, s.triedb)
41+
return trie2.New(
42+
trieutils.NewContractStorageTrieID(
43+
*stateComm,
44+
felt.Address(*owner),
45+
),
46+
ContractStorageTrieHeight,
47+
crypto.Pedersen,
48+
s.triedb,
49+
)
4250
}

core/state/object.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@ func (s *stateObject) getStorage(key *felt.Felt) (felt.Felt, error) {
5151
}
5252

5353
path := tr.FeltToPath(key)
54-
v, err := trieutils.GetNodeByPath(s.state.db.disk, db.ContractTrieStorage, &s.addr, &path, true)
54+
v, err := trieutils.GetNodeByPath(
55+
s.state.db.disk,
56+
db.ContractTrieStorage,
57+
(*felt.Address)(&s.addr),
58+
&path,
59+
true,
60+
)
5561
if err != nil {
5662
return felt.Zero, err
5763
}

core/state/state.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,8 @@ func (s *State) flush(
516516
}
517517

518518
// TODO(weiihann): handle hash-based, and there should be better ways of doing this
519-
if err := trieutils.DeleteStorageNodesByPath(batch, addr); err != nil {
519+
err := trieutils.DeleteStorageNodesByPath(batch, (*felt.Address)(&addr))
520+
if err != nil {
520521
return err
521522
}
522523
} else { // updated

core/trie2/databasetest.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ func newTestNodeReader(id trieutils.TrieID, nodes []*trienode.MergeNodeSet, db d
2626
return &testNodeReader{id: id, nodes: nodes, db: db, scheme: scheme}
2727
}
2828

29-
func (n *testNodeReader) Node(owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error) {
29+
func (n *testNodeReader) Node(
30+
owner *felt.Address,
31+
path *trieutils.Path,
32+
hash *felt.Felt,
33+
isLeaf bool,
34+
) ([]byte, error) {
3035
for _, nodes := range n.nodes {
3136
var (
3237
node trienode.TrieNode

core/trie2/errors.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ var (
1515

1616
type MissingNodeError struct {
1717
tt trieutils.TrieType
18-
owner felt.Felt
18+
owner felt.Address
1919
path trieutils.Path
2020
hash felt.Felt
2121
err error
2222
}
2323

2424
func (e *MissingNodeError) Error() string {
25-
if e.owner.Equal(&felt.Zero) {
25+
if felt.IsZero(&e.owner) {
2626
return fmt.Sprintf("%s: missing trie node (path %v, hash %v) %v", e.tt, e.path, e.hash, e.err)
2727
}
2828
return fmt.Sprintf("%s: missing trie node (owner %v, path %v, hash %v) %v", e.tt, e.owner, e.path, e.hash, e.err)

core/trie2/trie.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type Trie struct {
2222
height uint8
2323

2424
// The owner of the trie, only used for contract trie. If not empty, this is a storage trie.
25-
owner felt.Felt
25+
owner felt.Address
2626

2727
// The root node of the trie
2828
root trienode.Node

core/trie2/triedb/database/db.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const (
1919

2020
// Represents a reader for trie nodes
2121
type NodeReader interface {
22-
Node(owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error)
22+
Node(owner *felt.Address, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error)
2323
}
2424

2525
// Represents a database that produces a node reader for a given trie id

core/trie2/triedb/empty.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ func (EmptyNodeDatabase) NodeReader(id trieutils.TrieID) (database.NodeReader, e
2323

2424
type EmptyNodeReader struct{}
2525

26-
func (EmptyNodeReader) Node(owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error) {
26+
func (EmptyNodeReader) Node(
27+
owner *felt.Address,
28+
path *trieutils.Path,
29+
hash *felt.Felt,
30+
isLeaf bool,
31+
) ([]byte, error) {
2732
return nil, nil
2833
}

core/trie2/triedb/hashdb/database.go

Lines changed: 71 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,27 @@ func New(disk db.KeyValueStore, config *Config) *Database {
4848
}
4949
}
5050

51-
func (d *Database) insert(owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isClass bool, node trienode.TrieNode) {
51+
func (d *Database) insert(
52+
owner *felt.Address,
53+
path *trieutils.Path,
54+
hash *felt.Felt,
55+
isClass bool,
56+
node trienode.TrieNode,
57+
) {
5258
_, found := d.dirtyCache.getNode(owner, path, hash, isClass)
5359
if found {
5460
return
5561
}
5662
d.dirtyCache.putNode(owner, path, hash, isClass, node)
5763
}
5864

59-
func (d *Database) readNode(bucket db.Bucket, owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error) {
65+
func (d *Database) readNode(
66+
bucket db.Bucket,
67+
owner *felt.Address,
68+
path *trieutils.Path,
69+
hash *felt.Felt,
70+
isLeaf bool,
71+
) ([]byte, error) {
6072
if blob := d.cleanCache.getNode(path, hash); blob != nil {
6173
return blob, nil
6274
}
@@ -82,7 +94,7 @@ func (d *Database) readNode(bucket db.Bucket, owner *felt.Felt, path *trieutils.
8294
func (d *Database) NewIterator(id trieutils.TrieID) (db.Iterator, error) {
8395
key := id.Bucket().Key()
8496
owner := id.Owner()
85-
if !owner.Equal(&felt.Zero) {
97+
if !felt.IsZero(&owner) {
8698
oBytes := owner.Bytes()
8799
key = append(key, oBytes[:]...)
88100
}
@@ -101,7 +113,16 @@ func (d *Database) Commit(_ *felt.Felt) error {
101113
if err != nil {
102114
return err
103115
}
104-
if err := trieutils.WriteNodeByHash(batch, db.ClassTrie, &felt.Zero, &path, &hash, node.IsLeaf(), node.Blob()); err != nil {
116+
err = trieutils.WriteNodeByHash(
117+
batch,
118+
db.ClassTrie,
119+
&felt.Address{},
120+
&path,
121+
&hash,
122+
node.IsLeaf(),
123+
node.Blob(),
124+
)
125+
if err != nil {
105126
return err
106127
}
107128
d.cleanCache.putNode(&path, &hash, node.Blob())
@@ -112,7 +133,16 @@ func (d *Database) Commit(_ *felt.Felt) error {
112133
if err != nil {
113134
return err
114135
}
115-
if err := trieutils.WriteNodeByHash(batch, db.ContractTrieContract, &felt.Zero, &path, &hash, node.IsLeaf(), node.Blob()); err != nil {
136+
err = trieutils.WriteNodeByHash(
137+
batch,
138+
db.ContractTrieContract,
139+
&felt.Address{},
140+
&path,
141+
&hash,
142+
node.IsLeaf(),
143+
node.Blob(),
144+
)
145+
if err != nil {
116146
return err
117147
}
118148
d.cleanCache.putNode(&path, &hash, node.Blob())
@@ -124,7 +154,16 @@ func (d *Database) Commit(_ *felt.Felt) error {
124154
if err != nil {
125155
return err
126156
}
127-
if err := trieutils.WriteNodeByHash(batch, db.ContractTrieStorage, &owner, &path, &hash, node.IsLeaf(), node.Blob()); err != nil {
157+
err = trieutils.WriteNodeByHash(
158+
batch,
159+
db.ContractTrieStorage,
160+
&owner,
161+
&path,
162+
&hash,
163+
node.IsLeaf(),
164+
node.Blob(),
165+
)
166+
if err != nil {
128167
return err
129168
}
130169
d.cleanCache.putNode(&path, &hash, node.Blob())
@@ -158,7 +197,7 @@ func (d *Database) Update(
158197

159198
var classNodes map[trieutils.Path]trienode.TrieNode
160199
var contractNodes map[trieutils.Path]trienode.TrieNode
161-
var contractStorageNodes map[felt.Felt]map[trieutils.Path]trienode.TrieNode
200+
var contractStorageNodes map[felt.Address]map[trieutils.Path]trienode.TrieNode
162201

163202
if mergedClassNodes != nil {
164203
classNodes, _ = mergedClassNodes.Flatten()
@@ -170,15 +209,15 @@ func (d *Database) Update(
170209
contractNodes, contractStorageNodes = mergedContractNodes.Flatten()
171210
} else {
172211
contractNodes = make(map[trieutils.Path]trienode.TrieNode)
173-
contractStorageNodes = make(map[felt.Felt]map[trieutils.Path]trienode.TrieNode)
212+
contractStorageNodes = make(map[felt.Address]map[trieutils.Path]trienode.TrieNode)
174213
}
175214

176215
for path, node := range classNodes {
177216
if _, ok := node.(*trienode.DeletedNode); ok {
178217
continue // Since the hashdb is used for archive node only, there is no need to remove nodes
179218
} else {
180219
nodeHash := node.Hash()
181-
d.insert(&felt.Zero, &path, &nodeHash, true, node)
220+
d.insert(&felt.Address{}, &path, &nodeHash, true, node)
182221
}
183222
}
184223

@@ -187,7 +226,7 @@ func (d *Database) Update(
187226
continue
188227
} else {
189228
nodeHash := node.Hash()
190-
d.insert(&felt.Zero, &path, &nodeHash, false, node)
229+
d.insert(&felt.Address{}, &path, &nodeHash, false, node)
191230
}
192231
}
193232

@@ -209,7 +248,12 @@ type reader struct {
209248
d *Database
210249
}
211250

212-
func (r *reader) Node(owner *felt.Felt, path *trieutils.Path, hash *felt.Felt, isLeaf bool) ([]byte, error) {
251+
func (r *reader) Node(
252+
owner *felt.Address,
253+
path *trieutils.Path,
254+
hash *felt.Felt,
255+
isLeaf bool,
256+
) ([]byte, error) {
213257
return r.d.readNode(r.id.Bucket(), owner, path, hash, isLeaf)
214258
}
215259

@@ -228,15 +272,29 @@ func (d *Database) Close() error {
228272
func (d *Database) GetTrieRootNodes(classRootHash, contractRootHash *felt.Felt) (trienode.Node, trienode.Node, error) {
229273
const contractClassTrieHeight = 251
230274

231-
classRootBlob, err := trieutils.GetNodeByHash(d.disk, db.ClassTrie, &felt.Zero, &trieutils.Path{}, classRootHash, false)
275+
classRootBlob, err := trieutils.GetNodeByHash(
276+
d.disk,
277+
db.ClassTrie,
278+
&felt.Address{},
279+
&trieutils.Path{},
280+
classRootHash,
281+
false,
282+
)
232283
if err != nil {
233284
return nil, nil, fmt.Errorf("class root node not found: %w", err)
234285
}
235286
if classRootBlob == nil {
236287
return nil, nil, fmt.Errorf("class root node not found")
237288
}
238289

239-
contractRootBlob, err := trieutils.GetNodeByHash(d.disk, db.ContractTrieContract, &felt.Zero, &trieutils.Path{}, contractRootHash, false)
290+
contractRootBlob, err := trieutils.GetNodeByHash(
291+
d.disk,
292+
db.ContractTrieContract,
293+
&felt.Address{},
294+
&trieutils.Path{},
295+
contractRootHash,
296+
false,
297+
)
240298
if err != nil {
241299
return nil, nil, fmt.Errorf("contract root node not found: %w", err)
242300
}

0 commit comments

Comments
 (0)