From 00bebfd64d3b743bfc42c734390697111d305a8d Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Thu, 7 Sep 2023 14:21:00 +0200 Subject: [PATCH] perf: small access list perf (#4505) --- .../primitives/src/transaction/access_list.rs | 20 ++++++++++--------- .../revm/revm-inspectors/src/access_list.rs | 4 ++-- crates/rpc/rpc/src/eth/api/call.rs | 5 +++-- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/crates/primitives/src/transaction/access_list.rs b/crates/primitives/src/transaction/access_list.rs index a86b33b69e..11b119898a 100644 --- a/crates/primitives/src/transaction/access_list.rs +++ b/crates/primitives/src/transaction/access_list.rs @@ -48,15 +48,17 @@ pub struct AccessList( impl AccessList { /// Converts the list into a vec, expected by revm pub fn flattened(self) -> Vec<(Address, Vec)> { - self.0 - .into_iter() - .map(|item| { - ( - item.address, - item.storage_keys.into_iter().map(|slot| U256::from_be_bytes(slot.0)).collect(), - ) - }) - .collect() + self.flatten().collect() + } + + /// Returns an iterator over the list's addresses and storage keys. + pub fn flatten(self) -> impl Iterator)> { + self.0.into_iter().map(|item| { + ( + item.address, + item.storage_keys.into_iter().map(|slot| U256::from_be_bytes(slot.0)).collect(), + ) + }) } /// Calculates a heuristic for the in-memory size of the [AccessList]. diff --git a/crates/revm/revm-inspectors/src/access_list.rs b/crates/revm/revm-inspectors/src/access_list.rs index 41faf88a2b..bc9d641d71 100644 --- a/crates/revm/revm-inspectors/src/access_list.rs +++ b/crates/revm/revm-inspectors/src/access_list.rs @@ -31,8 +31,8 @@ impl AccessListInspector { excluded: [from, to].iter().chain(precompiles.iter()).copied().collect(), access_list: access_list .0 - .iter() - .map(|v| (v.address, v.storage_keys.iter().copied().collect())) + .into_iter() + .map(|v| (v.address, v.storage_keys.into_iter().collect())) .collect(), } } diff --git a/crates/rpc/rpc/src/eth/api/call.rs b/crates/rpc/rpc/src/eth/api/call.rs index 6bf638cf5a..6f27d1a3b3 100644 --- a/crates/rpc/rpc/src/eth/api/call.rs +++ b/crates/rpc/rpc/src/eth/api/call.rs @@ -340,7 +340,7 @@ where pub(crate) async fn create_access_list_at( &self, - request: CallRequest, + mut request: CallRequest, at: Option, ) -> EthResult { let block_id = at.unwrap_or(BlockId::Number(BlockNumberOrTag::Latest)); @@ -373,7 +373,8 @@ where get_contract_address(from, nonce).into() }; - let initial = request.access_list.clone().unwrap_or_default(); + // can consume the list since we're not using the request anymore + let initial = request.access_list.take().unwrap_or_default(); let precompiles = get_precompiles(&env.cfg.spec_id); let mut inspector = AccessListInspector::new(initial, from, to, precompiles);