Skip to content

Commit 9dfbf9b

Browse files
perf: skip unnecessary eth_getCode requests (#761)
- Disable eth_getCode request on every storage request - Only fetch code when code hash is non-nullish in the account proof
1 parent 4a1ffba commit 9dfbf9b

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

core/src/execution/providers/rpc.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use alloy::{
77
primitives::HeaderResponse, BlockResponse, ReceiptResponse, TransactionBuilder,
88
TransactionResponse,
99
},
10-
primitives::{Address, B256, U256},
10+
primitives::{Address, Bytes, B256, U256},
1111
providers::{Provider, ProviderBuilder, RootProvider},
1212
rlp,
1313
rpc::{
@@ -16,7 +16,7 @@ use alloy::{
1616
},
1717
transports::layers::RetryBackoffLayer,
1818
};
19-
use alloy_trie::TrieAccount;
19+
use alloy_trie::{TrieAccount, KECCAK_EMPTY};
2020
use async_trait::async_trait;
2121
use eyre::{eyre, Result};
2222
use futures::future::{join_all, try_join_all};
@@ -224,9 +224,13 @@ impl<N: NetworkSpec, B: BlockProvider<N>, H: HistoricalBlockProvider<N>> Account
224224
verify_storage_proof(&proof)?;
225225

226226
let code = if with_code {
227-
let code = self.provider.get_code_at(address).await?;
228-
verify_code_hash_proof(&proof, &code)?;
229-
Some(code)
227+
if proof.code_hash == KECCAK_EMPTY || proof.code_hash == B256::ZERO {
228+
Some(Bytes::new())
229+
} else {
230+
let code = self.provider.get_code_at(address).await?;
231+
verify_code_hash_proof(&proof, &code)?;
232+
Some(code)
233+
}
230234
} else {
231235
None
232236
};

revm-utils/src/proof_db.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ impl<N: NetworkSpec, E: ExecutionProvider<N>> EvmState<N, E> {
8282
let slot_bytes = B256::from(slot);
8383
let account = self
8484
.execution
85-
.get_account(address, &[slot_bytes], true, self.block)
85+
.get_account(address, &[slot_bytes], false, self.block)
8686
.await?;
8787

8888
if let Some(stored_account) = self.accounts.get_mut(&address) {
@@ -124,6 +124,12 @@ impl<N: NetworkSpec, E: ExecutionProvider<N>> EvmState<N, E> {
124124
.and_then(|overrides| overrides.get(&address));
125125

126126
if let Some(account) = self.accounts.get_mut(&address) {
127+
let code_is_overriden = override_opt.and_then(|o| o.code.as_ref()).is_some();
128+
if account.code.is_none() && !code_is_overriden {
129+
self.access = Some(StateAccess::Basic(address));
130+
return Err(DatabaseError::StateMissing);
131+
}
132+
127133
if let Some(override_opt) = override_opt {
128134
apply_account_overrides(account, override_opt)?;
129135
}

0 commit comments

Comments
 (0)