Skip to content

Commit 422733a

Browse files
refactor(state): remove DB writes from the new state to make writes atomic (#3360)
* squash fix unit tests cleanups renames unit tests interface modifications linter linter linter * linter * linter * chore: remove last staticcheck, organise mocks * squash cleanups Integrate common interfaces into rawdb fixes after rebase minor linter changes clean-up blockchain.go, fix linter minor cleanups clean cache fix unit tests fixes after rebase * squash cleanups Integrate common interfaces into rawdb fixes after rebase minor linter changes clean-up blockchain.go, fix linter minor cleanups state atomicity remove node ordering fixes after rebase * changes to the atomicity * code style * unit tests * fix: minor fixes after rebase * chore: address first batch of comments on the PR * chore: fixes after rebase * chore: remove empty state constructor * chore: address the PR comments, use new felt constructors * test: fix unit tests * fix(core/state): compilation errors * chore: address PR comments, fix unit tests * test: improve code coverage * chore: linter * test: increase codecov * chore: clean up unnecessary noise --------- Co-authored-by: Rodrigo <rodrodpino@gmail.com>
1 parent 0e84cab commit 422733a

17 files changed

Lines changed: 572 additions & 559 deletions

File tree

core/state/cache.go

Lines changed: 0 additions & 138 deletions
This file was deleted.

core/state/cache_test.go

Lines changed: 0 additions & 170 deletions
This file was deleted.

core/state/database.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ const (
1616
)
1717

1818
type StateDB struct {
19-
disk db.KeyValueStore
20-
triedb database.TrieDB
21-
stateCache *stateCache
19+
disk db.KeyValueStore
20+
triedb database.TrieDB
2221
}
2322

2423
func NewStateDB(disk db.KeyValueStore, triedb database.TrieDB) *StateDB {
25-
stateCache := newStateCache()
26-
return &StateDB{disk: disk, triedb: triedb, stateCache: &stateCache}
24+
return &StateDB{disk: disk, triedb: triedb}
2725
}
2826

2927
// Opens a class trie for the given state root

core/state/history.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type stateHistory struct {
1515
}
1616

1717
func NewStateHistory(blockNum uint64, stateRoot *felt.Felt, db *StateDB) (stateHistory, error) {
18-
state, err := New(stateRoot, db)
18+
state, err := NewStateReader(stateRoot, db)
1919
if err != nil {
2020
return stateHistory{}, err
2121
}

core/state/history_test.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@ func TestStateHistoryClassOperations(t *testing.T) {
143143
NewRoot: &felt.Zero,
144144
StateDiff: &core.StateDiff{},
145145
}
146-
state, err := New(&felt.Zero, stateDB)
146+
batch := stateDB.disk.NewBatch()
147+
state, err := New(&felt.Zero, stateDB, batch)
147148
require.NoError(t, err)
148149
err = state.Update(&core.Header{Number: 0}, stateUpdate, classes, false)
150+
require.NoError(t, batch.Write())
149151
require.NoError(t, err)
150152
stateComm, err := state.Commitment("")
151153
require.NoError(t, err)
@@ -159,10 +161,12 @@ func TestStateHistoryClassOperations(t *testing.T) {
159161
class2Hash: class2,
160162
}
161163

162-
state, err = New(&stateComm, stateDB)
164+
batch = stateDB.disk.NewBatch()
165+
state, err = New(&stateComm, stateDB, batch)
163166
require.NoError(t, err)
164167
err = state.Update(&core.Header{Number: 1}, stateUpdate, classes2, false)
165168
require.NoError(t, err)
169+
require.NoError(t, batch.Write())
166170

167171
historyBlock0, err := NewStateHistory(0, &felt.Zero, stateDB)
168172
require.NoError(t, err)
@@ -225,7 +229,8 @@ func TestStateHistoryContractStorageLastUpdatedBlock(t *testing.T) {
225229
value := felt.NewFromUint64[felt.Felt](99)
226230

227231
stateDB := newTestStateDB()
228-
state, err := New(&felt.Zero, stateDB)
232+
batch := stateDB.disk.NewBatch()
233+
state, err := New(&felt.Zero, stateDB, batch)
229234
require.NoError(t, err)
230235

231236
su0 := &core.StateUpdate{
@@ -239,11 +244,13 @@ func TestStateHistoryContractStorageLastUpdatedBlock(t *testing.T) {
239244
}
240245
firstChangeBlock := uint64(0)
241246
require.NoError(t, state.Update(&core.Header{Number: firstChangeBlock}, su0, nil, true))
247+
require.NoError(t, batch.Write())
242248

243249
root0, err := state.Commitment("")
244250
require.NoError(t, err)
245251

246-
state, err = New(&root0, stateDB)
252+
batch = stateDB.disk.NewBatch()
253+
state, err = New(&root0, stateDB, batch)
247254
require.NoError(t, err)
248255

249256
su3 := &core.StateUpdate{
@@ -257,6 +264,7 @@ func TestStateHistoryContractStorageLastUpdatedBlock(t *testing.T) {
257264
}
258265
secondChangeBlock := uint64(3)
259266
require.NoError(t, state.Update(&core.Header{Number: secondChangeBlock}, su3, nil, true))
267+
require.NoError(t, batch.Write())
260268

261269
t.Run("returns most recent update before history block", func(t *testing.T) {
262270
history, err := NewStateHistory(2, &felt.Zero, stateDB)

0 commit comments

Comments
 (0)