From b0e30d341d34d76a9db6712f41402decde1499ef Mon Sep 17 00:00:00 2001 From: Silver Date: Wed, 1 Oct 2025 04:10:56 +0800 Subject: [PATCH] perf(anvil): optimize internal data passing in log queries --- crates/anvil/src/eth/backend/mem/mod.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/anvil/src/eth/backend/mem/mod.rs b/crates/anvil/src/eth/backend/mem/mod.rs index 73bf0d9f5780c..bd5b415348ba2 100644 --- a/crates/anvil/src/eth/backend/mem/mod.rs +++ b/crates/anvil/src/eth/backend/mem/mod.rs @@ -2093,7 +2093,7 @@ impl Backend { hash: B256, ) -> Result, BlockchainError> { if let Some(block) = self.blockchain.get_block_by_hash(&hash) { - return Ok(self.mined_logs_for_block(filter, block)); + return Ok(self.mined_logs_for_block(filter, block, hash)); } if let Some(fork) = self.get_fork() { @@ -2104,9 +2104,8 @@ impl Backend { } /// Returns all `Log`s mined by the node that were emitted in the `block` and match the `Filter` - fn mined_logs_for_block(&self, filter: Filter, block: Block) -> Vec { + fn mined_logs_for_block(&self, filter: Filter, block: Block, block_hash: B256) -> Vec { let mut all_logs = Vec::new(); - let block_hash = block.header.hash_slow(); let mut block_log_index = 0u32; let storage = self.blockchain.storage.read(); @@ -2167,8 +2166,12 @@ impl Backend { } for number in from..=to { - if let Some(block) = self.get_block(number) { - all_logs.extend(self.mined_logs_for_block(filter.clone(), block)); + let storage = self.blockchain.storage.read(); + if let Some(&block_hash) = storage.hashes.get(&number) + && let Some(block) = storage.blocks.get(&block_hash).cloned() + { + drop(storage); + all_logs.extend(self.mined_logs_for_block(filter.clone(), block, block_hash)); } }