Skip to content

Commit 21cf573

Browse files
authored
fix: move bytecode_by_hash from StateProvider to a dedicated BytecodeReader (paradigmxyz#16886)
1 parent 04f09f9 commit 21cf573

15 files changed

Lines changed: 83 additions & 40 deletions

File tree

crates/alloy-provider/src/lib.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ use reth_primitives::{
3434
Account, Bytecode, RecoveredBlock, SealedBlock, SealedHeader, TransactionMeta,
3535
};
3636
use reth_provider::{
37-
AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, CanonChainTracker,
38-
CanonStateNotification, CanonStateNotifications, CanonStateSubscriptions,
37+
AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BytecodeReader,
38+
CanonChainTracker, CanonStateNotification, CanonStateNotifications, CanonStateSubscriptions,
3939
ChainStateBlockReader, ChainStateBlockWriter, ChangeSetReader, DatabaseProviderFactory,
4040
HeaderProvider, PruneCheckpointReader, ReceiptProvider, StageCheckpointReader, StateProvider,
4141
StateProviderBox, StateProviderFactory, StateReader, StateRootProvider, StorageReader,
@@ -575,11 +575,6 @@ where
575575
})
576576
}
577577

578-
fn bytecode_by_hash(&self, _code_hash: &B256) -> Result<Option<Bytecode>, ProviderError> {
579-
// Cannot fetch bytecode by hash via RPC
580-
Err(ProviderError::UnsupportedProvider)
581-
}
582-
583578
fn account_code(&self, addr: &Address) -> Result<Option<Bytecode>, ProviderError> {
584579
self.block_on_async(async {
585580
let code = self
@@ -606,6 +601,18 @@ where
606601
}
607602
}
608603

604+
impl<P, Node, N> BytecodeReader for AlloyRethStateProvider<P, Node, N>
605+
where
606+
P: Provider<N> + Clone + 'static,
607+
N: Network,
608+
Node: NodeTypes,
609+
{
610+
fn bytecode_by_hash(&self, _code_hash: &B256) -> Result<Option<Bytecode>, ProviderError> {
611+
// Cannot fetch bytecode by hash via RPC
612+
Err(ProviderError::UnsupportedProvider)
613+
}
614+
}
615+
609616
impl<P, Node, N> AccountReader for AlloyRethStateProvider<P, Node, N>
610617
where
611618
P: Provider<N> + Clone + 'static,

crates/chain-state/src/in_memory.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -996,8 +996,8 @@ mod tests {
996996
use reth_ethereum_primitives::{EthPrimitives, Receipt};
997997
use reth_primitives_traits::{Account, Bytecode};
998998
use reth_storage_api::{
999-
AccountReader, BlockHashReader, HashedPostStateProvider, StateProofProvider, StateProvider,
1000-
StateRootProvider, StorageRootProvider,
999+
AccountReader, BlockHashReader, BytecodeReader, HashedPostStateProvider,
1000+
StateProofProvider, StateProvider, StateRootProvider, StorageRootProvider,
10011001
};
10021002
use reth_trie::{
10031003
AccountProof, HashedStorage, MultiProof, MultiProofTargets, StorageMultiProof,
@@ -1045,7 +1045,9 @@ mod tests {
10451045
) -> ProviderResult<Option<StorageValue>> {
10461046
Ok(None)
10471047
}
1048+
}
10481049

1050+
impl BytecodeReader for MockStateProvider {
10491051
fn bytecode_by_hash(&self, _code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
10501052
Ok(None)
10511053
}

crates/chain-state/src/memory_overlay.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use alloy_primitives::{keccak256, Address, BlockNumber, Bytes, StorageKey, Stora
44
use reth_errors::ProviderResult;
55
use reth_primitives_traits::{Account, Bytecode, NodePrimitives};
66
use reth_storage_api::{
7-
AccountReader, BlockHashReader, HashedPostStateProvider, StateProofProvider, StateProvider,
8-
StateRootProvider, StorageRootProvider,
7+
AccountReader, BlockHashReader, BytecodeReader, HashedPostStateProvider, StateProofProvider,
8+
StateProvider, StateRootProvider, StorageRootProvider,
99
};
1010
use reth_trie::{
1111
updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage, MultiProof,
@@ -222,7 +222,9 @@ impl<N: NodePrimitives> StateProvider for MemoryOverlayStateProviderRef<'_, N> {
222222

223223
self.historical.storage(address, storage_key)
224224
}
225+
}
225226

227+
impl<N: NodePrimitives> BytecodeReader for MemoryOverlayStateProviderRef<'_, N> {
226228
fn bytecode_by_hash(&self, code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
227229
for block in &self.in_memory {
228230
if let Some(contract) = block.execution_output.bytecode(code_hash) {

crates/engine/tree/src/tree/cached_state.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use reth_errors::ProviderResult;
66
use reth_metrics::Metrics;
77
use reth_primitives_traits::{Account, Bytecode};
88
use reth_provider::{
9-
AccountReader, BlockHashReader, HashedPostStateProvider, StateProofProvider, StateProvider,
10-
StateRootProvider, StorageRootProvider,
9+
AccountReader, BlockHashReader, BytecodeReader, HashedPostStateProvider, StateProofProvider,
10+
StateProvider, StateRootProvider, StorageRootProvider,
1111
};
1212
use reth_revm::db::BundleState;
1313
use reth_trie::{
@@ -162,7 +162,9 @@ impl<S: StateProvider> StateProvider for CachedStateProvider<S> {
162162
}
163163
}
164164
}
165+
}
165166

167+
impl<S: BytecodeReader> BytecodeReader for CachedStateProvider<S> {
166168
fn bytecode_by_hash(&self, code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
167169
if let Some(res) = self.caches.code_cache.get(code_hash) {
168170
self.metrics.code_cache_hits.increment(1);

crates/engine/tree/src/tree/instrumented_state.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use reth_errors::ProviderResult;
55
use reth_metrics::Metrics;
66
use reth_primitives_traits::{Account, Bytecode};
77
use reth_provider::{
8-
AccountReader, BlockHashReader, HashedPostStateProvider, StateProofProvider, StateProvider,
9-
StateRootProvider, StorageRootProvider,
8+
AccountReader, BlockHashReader, BytecodeReader, HashedPostStateProvider, StateProofProvider,
9+
StateProvider, StateRootProvider, StorageRootProvider,
1010
};
1111
use reth_trie::{
1212
updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage, MultiProof,
@@ -191,7 +191,9 @@ impl<S: StateProvider> StateProvider for InstrumentedStateProvider<S> {
191191
self.record_storage_fetch(start.elapsed());
192192
res
193193
}
194+
}
194195

196+
impl<S: BytecodeReader> BytecodeReader for InstrumentedStateProvider<S> {
195197
fn bytecode_by_hash(&self, code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
196198
let start = Instant::now();
197199
let res = self.state_provider.bytecode_by_hash(code_hash);

crates/revm/src/database.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::primitives::alloy_primitives::{BlockNumber, StorageKey, StorageValue}
22
use alloy_primitives::{Address, B256, U256};
33
use core::ops::{Deref, DerefMut};
44
use reth_primitives_traits::Account;
5-
use reth_storage_api::{AccountReader, BlockHashReader, StateProvider};
5+
use reth_storage_api::{AccountReader, BlockHashReader, BytecodeReader, StateProvider};
66
use reth_storage_errors::provider::{ProviderError, ProviderResult};
77
use revm::{bytecode::Bytecode, state::AccountInfo, Database, DatabaseRef};
88

@@ -47,7 +47,7 @@ impl<T: StateProvider> EvmStateProvider for T {
4747
&self,
4848
code_hash: &B256,
4949
) -> ProviderResult<Option<reth_primitives_traits::Bytecode>> {
50-
<T as StateProvider>::bytecode_by_hash(self, code_hash)
50+
<T as BytecodeReader>::bytecode_by_hash(self, code_hash)
5151
}
5252

5353
fn storage(

crates/revm/src/test_utils.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use alloy_primitives::{
44
};
55
use reth_primitives_traits::{Account, Bytecode};
66
use reth_storage_api::{
7-
AccountReader, BlockHashReader, HashedPostStateProvider, StateProofProvider, StateProvider,
8-
StateRootProvider, StorageRootProvider,
7+
AccountReader, BlockHashReader, BytecodeReader, HashedPostStateProvider, StateProofProvider,
8+
StateProvider, StateRootProvider, StorageRootProvider,
99
};
1010
use reth_storage_errors::provider::ProviderResult;
1111
use reth_trie::{
@@ -158,7 +158,9 @@ impl StateProvider for StateProviderTest {
158158
) -> ProviderResult<Option<alloy_primitives::StorageValue>> {
159159
Ok(self.accounts.get(&account).and_then(|(storage, _)| storage.get(&storage_key).copied()))
160160
}
161+
}
161162

163+
impl BytecodeReader for StateProviderTest {
162164
fn bytecode_by_hash(&self, code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
163165
Ok(self.contracts.get(code_hash).cloned())
164166
}

crates/rpc/rpc-eth-types/src/cache/db.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use alloy_primitives::{Address, B256, U256};
66
use reth_errors::ProviderResult;
77
use reth_revm::{database::StateProviderDatabase, DatabaseRef};
8-
use reth_storage_api::{HashedPostStateProvider, StateProvider};
8+
use reth_storage_api::{BytecodeReader, HashedPostStateProvider, StateProvider};
99
use reth_trie::{HashedStorage, MultiProofTargets};
1010
use revm::{
1111
database::{BundleState, CacheDB},
@@ -155,13 +155,6 @@ impl StateProvider for StateProviderTraitObjWrapper<'_> {
155155
self.0.storage(account, storage_key)
156156
}
157157

158-
fn bytecode_by_hash(
159-
&self,
160-
code_hash: &B256,
161-
) -> reth_errors::ProviderResult<Option<reth_primitives_traits::Bytecode>> {
162-
self.0.bytecode_by_hash(code_hash)
163-
}
164-
165158
fn account_code(
166159
&self,
167160
addr: &Address,
@@ -178,6 +171,15 @@ impl StateProvider for StateProviderTraitObjWrapper<'_> {
178171
}
179172
}
180173

174+
impl BytecodeReader for StateProviderTraitObjWrapper<'_> {
175+
fn bytecode_by_hash(
176+
&self,
177+
code_hash: &B256,
178+
) -> reth_errors::ProviderResult<Option<reth_primitives_traits::Bytecode>> {
179+
self.0.bytecode_by_hash(code_hash)
180+
}
181+
}
182+
181183
/// Hack to get around 'higher-ranked lifetime error', see
182184
/// <https://github.com/rust-lang/rust/issues/100013>
183185
#[expect(missing_debug_implementations)]

crates/rpc/rpc/src/debug.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use reth_rpc_eth_types::{EthApiError, StateCacheDb};
3434
use reth_rpc_server_types::{result::internal_rpc_err, ToRpcResult};
3535
use reth_storage_api::{
3636
BlockIdReader, BlockReaderIdExt, HeaderProvider, ProviderBlock, ReceiptProviderIdExt,
37-
StateProofProvider, StateProvider, StateProviderFactory, StateRootProvider, TransactionVariant,
37+
StateProofProvider, StateProviderFactory, StateRootProvider, TransactionVariant,
3838
};
3939
use reth_tasks::pool::BlockingTaskGuard;
4040
use reth_trie_common::{updates::TrieUpdates, HashedPostState};

crates/storage/provider/src/providers/state/historical.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use reth_db_api::{
1414
};
1515
use reth_primitives_traits::{Account, Bytecode};
1616
use reth_storage_api::{
17-
BlockNumReader, DBProvider, StateCommitmentProvider, StateProofProvider, StorageRootProvider,
17+
BlockNumReader, BytecodeReader, DBProvider, StateCommitmentProvider, StateProofProvider,
18+
StorageRootProvider,
1819
};
1920
use reth_storage_errors::provider::ProviderResult;
2021
use reth_trie::{
@@ -433,7 +434,11 @@ impl<Provider: DBProvider + BlockNumReader + BlockHashReader + StateCommitmentPr
433434
.or(Some(StorageValue::ZERO))),
434435
}
435436
}
437+
}
436438

439+
impl<Provider: DBProvider + BlockNumReader + StateCommitmentProvider> BytecodeReader
440+
for HistoricalStateProviderRef<'_, Provider>
441+
{
437442
/// Get account code by its hash
438443
fn bytecode_by_hash(&self, code_hash: &B256) -> ProviderResult<Option<Bytecode>> {
439444
self.tx().get_by_encoded_key::<tables::Bytecodes>(code_hash).map_err(Into::into)

0 commit comments

Comments
 (0)