From 963c26550a65fdc886c94ca990331a774eefd5be Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Fri, 23 Jan 2026 20:13:01 +0000 Subject: [PATCH] fix(trie): only clone required keys in on_prefetch_proofs (#21378) --- .../tree/src/tree/payload_processor/multiproof.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/engine/tree/src/tree/payload_processor/multiproof.rs b/crates/engine/tree/src/tree/payload_processor/multiproof.rs index 472ea08a6c..dce4544764 100644 --- a/crates/engine/tree/src/tree/payload_processor/multiproof.rs +++ b/crates/engine/tree/src/tree/payload_processor/multiproof.rs @@ -777,10 +777,21 @@ impl MultiProofTask { // [`MultiAddedRemovedKeys`]. Even if there are not any known removed keys for the account, // we still want to optimistically fetch extension children for the leaf addition case. // V2 multiproofs don't need this. + // + // Only clone the AddedRemovedKeys for accounts in the targets, not the entire accumulated + // set, to avoid O(n) cloning with many buffered blocks. let multi_added_removed_keys = if let VersionedMultiProofTargets::Legacy(legacy_targets) = &targets { self.multi_added_removed_keys.touch_accounts(legacy_targets.keys().copied()); - Some(Arc::new(self.multi_added_removed_keys.clone())) + Some(Arc::new(MultiAddedRemovedKeys { + account: self.multi_added_removed_keys.account.clone(), + storages: legacy_targets + .keys() + .filter_map(|k| { + self.multi_added_removed_keys.storages.get(k).map(|v| (*k, v.clone())) + }) + .collect(), + })) } else { None };