Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions blockchain/blockchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ type Reader interface {
HeadState() (core.StateReader, StateCloser, error)
StateAtBlockHash(blockHash *felt.Felt) (core.StateReader, StateCloser, error)
StateAtBlockNumber(blockNumber uint64) (core.StateReader, StateCloser, error)
TrieStateAtBlockNumber(blockNumber uint64) (core.StateReader, StateCloser, error)

BlockCommitmentsByNumber(blockNumber uint64) (*core.BlockCommitments, error)

Expand Down Expand Up @@ -464,6 +465,14 @@ func (b *Blockchain) StateAtBlockHash(
return b.stateBackend.StateAtBlockHash(blockHash)
}

// TrieStateAtBlockNumber returns a StateReader with trie access at the given block number.
func (b *Blockchain) TrieStateAtBlockNumber(
blockNumber uint64,
) (core.StateReader, StateCloser, error) {
b.listener.OnRead("TrieStateAtBlockNumber")
return b.stateBackend.TrieStateAtBlockNumber(blockNumber)
}

// EventFilter returns an EventFilter object that is tied to a snapshot of the blockchain
func (b *Blockchain) EventFilter(
addresses []felt.Address,
Expand Down
24 changes: 24 additions & 0 deletions blockchain/statebackend/deprecated.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,30 @@
), NoopStateCloser, nil
}

func (b *deprecatedStateBackend) TrieStateAtBlockNumber(
blockNumber uint64,
) (core.StateReader, StateCloser, error) {
if err := pruner.RequireStateRetainedByBlockNumber(
b.database,
b.retentionFloor,
blockNumber,
); err != nil {
return nil, nil, err

Check warning on line 74 in blockchain/statebackend/deprecated.go

View check run for this annotation

Codecov / codecov/patch

blockchain/statebackend/deprecated.go#L74

Added line #L74 was not covered by tests
}

//nolint:staticcheck,nolintlint // used by old state
txn := b.database.NewIndexedBatch()
height, err := core.GetChainHeight(txn)
if err != nil {
return nil, nil, err

Check warning on line 81 in blockchain/statebackend/deprecated.go

View check run for this annotation

Codecov / codecov/patch

blockchain/statebackend/deprecated.go#L81

Added line #L81 was not covered by tests
}
if height != blockNumber {
return nil, nil, db.ErrKeyNotFound

Check warning on line 84 in blockchain/statebackend/deprecated.go

View check run for this annotation

Codecov / codecov/patch

blockchain/statebackend/deprecated.go#L84

Added line #L84 was not covered by tests
}

return deprecatedstate.New(txn), NoopStateCloser, nil
}

func (b *deprecatedStateBackend) Store(
block *core.Block,
blockCommitments *core.BlockCommitments,
Expand Down
19 changes: 19 additions & 0 deletions blockchain/statebackend/statebackend.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,25 @@
return &history, NoopStateCloser, nil
}

func (b *stateBackend) TrieStateAtBlockNumber(
blockNumber uint64,
) (core.StateReader, StateCloser, error) {
stateRoot, err := pruner.StateRootIfStateRetainedByBlockNumber(
b.database,
b.retentionFloor,
blockNumber,
)
if err != nil {
return nil, nil, err

Check warning on line 89 in blockchain/statebackend/statebackend.go

View check run for this annotation

Codecov / codecov/patch

blockchain/statebackend/statebackend.go#L89

Added line #L89 was not covered by tests
}

st, err := state.NewStateReader(stateRoot, b.stateDB)
if err != nil {
return nil, nil, err

Check warning on line 94 in blockchain/statebackend/statebackend.go

View check run for this annotation

Codecov / codecov/patch

blockchain/statebackend/statebackend.go#L94

Added line #L94 was not covered by tests
}
return st, NoopStateCloser, nil
}

func (b *stateBackend) Store(
block *core.Block,
blockCommitments *core.BlockCommitments,
Expand Down
1 change: 1 addition & 0 deletions blockchain/statebackend/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type StateBackend interface {
HeadState() (core.StateReader, StateCloser, error)
StateAtBlockNumber(blockNumber uint64) (core.StateReader, StateCloser, error)
StateAtBlockHash(blockHash *felt.Felt) (core.StateReader, StateCloser, error)
TrieStateAtBlockNumber(blockNumber uint64) (core.StateReader, StateCloser, error)
Store(
block *core.Block,
commitments *core.BlockCommitments,
Expand Down
16 changes: 16 additions & 0 deletions mocks/mock_blockchain.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion rpc/v10/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ func (h *Handler) StorageProof(
return nil, rpccore.ErrInternal.CloneWithData(err)
}

state, closer, err := h.bcReader.HeadState()
state, closer, err := h.bcReader.TrieStateAtBlockNumber(chainHeight)
if err != nil {
return nil, rpccore.ErrInternal.CloneWithData(err)
}
Expand Down
5 changes: 4 additions & 1 deletion rpc/v10/storage_bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,10 @@ func (f *storageProofBenchmarkFixture) setup(

mockReader.EXPECT().Height().Return(f.blockNumber, nil).AnyTimes()
mockReader.EXPECT().BlockHeaderHashByNumber(f.blockNumber).Return(f.blkHash, nil).AnyTimes()
mockReader.EXPECT().HeadState().Return(mockState, func() error { return nil }, nil).AnyTimes()
mockReader.EXPECT().
TrieStateAtBlockNumber(f.blockNumber).
Return(mockState, func() error { return nil }, nil).
AnyTimes()

mockState.EXPECT().ClassTrie().Return(classTrie, nil).AnyTimes()
mockState.EXPECT().ContractTrie().Return(contractTrie, nil).AnyTimes()
Expand Down
5 changes: 4 additions & 1 deletion rpc/v10/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,10 @@ func TestStorageProof(t *testing.T) {

mockReader := mocks.NewMockReader(mockCtrl)
mockState := mocks.NewMockStateReader(mockCtrl)
mockReader.EXPECT().HeadState().Return(mockState, func() error { return nil }, nil).AnyTimes()
mockReader.EXPECT().
TrieStateAtBlockNumber(blockNumber).
Return(mockState, func() error { return nil }, nil).
AnyTimes()
mockReader.EXPECT().Head().Return(headBlock, nil).AnyTimes()
mockReader.EXPECT().BlockByNumber(blockNumber).Return(headBlock, nil).AnyTimes()
mockReader.EXPECT().Height().Return(blockNumber, nil).AnyTimes()
Expand Down
2 changes: 1 addition & 1 deletion rpc/v9/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func (h *Handler) StorageProof(
return nil, rpccore.ErrInternal.CloneWithData(err)
}

state, closer, err := h.bcReader.HeadState()
state, closer, err := h.bcReader.TrieStateAtBlockNumber(chainHeight)
if err != nil {
return nil, rpccore.ErrInternal.CloneWithData(err)
}
Expand Down
5 changes: 4 additions & 1 deletion rpc/v9/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,10 @@ func TestStorageProof(t *testing.T) {

mockReader := mocks.NewMockReader(mockCtrl)
mockState := mocks.NewMockStateReader(mockCtrl)
mockReader.EXPECT().HeadState().Return(mockState, func() error { return nil }, nil).AnyTimes()
mockReader.EXPECT().
TrieStateAtBlockNumber(blockNumber).
Return(mockState, func() error { return nil }, nil).
AnyTimes()
mockReader.EXPECT().Head().Return(headBlock, nil).AnyTimes()
mockReader.EXPECT().BlockByNumber(blockNumber).Return(headBlock, nil).AnyTimes()
mockReader.EXPECT().Height().Return(blockNumber, nil).AnyTimes()
Expand Down
Loading