Skip to content

Commit 026d019

Browse files
refactor(state): split state into State and StateReader (#3563)
* refactor(state): split state into `State` and `StateReader` * refactor: split `state.go` into two separate files * chore: split tests, rename sub directories * chore: address performance comment * refactor: make `FeltToPath` static helper * fix: package renames
1 parent 1364259 commit 026d019

12 files changed

Lines changed: 958 additions & 950 deletions

File tree

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package statefactory
1+
package factory
22

33
import (
44
"github.com/NethermindEth/juno/core"

core/state/statefactory/state_factory_test.go renamed to core/state/factory/state_factory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package statefactory
1+
package factory
22

33
import (
44
"testing"

core/state/history.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var _ core.StateReader = (*stateHistory)(nil)
1111
// StateHistory represents a snapshot of the blockchain state at a specific block number.
1212
type stateHistory struct {
1313
blockNum uint64
14-
state *State
14+
state *StateReader
1515
}
1616

1717
func NewStateHistory(blockNum uint64, stateRoot *felt.Felt, db *StateDB) (stateHistory, error) {
@@ -28,33 +28,33 @@ func NewStateHistory(blockNum uint64, stateRoot *felt.Felt, db *StateDB) (stateH
2828

2929
func (s *stateHistory) ContractClassHash(addr *felt.Felt) (felt.Felt, error) {
3030
if err := s.checkDeployed(addr); err != nil {
31-
return felt.Felt{}, err
31+
return felt.Zero, err
3232
}
3333
ret, err := s.state.ContractClassHashAt(addr, s.blockNum)
3434
if err != nil {
35-
return felt.Felt{}, err
35+
return felt.Zero, err
3636
}
3737
return ret, nil
3838
}
3939

4040
func (s *stateHistory) ContractNonce(addr *felt.Felt) (felt.Felt, error) {
4141
if err := s.checkDeployed(addr); err != nil {
42-
return felt.Felt{}, err
42+
return felt.Zero, err
4343
}
4444
ret, err := s.state.ContractNonceAt(addr, s.blockNum)
4545
if err != nil {
46-
return felt.Felt{}, err
46+
return felt.Zero, err
4747
}
4848
return ret, nil
4949
}
5050

5151
func (s *stateHistory) ContractStorage(addr, key *felt.Felt) (felt.Felt, error) {
5252
if err := s.checkDeployed(addr); err != nil {
53-
return felt.Felt{}, err
53+
return felt.Zero, err
5454
}
5555
ret, err := s.state.ContractStorageAt(addr, key, s.blockNum)
5656
if err != nil {
57-
return felt.Felt{}, err
57+
return felt.Zero, err
5858
}
5959
return ret, nil
6060
}

core/state/object.go

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"github.com/NethermindEth/juno/core/felt"
77
"github.com/NethermindEth/juno/core/trie2"
88
"github.com/NethermindEth/juno/core/trie2/trienode"
9-
"github.com/NethermindEth/juno/core/trie2/trieutils"
10-
"github.com/NethermindEth/juno/db"
119
"golang.org/x/exp/maps"
1210
)
1311

@@ -40,40 +38,15 @@ func (s *stateObject) setNonce(nonce *felt.Felt) {
4038
s.contract.Nonce = *nonce
4139
}
4240

43-
func (s *stateObject) getStorage(key *felt.Felt) (felt.Felt, error) {
44-
if value, ok := s.dirtyStorage[*key]; ok {
45-
return *value, nil
46-
}
47-
48-
tr, err := s.getStorageTrie()
49-
if err != nil {
50-
return felt.Zero, err
51-
}
52-
53-
path := tr.FeltToPath(key)
54-
v, err := trieutils.GetNodeByPath(
55-
s.state.db.disk,
56-
db.ContractTrieStorage,
57-
(*felt.Address)(&s.addr),
58-
&path,
59-
true,
60-
)
61-
if err != nil {
62-
return felt.Zero, err
63-
}
64-
65-
var val felt.Felt
66-
val.SetBytes(v)
67-
68-
return val, nil
69-
}
70-
7141
func (s *stateObject) getStorageTrie() (*trie2.Trie, error) {
7242
if s.storageTrie != nil {
7343
return s.storageTrie, nil
7444
}
7545

76-
storageTrie, err := s.state.db.ContractStorageTrie(&s.state.initRoot, &s.addr)
46+
storageTrie, err := s.state.db.ContractStorageTrie(
47+
&s.state.initRoot,
48+
&s.addr,
49+
)
7750
if err != nil {
7851
return nil, err
7952
}
@@ -82,17 +55,20 @@ func (s *stateObject) getStorageTrie() (*trie2.Trie, error) {
8255
return storageTrie, nil
8356
}
8457

85-
func (s *stateObject) getStorageRoot() felt.Felt {
58+
func (s *stateObject) getStorageRoot() (felt.Felt, error) {
8659
// If the storage trie is loaded, it may be modified somewhere already.
8760
// Return the hash of the trie and update the contract's storage root.
8861
if s.storageTrie != nil {
89-
root, _ := s.storageTrie.Hash()
62+
root, err := s.storageTrie.Hash()
63+
if err != nil {
64+
return felt.Zero, err
65+
}
9066
s.contract.StorageRoot = root
91-
return root
67+
return root, nil
9268
}
9369

9470
// Otherwise, return the storage root from the contract.
95-
return s.contract.StorageRoot
71+
return s.contract.StorageRoot, nil
9672
}
9773

9874
func (s *stateObject) commit() (*trienode.NodeSet, error) {

0 commit comments

Comments
 (0)