From 7ccb43ea133a28da5597aff04c45c76258720b6b Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Fri, 30 Jan 2026 15:44:36 +0400 Subject: [PATCH] perf: cache fetched proof targets in `SparseTrieCacheTask` (#21612) Co-authored-by: Brian Picciano Co-authored-by: Amp --- .../src/tree/payload_processor/sparse_trie.rs | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs b/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs index eda1c7e409..5190fe2648 100644 --- a/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs +++ b/crates/engine/tree/src/tree/payload_processor/sparse_trie.rs @@ -178,6 +178,12 @@ pub(super) struct SparseTrieCacheTask>>, + /// Cache of account proof targets that were already fetched/requested from the proof workers. + /// account -> lowest `min_len` requested. + fetched_account_targets: B256Map, + /// Cache of storage proof targets that have already been fetched/requested from the proof + /// workers. account -> slot -> lowest `min_len` requested. + fetched_storage_targets: B256Map>, /// Metrics for the sparse trie. metrics: MultiProofTaskMetrics, } @@ -204,6 +210,8 @@ where account_updates: Default::default(), storage_updates: Default::default(), pending_account_updates: Default::default(), + fetched_account_targets: Default::default(), + fetched_storage_targets: Default::default(), metrics, } } @@ -397,13 +405,27 @@ where for (addr, updates) in &mut self.storage_updates { let trie = self.trie.get_or_create_storage_trie_mut(*addr); + let fetched_storage = self.fetched_storage_targets.entry(*addr).or_default(); - trie.update_leaves(updates, |path, min_len| { - targets - .storage_targets - .entry(*addr) - .or_default() - .push(Target::new(path).with_min_len(min_len)); + trie.update_leaves(updates, |path, min_len| match fetched_storage.entry(path) { + Entry::Occupied(mut entry) => { + if min_len < *entry.get() { + entry.insert(min_len); + targets + .storage_targets + .entry(*addr) + .or_default() + .push(Target::new(path).with_min_len(min_len)); + } + } + Entry::Vacant(entry) => { + entry.insert(min_len); + targets + .storage_targets + .entry(*addr) + .or_default() + .push(Target::new(path).with_min_len(min_len)); + } }) .map_err(ProviderError::other)?; @@ -481,7 +503,18 @@ where self.trie .trie_mut() .update_leaves(&mut self.account_updates, |target, min_len| { - targets.account_targets.push(Target::new(target).with_min_len(min_len)); + match self.fetched_account_targets.entry(target) { + Entry::Occupied(mut entry) => { + if min_len < *entry.get() { + entry.insert(min_len); + targets.account_targets.push(Target::new(target).with_min_len(min_len)); + } + } + Entry::Vacant(entry) => { + entry.insert(min_len); + targets.account_targets.push(Target::new(target).with_min_len(min_len)); + } + } }) .map_err(ProviderError::other)?;