Skip to content

Commit 75081c8

Browse files
committed
fix: use different cache instance per precompile
1 parent a2c1646 commit 75081c8

File tree

5 files changed

+36
-27
lines changed

5 files changed

+36
-27
lines changed

crates/engine/tree/benches/state_root_task.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use reth_chain_state::EthPrimitives;
1313
use reth_chainspec::ChainSpec;
1414
use reth_db_common::init::init_genesis;
1515
use reth_engine_tree::tree::{
16-
executor::WorkloadExecutor, precompile_cache::PrecompileCache, PayloadProcessor,
16+
executor::WorkloadExecutor, precompile_cache::PrecompileCacheMap, PayloadProcessor,
1717
StateProviderBuilder, TreeConfig,
1818
};
1919
use reth_evm::OnStateHook;
@@ -221,7 +221,7 @@ fn bench_state_root(c: &mut Criterion) {
221221
WorkloadExecutor::default(),
222222
EthEvmConfig::new(factory.chain_spec()),
223223
&TreeConfig::default(),
224-
PrecompileCache::default(),
224+
PrecompileCacheMap::default(),
225225
);
226226
let provider = BlockchainProvider::new(factory).unwrap();
227227

crates/engine/tree/src/tree/mod.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use error::{InsertBlockError, InsertBlockErrorKind, InsertBlockFatalError};
1818
use instrumented_state::InstrumentedStateProvider;
1919
use payload_processor::sparse_trie::StateRootComputeOutcome;
2020
use persistence_state::CurrentPersistenceAction;
21-
use precompile_cache::{CachedPrecompile, PrecompileCache};
21+
use precompile_cache::{CachedPrecompile, PrecompileCacheMap};
2222
use reth_chain_state::{
2323
CanonicalInMemoryState, ExecutedBlock, ExecutedBlockWithTrieUpdates,
2424
MemoryOverlayStateProvider, NewCanonicalChain,
@@ -268,8 +268,8 @@ where
268268
payload_processor: PayloadProcessor<N, C>,
269269
/// The EVM configuration.
270270
evm_config: C,
271-
/// Precompile cache.
272-
precompile_cache: PrecompileCache,
271+
/// Precompile cache map.
272+
precompile_cache_map: PrecompileCacheMap,
273273
}
274274

275275
impl<N, P: Debug, T: PayloadTypes + Debug, V: Debug, C: Debug> std::fmt::Debug
@@ -334,13 +334,13 @@ where
334334
) -> Self {
335335
let (incoming_tx, incoming) = std::sync::mpsc::channel();
336336

337-
let precompile_cache = PrecompileCache::default();
337+
let precompile_cache_map = PrecompileCacheMap::default();
338338

339339
let payload_processor = PayloadProcessor::new(
340340
WorkloadExecutor::default(),
341341
evm_config.clone(),
342342
&config,
343-
precompile_cache.clone(),
343+
precompile_cache_map.clone(),
344344
);
345345

346346
Self {
@@ -362,7 +362,7 @@ where
362362
engine_kind,
363363
payload_processor,
364364
evm_config,
365-
precompile_cache,
365+
precompile_cache_map,
366366
}
367367
}
368368

@@ -2275,7 +2275,7 @@ where
22752275

22762276
/// Executes a block with the given state provider
22772277
fn execute_block<S: StateProvider>(
2278-
&self,
2278+
&mut self,
22792279
state_provider: S,
22802280
block: &RecoveredBlock<N::Block>,
22812281
handle: &PayloadHandle,
@@ -2289,8 +2289,11 @@ where
22892289
let mut executor = self.evm_config.executor_for_block(&mut db, block);
22902290

22912291
if self.config.precompile_cache_enabled() {
2292-
executor.evm_mut().precompiles_mut().map_precompiles(|_, precompile| {
2293-
CachedPrecompile::wrap(precompile, self.precompile_cache.clone())
2292+
executor.evm_mut().precompiles_mut().map_precompiles(|address, precompile| {
2293+
CachedPrecompile::wrap(
2294+
precompile,
2295+
self.precompile_cache_map.entry(*address).or_default().clone(),
2296+
)
22942297
});
22952298
}
22962299

crates/engine/tree/src/tree/payload_processor/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::tree::{
66
prewarm::{PrewarmCacheTask, PrewarmContext, PrewarmTaskEvent},
77
sparse_trie::StateRootComputeOutcome,
88
},
9-
precompile_cache::PrecompileCache,
109
sparse_trie::SparseTrieTask,
1110
StateProviderBuilder, TreeConfig,
1211
};
@@ -39,6 +38,8 @@ use std::{
3938
},
4039
};
4140

41+
use super::precompile_cache::PrecompileCacheMap;
42+
4243
pub mod executor;
4344
pub mod multiproof;
4445
pub mod prewarm;
@@ -61,8 +62,8 @@ pub struct PayloadProcessor<N, Evm> {
6162
evm_config: Evm,
6263
/// whether precompile cache should be enabled.
6364
precompile_cache_enabled: bool,
64-
/// Precompile cache.
65-
precompile_cache: PrecompileCache,
65+
/// Precompile cache map.
66+
precompile_cache_map: PrecompileCacheMap,
6667
_marker: std::marker::PhantomData<N>,
6768
}
6869

@@ -72,7 +73,7 @@ impl<N, Evm> PayloadProcessor<N, Evm> {
7273
executor: WorkloadExecutor,
7374
evm_config: Evm,
7475
config: &TreeConfig,
75-
precompile_cache: PrecompileCache,
76+
precompile_cache_map: PrecompileCacheMap,
7677
) -> Self {
7778
Self {
7879
executor,
@@ -82,7 +83,7 @@ impl<N, Evm> PayloadProcessor<N, Evm> {
8283
disable_transaction_prewarming: config.disable_caching_and_prewarming(),
8384
evm_config,
8485
precompile_cache_enabled: config.precompile_cache_enabled(),
85-
precompile_cache,
86+
precompile_cache_map,
8687
_marker: Default::default(),
8788
}
8889
}
@@ -266,7 +267,7 @@ where
266267
metrics: PrewarmMetrics::default(),
267268
terminate_execution: Arc::new(AtomicBool::new(false)),
268269
precompile_cache_enabled: self.precompile_cache_enabled,
269-
precompile_cache: self.precompile_cache.clone(),
270+
precompile_cache_map: self.precompile_cache_map.clone(),
270271
};
271272

272273
let prewarm_task = PrewarmCacheTask::new(
@@ -434,13 +435,11 @@ impl ExecutionCache {
434435

435436
#[cfg(test)]
436437
mod tests {
437-
use std::sync::Arc;
438-
439438
use crate::tree::{
440439
payload_processor::{
441440
evm_state_to_hashed_post_state, executor::WorkloadExecutor, PayloadProcessor,
442441
},
443-
precompile_cache::PrecompileCache,
442+
precompile_cache::PrecompileCacheMap,
444443
StateProviderBuilder, TreeConfig,
445444
};
446445
use alloy_evm::block::StateChangeSource;
@@ -460,6 +459,7 @@ mod tests {
460459
use reth_trie::{test_utils::state_root, HashedPostState, TrieInput};
461460
use revm_primitives::{Address, HashMap, B256, KECCAK_EMPTY, U256};
462461
use revm_state::{AccountInfo, AccountStatus, EvmState, EvmStorageSlot};
462+
use std::sync::Arc;
463463

464464
fn create_mock_state_updates(num_accounts: usize, updates_per_account: usize) -> Vec<EvmState> {
465465
let mut rng = generators::rng();
@@ -563,7 +563,7 @@ mod tests {
563563
WorkloadExecutor::default(),
564564
EthEvmConfig::new(factory.chain_spec()),
565565
&TreeConfig::default(),
566-
PrecompileCache::default(),
566+
PrecompileCacheMap::default(),
567567
);
568568
let provider = BlockchainProvider::new(factory).unwrap();
569569
let mut handle = payload_processor.spawn(

crates/engine/tree/src/tree/payload_processor/prewarm.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::tree::{
55
payload_processor::{
66
executor::WorkloadExecutor, multiproof::MultiProofMessage, ExecutionCache,
77
},
8-
precompile_cache::{CachedPrecompile, PrecompileCache},
8+
precompile_cache::{CachedPrecompile, PrecompileCacheMap},
99
StateProviderBuilder,
1010
};
1111
use alloy_consensus::transaction::Recovered;
@@ -207,7 +207,7 @@ pub(super) struct PrewarmContext<N: NodePrimitives, P, Evm> {
207207
/// An atomic bool that tells prewarm tasks to not start any more execution.
208208
pub(super) terminate_execution: Arc<AtomicBool>,
209209
pub(super) precompile_cache_enabled: bool,
210-
pub(super) precompile_cache: PrecompileCache,
210+
pub(super) precompile_cache_map: PrecompileCacheMap,
211211
}
212212

213213
impl<N, P, Evm> PrewarmContext<N, P, Evm>
@@ -230,7 +230,7 @@ where
230230
metrics,
231231
terminate_execution,
232232
precompile_cache_enabled,
233-
precompile_cache,
233+
mut precompile_cache_map,
234234
} = self;
235235

236236
let state_provider = match provider.build() {
@@ -261,8 +261,11 @@ where
261261
let mut evm = evm_config.evm_with_env(state_provider, evm_env);
262262

263263
if precompile_cache_enabled {
264-
evm.precompiles_mut().map_precompiles(|_, precompile| {
265-
CachedPrecompile::wrap(precompile, precompile_cache.clone())
264+
evm.precompiles_mut().map_precompiles(|address, precompile| {
265+
CachedPrecompile::wrap(
266+
precompile,
267+
precompile_cache_map.entry(*address).or_default().clone(),
268+
)
266269
});
267270
}
268271

crates/engine/tree/src/tree/precompile_cache.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
33
use reth_evm::precompiles::{DynPrecompile, Precompile};
44
use revm::precompile::{PrecompileOutput, PrecompileResult};
5-
use revm_primitives::Bytes;
5+
use revm_primitives::{Address, Bytes, HashMap};
66
use std::sync::Arc;
77

8+
/// Stores caches for each precompile.
9+
pub type PrecompileCacheMap = HashMap<Address, PrecompileCache>;
10+
811
/// Cache for precompiles, for each input stores the result.
912
#[derive(Debug, Clone)]
1013
pub struct PrecompileCache(

0 commit comments

Comments
 (0)