From a2ce04c0cb8844c7b514db7bd2bd2cdda3d251a2 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Wed, 22 Jan 2025 00:25:44 +0100 Subject: [PATCH] feat: add transactions_iter helper --- crates/chain-state/src/in_memory.rs | 12 ++++-------- crates/evm/execution-types/src/chain.rs | 6 +++--- crates/primitives-traits/src/block/body.rs | 19 ++++++++++++------- crates/rpc/rpc-eth-types/src/gas_oracle.rs | 2 +- .../rpc-types-compat/src/engine/payload.rs | 2 +- .../provider/src/providers/consistent.rs | 2 +- .../src/providers/database/provider.rs | 2 +- 7 files changed, 23 insertions(+), 22 deletions(-) diff --git a/crates/chain-state/src/in_memory.rs b/crates/chain-state/src/in_memory.rs index 6358370e2b5d..38c74fb0860f 100644 --- a/crates/chain-state/src/in_memory.rs +++ b/crates/chain-state/src/in_memory.rs @@ -553,8 +553,7 @@ impl CanonicalInMemoryState { .block_ref() .recovered_block() .body() - .transactions() - .iter() + .transactions_iter() .find(|tx| tx.trie_hash() == hash) { return Some(tx.clone()) @@ -577,8 +576,7 @@ impl CanonicalInMemoryState { .block_ref() .recovered_block() .body() - .transactions() - .iter() + .transactions_iter() .enumerate() .find(|(_, tx)| tx.trie_hash() == tx_hash) { @@ -747,8 +745,7 @@ impl BlockState { .block_ref() .recovered_block() .body() - .transactions() - .iter() + .transactions_iter() .find(|tx| tx.trie_hash() == hash) .cloned() }) @@ -767,8 +764,7 @@ impl BlockState { .block_ref() .recovered_block() .body() - .transactions() - .iter() + .transactions_iter() .enumerate() .find(|(_, tx)| tx.trie_hash() == tx_hash) .map(|(index, tx)| { diff --git a/crates/evm/execution-types/src/chain.rs b/crates/evm/execution-types/src/chain.rs index 66d4338df9da..4ac820f1377a 100644 --- a/crates/evm/execution-types/src/chain.rs +++ b/crates/evm/execution-types/src/chain.rs @@ -248,7 +248,7 @@ impl Chain { self.blocks().iter().zip(self.execution_outcome.receipts().iter()) { let mut tx_receipts = Vec::with_capacity(receipts.len()); - for (tx, receipt) in block.body().transactions().iter().zip(receipts.iter()) { + for (tx, receipt) in block.body().transactions_iter().zip(receipts.iter()) { tx_receipts.push(( tx.trie_hash(), receipt.as_ref().expect("receipts have not been pruned").clone(), @@ -431,7 +431,7 @@ impl>> ChainBlocks<'_, /// Returns an iterator over all transactions in the chain. #[inline] pub fn transactions(&self) -> impl Iterator::Transaction> + '_ { - self.blocks.values().flat_map(|block| block.body().transactions().iter()) + self.blocks.values().flat_map(|block| block.body().transactions_iter()) } /// Returns an iterator over all transactions and their senders. @@ -457,7 +457,7 @@ impl>> ChainBlocks<'_, pub fn transaction_hashes(&self) -> impl Iterator + '_ { self.blocks .values() - .flat_map(|block| block.body().transactions().iter().map(|tx| tx.trie_hash())) + .flat_map(|block| block.body().transactions_iter().map(|tx| tx.trie_hash())) } } diff --git a/crates/primitives-traits/src/block/body.rs b/crates/primitives-traits/src/block/body.rs index 7120d95b3577..01dd5df50093 100644 --- a/crates/primitives-traits/src/block/body.rs +++ b/crates/primitives-traits/src/block/body.rs @@ -33,18 +33,23 @@ pub trait BlockBody: + MaybeSerde + 'static { - /// Ordered list of signed transactions as committed in block. + /// Ordered list of signed transactions as committed in the block. type Transaction: SignedTransaction; /// Ommer header type. type OmmerHeader: BlockHeader; - /// Returns reference to transactions in block. + /// Returns reference to transactions in the block. fn transactions(&self) -> &[Self::Transaction]; + /// Returns an iterator over the transactions in the block. + fn transactions_iter(&self) -> impl Iterator { + self.transactions().iter() + } + /// Returns an iterator over all transaction hashes in the block body. fn transaction_hashes_iter(&self) -> impl Iterator + '_ { - self.transactions().iter().map(|tx| tx.tx_hash()) + self.transactions_iter().map(|tx| tx.tx_hash()) } /// Returns the number of the transactions in the block. @@ -57,7 +62,7 @@ pub trait BlockBody: /// Returns `true` if the block body contains a transaction of the given type. fn contains_transaction_type(&self, tx_type: u8) -> bool { - self.transactions().iter().any(|tx| tx.is_type(tx_type)) + self.transactions_iter().any(|tx| tx.is_type(tx_type)) } /// Calculate the transaction root for the block body. @@ -89,12 +94,12 @@ pub trait BlockBody: /// Calculates the total blob gas used by _all_ EIP-4844 transactions in the block. fn blob_gas_used(&self) -> u64 { - self.transactions().iter().filter_map(|tx| tx.blob_gas_used()).sum() + self.transactions_iter().filter_map(|tx| tx.blob_gas_used()).sum() } /// Returns an iterator over all blob versioned hashes in the block body. fn blob_versioned_hashes_iter(&self) -> impl Iterator + '_ { - self.transactions().iter().filter_map(|tx| tx.blob_versioned_hashes()).flatten() + self.transactions_iter().filter_map(|tx| tx.blob_versioned_hashes()).flatten() } /// Returns an iterator over the encoded 2718 transactions. @@ -104,7 +109,7 @@ pub trait BlockBody: /// See also [`Encodable2718`]. #[doc(alias = "raw_transactions_iter")] fn encoded_2718_transactions_iter(&self) -> impl Iterator> + '_ { - self.transactions().iter().map(|tx| tx.encoded_2718()) + self.transactions_iter().map(|tx| tx.encoded_2718()) } /// Returns a vector of encoded 2718 transactions. diff --git a/crates/rpc/rpc-eth-types/src/gas_oracle.rs b/crates/rpc/rpc-eth-types/src/gas_oracle.rs index 34e430313cf3..c3a7d9bc903d 100644 --- a/crates/rpc/rpc-eth-types/src/gas_oracle.rs +++ b/crates/rpc/rpc-eth-types/src/gas_oracle.rs @@ -226,7 +226,7 @@ where let parent_hash = block.parent_hash(); // sort the functions by ascending effective tip first - let sorted_transactions = block.body().transactions().iter().sorted_by_cached_key(|tx| { + let sorted_transactions = block.body().transactions_iter().sorted_by_cached_key(|tx| { if let Some(base_fee) = base_fee_per_gas { (*tx).effective_tip_per_gas(base_fee) } else { diff --git a/crates/rpc/rpc-types-compat/src/engine/payload.rs b/crates/rpc/rpc-types-compat/src/engine/payload.rs index 0584c3087291..b0262dbd8dc9 100644 --- a/crates/rpc/rpc-types-compat/src/engine/payload.rs +++ b/crates/rpc/rpc-types-compat/src/engine/payload.rs @@ -108,7 +108,7 @@ pub fn convert_block_to_payload_field_v2( pub fn convert_to_payload_body_v1( value: impl reth_primitives_traits::Block, ) -> ExecutionPayloadBodyV1 { - let transactions = value.body().transactions().iter().map(|tx| tx.encoded_2718().into()); + let transactions = value.body().transactions_iter().map(|tx| tx.encoded_2718().into()); ExecutionPayloadBodyV1 { transactions: transactions.collect(), withdrawals: value.body().withdrawals().cloned().map(Withdrawals::into_inner), diff --git a/crates/storage/provider/src/providers/consistent.rs b/crates/storage/provider/src/providers/consistent.rs index 3082faf45b51..c2b273885b98 100644 --- a/crates/storage/provider/src/providers/consistent.rs +++ b/crates/storage/provider/src/providers/consistent.rs @@ -1065,7 +1065,7 @@ impl ReceiptProvider for ConsistentProvider { ); if let Some(tx_index) = - block.body().transactions().iter().position(|tx| tx.trie_hash() == hash) + block.body().transactions_iter().position(|tx| tx.trie_hash() == hash) { // safe to use tx_index for receipts due to 1:1 correspondence return Ok(receipts.get(tx_index).cloned()); diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 31105c33665b..dc8b468954e9 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -2836,7 +2836,7 @@ impl BlockWrite let tx_count = block.body().transaction_count() as u64; // Ensures we have all the senders for the block's transactions. - for (transaction, sender) in block.body().transactions().iter().zip(block.senders_iter()) { + for (transaction, sender) in block.body().transactions_iter().zip(block.senders_iter()) { let hash = transaction.tx_hash(); if self.prune_modes.sender_recovery.as_ref().is_none_or(|m| !m.is_full()) {