From dbd4f0c4fe3b20b0b4c18e37ac114af25682dd79 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 3 Jan 2025 16:10:32 +0100 Subject: [PATCH] chore: make block field private (#13628) --- bin/reth-bench/src/bench/new_payload_fcu.rs | 2 +- bin/reth-bench/src/bench/new_payload_only.rs | 2 +- book/sources/exex/tracking-state/src/bin/2.rs | 4 +- crates/blockchain-tree-api/src/error.rs | 2 +- crates/blockchain-tree/src/block_indices.rs | 16 +-- crates/blockchain-tree/src/blockchain_tree.rs | 8 +- crates/chain-state/src/in_memory.rs | 8 +- crates/chain-state/src/notifications.rs | 29 +++-- crates/chain-state/src/test_utils.rs | 12 +- crates/consensus/beacon/src/engine/mod.rs | 3 +- crates/consensus/common/src/validation.rs | 22 ++-- crates/e2e-test-utils/src/payload.rs | 2 +- crates/engine/util/src/reorg.rs | 2 +- crates/evm/execution-types/src/chain.rs | 4 +- crates/exex/exex/src/backfill/job.rs | 7 +- crates/net/downloaders/src/bodies/bodies.rs | 6 +- .../net/downloaders/src/bodies/test_utils.rs | 2 +- crates/net/downloaders/src/test_utils/mod.rs | 2 +- crates/net/p2p/src/bodies/response.rs | 2 +- crates/node/core/src/utils.rs | 2 +- crates/node/events/src/node.rs | 2 +- crates/optimism/consensus/src/lib.rs | 2 +- crates/optimism/node/src/txpool.rs | 2 +- crates/optimism/node/tests/it/priority.rs | 4 +- crates/optimism/rpc/src/eth/block.rs | 4 +- crates/optimism/rpc/src/eth/receipt.rs | 2 +- crates/payload/validator/src/lib.rs | 6 +- crates/primitives/src/alloy_compat.rs | 8 +- crates/primitives/src/block.rs | 12 +- crates/primitives/src/traits.rs | 4 +- crates/prune/prune/src/segments/mod.rs | 9 +- crates/prune/prune/src/segments/receipts.rs | 10 +- .../src/segments/static_file/transactions.rs | 6 +- .../src/segments/user/receipts_by_logs.rs | 10 +- .../src/segments/user/sender_recovery.rs | 10 +- .../src/segments/user/transaction_lookup.rs | 10 +- crates/rpc/rpc-engine-api/tests/it/payload.rs | 10 +- crates/rpc/rpc-eth-api/src/helpers/block.rs | 6 +- crates/rpc/rpc-eth-api/src/helpers/call.rs | 4 +- crates/rpc/rpc-eth-api/src/helpers/fee.rs | 2 +- crates/rpc/rpc-eth-api/src/helpers/trace.rs | 4 +- .../rpc-eth-api/src/helpers/transaction.rs | 2 +- crates/rpc/rpc-eth-types/src/cache/mod.rs | 4 +- crates/rpc/rpc-eth-types/src/fee_history.rs | 4 +- crates/rpc/rpc-eth-types/src/gas_oracle.rs | 2 +- crates/rpc/rpc-eth-types/src/logs_utils.rs | 2 +- .../rpc-types-compat/src/engine/payload.rs | 21 ++-- crates/rpc/rpc/src/debug.rs | 7 +- crates/rpc/rpc/src/eth/helpers/block.rs | 2 +- crates/rpc/rpc/src/trace.rs | 4 +- crates/stages/stages/benches/setup/mod.rs | 9 +- crates/stages/stages/src/stages/bodies.rs | 8 +- .../stages/src/stages/hashing_storage.rs | 4 +- crates/stages/stages/src/stages/merkle.rs | 7 +- crates/stages/stages/src/stages/mod.rs | 4 +- crates/stages/stages/src/stages/prune.rs | 2 +- .../stages/src/stages/sender_recovery.rs | 10 +- crates/stages/stages/src/stages/tx_lookup.rs | 8 +- .../stages/stages/src/test_utils/test_db.rs | 6 +- .../static-file/src/static_file_producer.rs | 2 +- .../src/providers/blockchain_provider.rs | 50 ++++----- .../provider/src/providers/consistent.rs | 30 ++--- .../provider/src/providers/database/mod.rs | 8 +- .../src/providers/database/provider.rs | 10 +- .../storage/provider/src/test_utils/blocks.rs | 106 ++++++++++-------- .../transaction-pool/src/blobstore/tracker.rs | 24 ++-- testing/testing-utils/src/generators.rs | 8 +- 67 files changed, 317 insertions(+), 291 deletions(-) diff --git a/bin/reth-bench/src/bench/new_payload_fcu.rs b/bin/reth-bench/src/bench/new_payload_fcu.rs index baa940437..e3d388b37 100644 --- a/bin/reth-bench/src/bench/new_payload_fcu.rs +++ b/bin/reth-bench/src/bench/new_payload_fcu.rs @@ -78,7 +78,7 @@ impl Command { let block_number = block.header.number; let versioned_hashes: Vec = - block.body.blob_versioned_hashes_iter().copied().collect(); + block.body().blob_versioned_hashes_iter().copied().collect(); let parent_beacon_block_root = block.parent_beacon_block_root; let payload = block_to_payload(block).0; diff --git a/bin/reth-bench/src/bench/new_payload_only.rs b/bin/reth-bench/src/bench/new_payload_only.rs index 020164109..4485e3fa7 100644 --- a/bin/reth-bench/src/bench/new_payload_only.rs +++ b/bin/reth-bench/src/bench/new_payload_only.rs @@ -62,7 +62,7 @@ impl Command { let gas_used = block.gas_used; let versioned_hashes: Vec = - block.body.blob_versioned_hashes_iter().copied().collect(); + block.body().blob_versioned_hashes_iter().copied().collect(); let parent_beacon_block_root = block.parent_beacon_block_root; let payload = block_to_payload(block).0; diff --git a/book/sources/exex/tracking-state/src/bin/2.rs b/book/sources/exex/tracking-state/src/bin/2.rs index 7e9aadf8a..44b023967 100644 --- a/book/sources/exex/tracking-state/src/bin/2.rs +++ b/book/sources/exex/tracking-state/src/bin/2.rs @@ -36,7 +36,7 @@ impl>> Fut while let Some(notification) = ready!(this.ctx.notifications.try_next().poll_unpin(cx))? { if let Some(reverted_chain) = notification.reverted_chain() { this.transactions = this.transactions.saturating_sub( - reverted_chain.blocks_iter().map(|b| b.body.transactions.len() as u64).sum(), + reverted_chain.blocks_iter().map(|b| b.body().transactions.len() as u64).sum(), ); } @@ -45,7 +45,7 @@ impl>> Fut this.transactions += committed_chain .blocks_iter() - .map(|b| b.body.transactions.len() as u64) + .map(|b| b.body().transactions.len() as u64) .sum::(); this.ctx diff --git a/crates/blockchain-tree-api/src/error.rs b/crates/blockchain-tree-api/src/error.rs index 6f379280f..898b92dbd 100644 --- a/crates/blockchain-tree-api/src/error.rs +++ b/crates/blockchain-tree-api/src/error.rs @@ -206,7 +206,7 @@ impl std::fmt::Debug for InsertBlockErrorDataTwo { .field("hash", &self.block.hash()) .field("number", &self.block.number()) .field("parent_hash", &self.block.parent_hash()) - .field("num_txs", &self.block.body.transactions().len()) + .field("num_txs", &self.block.body().transactions().len()) .finish_non_exhaustive() } } diff --git a/crates/blockchain-tree/src/block_indices.rs b/crates/blockchain-tree/src/block_indices.rs index 7778fb926..26a676f4d 100644 --- a/crates/blockchain-tree/src/block_indices.rs +++ b/crates/blockchain-tree/src/block_indices.rs @@ -572,23 +572,23 @@ mod tests { // Define blocks with their numbers and parent hashes. let block_1 = SealedBlockWithSenders { - block: SealedBlock { - header: SealedHeader::new( + block: SealedBlock::new( + SealedHeader::new( Header { parent_hash, number: 1, ..Default::default() }, block_hash_1, ), - ..Default::default() - }, + Default::default(), + ), ..Default::default() }; let block_2 = SealedBlockWithSenders { - block: SealedBlock { - header: SealedHeader::new( + block: SealedBlock::new( + SealedHeader::new( Header { parent_hash: block_hash_1, number: 2, ..Default::default() }, block_hash_2, ), - ..Default::default() - }, + Default::default(), + ), ..Default::default() }; diff --git a/crates/blockchain-tree/src/blockchain_tree.rs b/crates/blockchain-tree/src/blockchain_tree.rs index e2d96c289..b436c0dee 100644 --- a/crates/blockchain-tree/src/blockchain_tree.rs +++ b/crates/blockchain-tree/src/blockchain_tree.rs @@ -1635,14 +1635,14 @@ mod tests { }; SealedBlockWithSenders::new( - SealedBlock { - header: SealedHeader::seal(header), - body: BlockBody { + SealedBlock::new( + SealedHeader::seal(header), + BlockBody { transactions: signed_body, ommers: Vec::new(), withdrawals: Some(Withdrawals::default()), }, - }, + ), body.iter().map(|tx| tx.signer()).collect(), ) .unwrap() diff --git a/crates/chain-state/src/in_memory.rs b/crates/chain-state/src/in_memory.rs index 41d653ba0..23b7a43a8 100644 --- a/crates/chain-state/src/in_memory.rs +++ b/crates/chain-state/src/in_memory.rs @@ -549,7 +549,7 @@ impl CanonicalInMemoryState { if let Some(tx) = block_state .block_ref() .block() - .body + .body() .transactions() .iter() .find(|tx| tx.trie_hash() == hash) @@ -573,7 +573,7 @@ impl CanonicalInMemoryState { if let Some((index, tx)) = block_state .block_ref() .block() - .body + .body() .transactions() .iter() .enumerate() @@ -758,7 +758,7 @@ impl BlockState { block_state .block_ref() .block() - .body + .body() .transactions() .iter() .find(|tx| tx.trie_hash() == hash) @@ -778,7 +778,7 @@ impl BlockState { block_state .block_ref() .block() - .body + .body() .transactions() .iter() .enumerate() diff --git a/crates/chain-state/src/notifications.rs b/crates/chain-state/src/notifications.rs index 498528813..ab2b88cba 100644 --- a/crates/chain-state/src/notifications.rs +++ b/crates/chain-state/src/notifications.rs @@ -214,9 +214,10 @@ impl Stream for ForkChoiceStream { #[cfg(test)] mod tests { use super::*; + use alloy_consensus::BlockBody; use alloy_primitives::{b256, B256}; use reth_execution_types::ExecutionOutcome; - use reth_primitives::{Receipt, Receipts, TransactionSigned, TxType}; + use reth_primitives::{Receipt, Receipts, SealedBlock, TransactionSigned, TxType}; #[test] fn test_commit_notification() { @@ -295,7 +296,7 @@ mod tests { #[test] fn test_block_receipts_commit() { // Create a default block instance for use in block definitions. - let block: SealedBlockWithSenders = Default::default(); + let mut body = BlockBody::::default(); // Define unique hashes for two blocks to differentiate them in the chain. let block1_hash = B256::new([0x01; 32]); @@ -303,13 +304,17 @@ mod tests { // Create a default transaction to include in block1's transactions. let tx = TransactionSigned::default(); + body.transactions.push(tx); + + let block: SealedBlockWithSenders = + SealedBlock::new(SealedHeader::seal(alloy_consensus::Header::default()), body) + .seal_with_senders() + .unwrap(); // Create a clone of the default block and customize it to act as block1. let mut block1 = block.clone(); block1.set_block_number(1); block1.set_hash(block1_hash); - // Add the transaction to block1's transactions. - block1.block.body.transactions.push(tx); // Clone the default block and customize it to act as block2. let mut block2 = block; @@ -365,10 +370,14 @@ mod tests { #[test] fn test_block_receipts_reorg() { // Define block1 for the old chain segment, which will be reverted. - let mut old_block1: SealedBlockWithSenders = Default::default(); + let mut body = BlockBody::::default(); + body.transactions.push(TransactionSigned::default()); + let mut old_block1: SealedBlockWithSenders = + SealedBlock::new(SealedHeader::seal(alloy_consensus::Header::default()), body) + .seal_with_senders() + .unwrap(); old_block1.set_block_number(1); old_block1.set_hash(B256::new([0x01; 32])); - old_block1.block.body.transactions.push(TransactionSigned::default()); // Create a receipt for a transaction in the reverted block. #[allow(clippy::needless_update)] @@ -389,10 +398,14 @@ mod tests { Arc::new(Chain::new(vec![old_block1.clone()], old_execution_outcome, None)); // Define block2 for the new chain segment, which will be committed. - let mut new_block1: SealedBlockWithSenders = Default::default(); + let mut body = BlockBody::::default(); + body.transactions.push(TransactionSigned::default()); + let mut new_block1: SealedBlockWithSenders = + SealedBlock::new(SealedHeader::seal(alloy_consensus::Header::default()), body) + .seal_with_senders() + .unwrap(); new_block1.set_block_number(2); new_block1.set_hash(B256::new([0x02; 32])); - new_block1.block.body.transactions.push(TransactionSigned::default()); // Create a receipt for a transaction in the new committed block. #[allow(clippy::needless_update)] diff --git a/crates/chain-state/src/test_utils.rs b/crates/chain-state/src/test_utils.rs index 977b92bf0..292c21e54 100644 --- a/crates/chain-state/src/test_utils.rs +++ b/crates/chain-state/src/test_utils.rs @@ -168,14 +168,14 @@ impl TestBlockBuilder { ..Default::default() }; - let block = SealedBlock { - header: SealedHeader::seal(header), - body: BlockBody { + let block = SealedBlock::new( + SealedHeader::seal(header), + BlockBody { transactions: transactions.into_iter().map(|tx| tx.into_signed()).collect(), ommers: Vec::new(), withdrawals: Some(vec![].into()), }, - }; + ); SealedBlockWithSenders::new(block, vec![self.signer; num_txs as usize]).unwrap() } @@ -259,7 +259,7 @@ impl TestBlockBuilder { /// updated. pub fn get_execution_outcome(&mut self, block: SealedBlockWithSenders) -> ExecutionOutcome { let receipts = block - .body + .body() .transactions .iter() .enumerate() @@ -273,7 +273,7 @@ impl TestBlockBuilder { let mut bundle_state_builder = BundleState::builder(block.number..=block.number); - for tx in &block.body.transactions { + for tx in &block.body().transactions { self.signer_execute_account_info.balance -= Self::single_tx_cost(); bundle_state_builder = bundle_state_builder.state_present_account_info( self.signer, diff --git a/crates/consensus/beacon/src/engine/mod.rs b/crates/consensus/beacon/src/engine/mod.rs index 9ff0b9cd8..2dc139ace 100644 --- a/crates/consensus/beacon/src/engine/mod.rs +++ b/crates/consensus/beacon/src/engine/mod.rs @@ -2774,8 +2774,7 @@ mod tests { .with_real_consensus() .build(); - let genesis = - SealedBlock { header: chain_spec.sealed_genesis_header(), ..Default::default() }; + let genesis = SealedBlock::new(chain_spec.sealed_genesis_header(), Default::default()); let block1 = random_block( &mut rng, 1, diff --git a/crates/consensus/common/src/validation.rs b/crates/consensus/common/src/validation.rs index a53500412..d1131baee 100644 --- a/crates/consensus/common/src/validation.rs +++ b/crates/consensus/common/src/validation.rs @@ -42,7 +42,7 @@ pub fn validate_header_base_fee( pub fn validate_shanghai_withdrawals( block: &SealedBlock, ) -> Result<(), ConsensusError> { - let withdrawals = block.body.withdrawals().ok_or(ConsensusError::BodyWithdrawalsMissing)?; + let withdrawals = block.body().withdrawals().ok_or(ConsensusError::BodyWithdrawalsMissing)?; let withdrawals_root = alloy_consensus::proofs::calculate_withdrawals_root(withdrawals); let header_withdrawals_root = block.withdrawals_root().ok_or(ConsensusError::WithdrawalsRootMissing)?; @@ -67,7 +67,7 @@ pub fn validate_cancun_gas( // blob tx let header_blob_gas_used = block.header().blob_gas_used().ok_or(ConsensusError::BlobGasUsedMissing)?; - let total_blob_gas = block.body.blob_gas_used(); + let total_blob_gas = block.body().blob_gas_used(); if total_blob_gas != header_blob_gas_used { return Err(ConsensusError::BlobGasUsedDiff(GotExpected { got: header_blob_gas_used, @@ -139,7 +139,7 @@ where ChainSpec: EthereumHardforks, { // Check ommers hash - let ommers_hash = block.body.calculate_ommers_root(); + let ommers_hash = block.body().calculate_ommers_root(); if Some(block.header.ommers_hash()) != ommers_hash { return Err(ConsensusError::BodyOmmersHashDiff( GotExpected { @@ -514,10 +514,10 @@ mod tests { let transactions = Vec::new(); ( - SealedBlock { - header: SealedHeader::seal(header), - body: BlockBody { transactions, ommers, withdrawals: None }, - }, + SealedBlock::new( + SealedHeader::seal(header), + BlockBody { transactions, ommers, withdrawals: None }, + ), parent, ) } @@ -539,10 +539,10 @@ mod tests { ..Default::default() }; - SealedBlock { - header: SealedHeader::seal(header), - body: BlockBody { withdrawals: Some(withdrawals), ..Default::default() }, - } + SealedBlock::new( + SealedHeader::seal(header), + BlockBody { withdrawals: Some(withdrawals), ..Default::default() }, + ) }; // Single withdrawal diff --git a/crates/e2e-test-utils/src/payload.rs b/crates/e2e-test-utils/src/payload.rs index 1f2df9e07..858e311ca 100644 --- a/crates/e2e-test-utils/src/payload.rs +++ b/crates/e2e-test-utils/src/payload.rs @@ -58,7 +58,7 @@ impl PayloadTestContext { pub async fn wait_for_built_payload(&self, payload_id: PayloadId) { loop { let payload = self.payload_builder.best_payload(payload_id).await.unwrap().unwrap(); - if payload.block().body.transactions().is_empty() { + if payload.block().body().transactions().is_empty() { tokio::time::sleep(std::time::Duration::from_millis(20)).await; continue } diff --git a/crates/engine/util/src/reorg.rs b/crates/engine/util/src/reorg.rs index 38683e206..073f83545 100644 --- a/crates/engine/util/src/reorg.rs +++ b/crates/engine/util/src/reorg.rs @@ -269,7 +269,7 @@ where // Fetch reorg target block depending on its depth and its parent. let mut previous_hash = next_block.parent_hash; - let mut candidate_transactions = next_block.body.transactions; + let mut candidate_transactions = next_block.into_body().transactions; let reorg_target = 'target: { loop { let reorg_target = provider diff --git a/crates/evm/execution-types/src/chain.rs b/crates/evm/execution-types/src/chain.rs index 929ac1c5c..aef0ced68 100644 --- a/crates/evm/execution-types/src/chain.rs +++ b/crates/evm/execution-types/src/chain.rs @@ -254,7 +254,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(), @@ -437,7 +437,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. diff --git a/crates/exex/exex/src/backfill/job.rs b/crates/exex/exex/src/backfill/job.rs index 0bd4ce5f2..cb5f01d06 100644 --- a/crates/exex/exex/src/backfill/job.rs +++ b/crates/exex/exex/src/backfill/job.rs @@ -101,15 +101,16 @@ where cumulative_gas += block.gas_used(); // Configure the executor to use the current state. - trace!(target: "exex::backfill", number = block_number, txs = block.body.transactions().len(), "Executing block"); + trace!(target: "exex::backfill", number = block_number, txs = block.body().transactions().len(), "Executing block"); // Execute the block let execute_start = Instant::now(); // Unseal the block for execution let (block, senders) = block.into_components(); - let (unsealed_header, hash) = block.header.split(); - let block = P::Block::new(unsealed_header, block.body).with_senders_unchecked(senders); + let (header, body) = block.split_header_body(); + let (unsealed_header, hash) = header.split(); + let block = P::Block::new(unsealed_header, body).with_senders_unchecked(senders); executor.execute_and_verify_one(&block)?; execution_duration += execute_start.elapsed(); diff --git a/crates/net/downloaders/src/bodies/bodies.rs b/crates/net/downloaders/src/bodies/bodies.rs index 2f6015a09..47a816f4c 100644 --- a/crates/net/downloaders/src/bodies/bodies.rs +++ b/crates/net/downloaders/src/bodies/bodies.rs @@ -678,8 +678,10 @@ mod tests { ); let headers = blocks.iter().map(|block| block.header.clone()).collect::>(); - let bodies = - blocks.into_iter().map(|block| (block.hash(), block.body)).collect::>(); + let bodies = blocks + .into_iter() + .map(|block| (block.hash(), block.into_body())) + .collect::>(); insert_headers(db.db(), &headers); diff --git a/crates/net/downloaders/src/bodies/test_utils.rs b/crates/net/downloaders/src/bodies/test_utils.rs index ca35c7449..6ca012f9c 100644 --- a/crates/net/downloaders/src/bodies/test_utils.rs +++ b/crates/net/downloaders/src/bodies/test_utils.rs @@ -21,7 +21,7 @@ pub(crate) fn zip_blocks<'a, H: Clone + BlockHeader + 'a, B>( if header.is_empty() { BlockResponse::Empty(header.clone()) } else { - BlockResponse::Full(SealedBlock { header: header.clone(), body }) + BlockResponse::Full(SealedBlock::new(header.clone(), body)) } }) .collect() diff --git a/crates/net/downloaders/src/test_utils/mod.rs b/crates/net/downloaders/src/test_utils/mod.rs index 635383ce3..0529b78a2 100644 --- a/crates/net/downloaders/src/test_utils/mod.rs +++ b/crates/net/downloaders/src/test_utils/mod.rs @@ -29,7 +29,7 @@ pub(crate) fn generate_bodies( ); let headers = blocks.iter().map(|block| block.header.clone()).collect(); - let bodies = blocks.into_iter().map(|block| (block.hash(), block.body)).collect(); + let bodies = blocks.into_iter().map(|block| (block.hash(), block.into_body())).collect(); (headers, bodies) } diff --git a/crates/net/p2p/src/bodies/response.rs b/crates/net/p2p/src/bodies/response.rs index 1b415246f..956057d98 100644 --- a/crates/net/p2p/src/bodies/response.rs +++ b/crates/net/p2p/src/bodies/response.rs @@ -40,7 +40,7 @@ where /// Return the reference to the response body pub fn into_body(self) -> Option { match self { - Self::Full(block) => Some(block.body), + Self::Full(block) => Some(block.into_body()), Self::Empty(_) => None, } } diff --git a/crates/node/core/src/utils.rs b/crates/node/core/src/utils.rs index 65f90f27e..1db9c1f6b 100644 --- a/crates/node/core/src/utils.rs +++ b/crates/node/core/src/utils.rs @@ -84,7 +84,7 @@ where eyre::bail!("Invalid number of bodies received. Expected: 1. Received: 0") }; - let block = SealedBlock { header, body }; + let block = SealedBlock::new(header, body); consensus.validate_block_pre_execution(&block)?; Ok(block) diff --git a/crates/node/events/src/node.rs b/crates/node/events/src/node.rs index 07aa0bb0d..129fe20ea 100644 --- a/crates/node/events/src/node.rs +++ b/crates/node/events/src/node.rs @@ -254,7 +254,7 @@ impl NodeState { number=block.number(), hash=?block.hash(), peers=self.num_connected_peers(), - txs=block.body.transactions().len(), + txs=block.body().transactions().len(), gas=%format_gas(block.header.gas_used()), gas_throughput=%format_gas_throughput(block.header.gas_used(), elapsed), full=%format!("{:.1}%", block.header.gas_used() as f64 * 100.0 / block.header.gas_limit() as f64), diff --git a/crates/optimism/consensus/src/lib.rs b/crates/optimism/consensus/src/lib.rs index 6d587f757..4d2536667 100644 --- a/crates/optimism/consensus/src/lib.rs +++ b/crates/optimism/consensus/src/lib.rs @@ -74,7 +74,7 @@ impl Consensus for OpBeaconConsensus { block: &SealedBlockFor, ) -> Result<(), ConsensusError> { // Check ommers hash - let ommers_hash = reth_primitives::proofs::calculate_ommers_root(&block.body.ommers); + let ommers_hash = block.body().calculate_ommers_root(); if block.header.ommers_hash != ommers_hash { return Err(ConsensusError::BodyOmmersHashDiff( GotExpected { got: ommers_hash, expected: block.header.ommers_hash }.into(), diff --git a/crates/optimism/node/src/txpool.rs b/crates/optimism/node/src/txpool.rs index b598fc3a7..9692e8cdb 100644 --- a/crates/optimism/node/src/txpool.rs +++ b/crates/optimism/node/src/txpool.rs @@ -408,7 +408,7 @@ where self.inner.on_new_head_block(new_tip_block); self.update_l1_block_info( new_tip_block.header(), - new_tip_block.body.transactions().first(), + new_tip_block.body().transactions().first(), ); } } diff --git a/crates/optimism/node/tests/it/priority.rs b/crates/optimism/node/tests/it/priority.rs index 031300aba..510cd5cdb 100644 --- a/crates/optimism/node/tests/it/priority.rs +++ b/crates/optimism/node/tests/it/priority.rs @@ -187,10 +187,10 @@ async fn test_custom_block_priority_config() { assert_eq!(block_payloads.len(), 1); let (block_payload, _) = block_payloads.first().unwrap(); let block_payload = block_payload.block().clone(); - assert_eq!(block_payload.body.transactions.len(), 2); // L1 block info tx + end-of-block custom tx + assert_eq!(block_payload.body().transactions.len(), 2); // L1 block info tx + end-of-block custom tx // Check that last transaction in the block looks like a transfer to a random address. - let end_of_block_tx = block_payload.body.transactions.last().unwrap(); + let end_of_block_tx = block_payload.body().transactions.last().unwrap(); let OpTypedTransaction::Eip1559(end_of_block_tx) = &end_of_block_tx.transaction else { panic!("expected EIP-1559 transaction"); }; diff --git a/crates/optimism/rpc/src/eth/block.rs b/crates/optimism/rpc/src/eth/block.rs index a4806f096..30d7b1c59 100644 --- a/crates/optimism/rpc/src/eth/block.rs +++ b/crates/optimism/rpc/src/eth/block.rs @@ -42,10 +42,10 @@ where let timestamp = block.timestamp(); let l1_block_info = - reth_optimism_evm::extract_l1_info(&block.body).map_err(OpEthApiError::from)?; + reth_optimism_evm::extract_l1_info(block.body()).map_err(OpEthApiError::from)?; return block - .body + .body() .transactions() .iter() .zip(receipts.iter()) diff --git a/crates/optimism/rpc/src/eth/receipt.rs b/crates/optimism/rpc/src/eth/receipt.rs index 5cf389baf..e77325c64 100644 --- a/crates/optimism/rpc/src/eth/receipt.rs +++ b/crates/optimism/rpc/src/eth/receipt.rs @@ -41,7 +41,7 @@ where )))?; let l1_block_info = - reth_optimism_evm::extract_l1_info(&block.body).map_err(OpEthApiError::from)?; + reth_optimism_evm::extract_l1_info(block.body()).map_err(OpEthApiError::from)?; Ok(OpReceiptBuilder::new( &self.inner.eth_api.provider().chain_spec(), diff --git a/crates/payload/validator/src/lib.rs b/crates/payload/validator/src/lib.rs index c1b231a77..6a75463c6 100644 --- a/crates/payload/validator/src/lib.rs +++ b/crates/payload/validator/src/lib.rs @@ -144,7 +144,7 @@ impl ExecutionPayloadValidator { return Err(PayloadError::PostCancunWithoutCancunFields) } } else { - if sealed_block.body.has_eip4844_transactions() { + if sealed_block.body().has_eip4844_transactions() { // cancun not active but blob transactions present return Err(PayloadError::PreCancunBlockWithBlobTransactions) } @@ -163,13 +163,13 @@ impl ExecutionPayloadValidator { } let shanghai_active = self.is_shanghai_active_at_timestamp(sealed_block.timestamp); - if !shanghai_active && sealed_block.body.withdrawals.is_some() { + if !shanghai_active && sealed_block.body().withdrawals.is_some() { // shanghai not active but withdrawals present return Err(PayloadError::PreShanghaiBlockWithWithdrawals) } if !self.is_prague_active_at_timestamp(sealed_block.timestamp) && - sealed_block.body.has_eip7702_transactions() + sealed_block.body().has_eip7702_transactions() { return Err(PayloadError::PrePragueBlockWithEip7702Transactions) } diff --git a/crates/primitives/src/alloy_compat.rs b/crates/primitives/src/alloy_compat.rs index 2409c535c..fc83e6622 100644 --- a/crates/primitives/src/alloy_compat.rs +++ b/crates/primitives/src/alloy_compat.rs @@ -16,14 +16,14 @@ impl TryFrom for SealedBlock { let block_hash = block.header.hash; let block = block.try_map_transactions(|tx| tx.try_into())?; - Ok(Self { - header: SealedHeader::new(block.header.inner.into_header_with_defaults(), block_hash), - body: BlockBody { + Ok(Self::new( + SealedHeader::new(block.header.inner.into_header_with_defaults(), block_hash), + BlockBody { transactions: block.transactions.into_transactions().collect(), ommers: Default::default(), withdrawals: block.withdrawals.map(|w| w.into_inner().into()), }, - }) + )) } } diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index 399ebaa24..ff3d5ed70 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -169,7 +169,7 @@ pub struct SealedBlock { #[deref_mut] pub header: SealedHeader, /// Block body. - pub body: B, + body: B, } impl SealedBlock { @@ -190,6 +190,16 @@ impl SealedBlock { &self.body } + /// Consumes the block and returns the header. + pub fn into_header(self) -> H { + self.header.unseal() + } + + /// Consumes the block and returns the body. + pub fn into_body(self) -> B { + self.body + } + /// Splits the [`BlockBody`] and [`SealedHeader`] into separate components #[inline] pub fn split_header_body(self) -> (SealedHeader, B) { diff --git a/crates/primitives/src/traits.rs b/crates/primitives/src/traits.rs index 3f009bba8..d0d9c211b 100644 --- a/crates/primitives/src/traits.rs +++ b/crates/primitives/src/traits.rs @@ -13,7 +13,7 @@ pub trait BlockExt: Block { /// Calculate the header hash and seal the block so that it can't be changed. fn seal_slow(self) -> SealedBlock { let (header, body) = self.split(); - SealedBlock { header: SealedHeader::seal(header), body } + SealedBlock::new(SealedHeader::seal(header), body) } /// Seal the block with a known hash. @@ -21,7 +21,7 @@ pub trait BlockExt: Block { /// WARNING: This method does not perform validation whether the hash is correct. fn seal(self, hash: B256) -> SealedBlock { let (header, body) = self.split(); - SealedBlock { header: SealedHeader::new(header, hash), body } + SealedBlock::new(SealedHeader::new(header, hash), body) } /// Expensive operation that recovers transaction signer. diff --git a/crates/prune/prune/src/segments/mod.rs b/crates/prune/prune/src/segments/mod.rs index 1dc907732..25f4b39cb 100644 --- a/crates/prune/prune/src/segments/mod.rs +++ b/crates/prune/prune/src/segments/mod.rs @@ -242,7 +242,8 @@ mod tests { let range = input.get_next_tx_num_range(&provider).expect("Expected range").unwrap(); // Calculate the total number of transactions - let num_txs = blocks.iter().map(|block| block.body.transactions.len() as u64).sum::(); + let num_txs = + blocks.iter().map(|block| block.body().transactions.len() as u64).sum::(); assert_eq!(range, 0..=num_txs - 1); } @@ -288,7 +289,8 @@ mod tests { let range = input.get_next_tx_num_range(&provider).expect("Expected range").unwrap(); // Calculate the total number of transactions - let num_txs = blocks.iter().map(|block| block.body.transactions.len() as u64).sum::(); + let num_txs = + blocks.iter().map(|block| block.body().transactions.len() as u64).sum::(); assert_eq!(range, 0..=num_txs - 1,); } @@ -322,7 +324,8 @@ mod tests { // Get the last tx number // Calculate the total number of transactions - let num_txs = blocks.iter().map(|block| block.body.transactions.len() as u64).sum::(); + let num_txs = + blocks.iter().map(|block| block.body().transactions.len() as u64).sum::(); let max_range = num_txs - 1; // Create a prune input with a previous checkpoint that is the last tx number diff --git a/crates/prune/prune/src/segments/receipts.rs b/crates/prune/prune/src/segments/receipts.rs index dbea32c47..922d11e83 100644 --- a/crates/prune/prune/src/segments/receipts.rs +++ b/crates/prune/prune/src/segments/receipts.rs @@ -113,8 +113,8 @@ mod tests { let mut receipts = Vec::new(); for block in &blocks { - receipts.reserve_exact(block.body.transactions.len()); - for transaction in &block.body.transactions { + receipts.reserve_exact(block.body().transactions.len()); + for transaction in &block.body().transactions { receipts .push((receipts.len() as u64, random_receipt(&mut rng, transaction, Some(0)))); } @@ -124,7 +124,7 @@ mod tests { assert_eq!( db.table::().unwrap().len(), - blocks.iter().map(|block| block.body.transactions.len()).sum::() + blocks.iter().map(|block| block.body().transactions.len()).sum::() ); assert_eq!( db.table::().unwrap().len(), @@ -158,7 +158,7 @@ mod tests { let last_pruned_tx_number = blocks .iter() .take(to_block as usize) - .map(|block| block.body.transactions.len()) + .map(|block| block.body().transactions.len()) .sum::() .min( next_tx_number_to_prune as usize + @@ -186,7 +186,7 @@ mod tests { let last_pruned_block_number = blocks .iter() .fold_while((0, 0), |(_, mut tx_count), block| { - tx_count += block.body.transactions.len(); + tx_count += block.body().transactions.len(); if tx_count > last_pruned_tx_number { Done((block.number, tx_count)) diff --git a/crates/prune/prune/src/segments/static_file/transactions.rs b/crates/prune/prune/src/segments/static_file/transactions.rs index 12ffbf727..19a6fd06d 100644 --- a/crates/prune/prune/src/segments/static_file/transactions.rs +++ b/crates/prune/prune/src/segments/static_file/transactions.rs @@ -124,7 +124,7 @@ mod tests { db.insert_blocks(blocks.iter(), StorageKind::Database(None)).expect("insert blocks"); let transactions = - blocks.iter().flat_map(|block| &block.body.transactions).collect::>(); + blocks.iter().flat_map(|block| &block.body().transactions).collect::>(); assert_eq!(db.table::().unwrap().len(), transactions.len()); @@ -174,7 +174,7 @@ mod tests { let last_pruned_tx_number = blocks .iter() .take(to_block as usize) - .map(|block| block.body.transactions.len()) + .map(|block| block.body().transactions.len()) .sum::() .min( next_tx_number_to_prune as usize + @@ -185,7 +185,7 @@ mod tests { let last_pruned_block_number = blocks .iter() .fold_while((0, 0), |(_, mut tx_count), block| { - tx_count += block.body.transactions.len(); + tx_count += block.body().transactions.len(); if tx_count > last_pruned_tx_number { Done((block.number, tx_count)) diff --git a/crates/prune/prune/src/segments/user/receipts_by_logs.rs b/crates/prune/prune/src/segments/user/receipts_by_logs.rs index 91bad6f67..b82f38e5f 100644 --- a/crates/prune/prune/src/segments/user/receipts_by_logs.rs +++ b/crates/prune/prune/src/segments/user/receipts_by_logs.rs @@ -273,12 +273,12 @@ mod tests { let (deposit_contract_addr, _) = random_eoa_account(&mut rng); for block in &blocks { - receipts.reserve_exact(block.body.size()); - for (txi, transaction) in block.body.transactions.iter().enumerate() { + receipts.reserve_exact(block.body().size()); + for (txi, transaction) in block.body().transactions.iter().enumerate() { let mut receipt = random_receipt(&mut rng, transaction, Some(1)); receipt.logs.push(random_log( &mut rng, - (txi == (block.body.transactions.len() - 1)).then_some(deposit_contract_addr), + (txi == (block.body().transactions.len() - 1)).then_some(deposit_contract_addr), Some(1), )); receipts.push((receipts.len() as u64, receipt)); @@ -288,7 +288,7 @@ mod tests { assert_eq!( db.table::().unwrap().len(), - blocks.iter().map(|block| block.body.transactions.len()).sum::() + blocks.iter().map(|block| block.body().transactions.len()).sum::() ); assert_eq!( db.table::().unwrap().len(), @@ -337,7 +337,7 @@ mod tests { assert_eq!( db.table::().unwrap().len(), - blocks.iter().map(|block| block.body.transactions.len()).sum::() - + blocks.iter().map(|block| block.body().transactions.len()).sum::() - ((pruned_tx + 1) - unprunable) as usize ); diff --git a/crates/prune/prune/src/segments/user/sender_recovery.rs b/crates/prune/prune/src/segments/user/sender_recovery.rs index bc4ba5ab0..a119b8ca8 100644 --- a/crates/prune/prune/src/segments/user/sender_recovery.rs +++ b/crates/prune/prune/src/segments/user/sender_recovery.rs @@ -111,8 +111,8 @@ mod tests { let mut transaction_senders = Vec::new(); for block in &blocks { - transaction_senders.reserve_exact(block.body.transactions.len()); - for transaction in &block.body.transactions { + transaction_senders.reserve_exact(block.body().transactions.len()); + for transaction in &block.body().transactions { transaction_senders.push(( transaction_senders.len() as u64, transaction.recover_signer().expect("recover signer"), @@ -124,7 +124,7 @@ mod tests { assert_eq!( db.table::().unwrap().len(), - blocks.iter().map(|block| block.body.transactions.len()).sum::() + blocks.iter().map(|block| block.body().transactions.len()).sum::() ); assert_eq!( db.table::().unwrap().len(), @@ -159,7 +159,7 @@ mod tests { let last_pruned_tx_number = blocks .iter() .take(to_block as usize) - .map(|block| block.body.transactions.len()) + .map(|block| block.body().transactions.len()) .sum::() .min( next_tx_number_to_prune as usize + @@ -170,7 +170,7 @@ mod tests { let last_pruned_block_number = blocks .iter() .fold_while((0, 0), |(_, mut tx_count), block| { - tx_count += block.body.transactions.len(); + tx_count += block.body().transactions.len(); if tx_count > last_pruned_tx_number { Done((block.number, tx_count)) diff --git a/crates/prune/prune/src/segments/user/transaction_lookup.rs b/crates/prune/prune/src/segments/user/transaction_lookup.rs index f2331fee1..f1637123a 100644 --- a/crates/prune/prune/src/segments/user/transaction_lookup.rs +++ b/crates/prune/prune/src/segments/user/transaction_lookup.rs @@ -139,8 +139,8 @@ mod tests { let mut tx_hash_numbers = Vec::new(); for block in &blocks { - tx_hash_numbers.reserve_exact(block.body.transactions.len()); - for transaction in &block.body.transactions { + tx_hash_numbers.reserve_exact(block.body().transactions.len()); + for transaction in &block.body().transactions { tx_hash_numbers.push((transaction.hash(), tx_hash_numbers.len() as u64)); } } @@ -149,7 +149,7 @@ mod tests { assert_eq!( db.table::().unwrap().len(), - blocks.iter().map(|block| block.body.transactions.len()).sum::() + blocks.iter().map(|block| block.body().transactions.len()).sum::() ); assert_eq!( db.table::().unwrap().len(), @@ -184,7 +184,7 @@ mod tests { let last_pruned_tx_number = blocks .iter() .take(to_block as usize) - .map(|block| block.body.transactions.len()) + .map(|block| block.body().transactions.len()) .sum::() .min( next_tx_number_to_prune as usize + @@ -195,7 +195,7 @@ mod tests { let last_pruned_block_number = blocks .iter() .fold_while((0, 0), |(_, mut tx_count), block| { - tx_count += block.body.transactions.len(); + tx_count += block.body().transactions.len(); if tx_count > last_pruned_tx_number { Done((block.number, tx_count)) diff --git a/crates/rpc/rpc-engine-api/tests/it/payload.rs b/crates/rpc/rpc-engine-api/tests/it/payload.rs index 0314365d4..385607e47 100644 --- a/crates/rpc/rpc-engine-api/tests/it/payload.rs +++ b/crates/rpc/rpc-engine-api/tests/it/payload.rs @@ -21,11 +21,7 @@ fn transform_block Block>(src: SealedBlock, f: F) -> Executi transformed.header.transactions_root = proofs::calculate_transaction_root(&transformed.body.transactions); transformed.header.ommers_hash = proofs::calculate_ommers_root(&transformed.body.ommers); - block_to_payload(SealedBlock { - header: SealedHeader::seal(transformed.header), - body: transformed.body, - }) - .0 + block_to_payload(SealedBlock::new(SealedHeader::seal(transformed.header), transformed.body)).0 } #[test] @@ -40,7 +36,7 @@ fn payload_body_roundtrip() { ExecutionPayloadBodyV1::from_block(block.clone().unseal::()); assert_eq!( - Ok(block.body.transactions), + Ok(block.body().transactions.clone()), payload_body .transactions .iter() @@ -48,7 +44,7 @@ fn payload_body_roundtrip() { .collect::, _>>(), ); let withdraw = payload_body.withdrawals.map(Withdrawals::new); - assert_eq!(block.body.withdrawals, withdraw); + assert_eq!(block.body().withdrawals.clone(), withdraw); } } diff --git a/crates/rpc/rpc-eth-api/src/helpers/block.rs b/crates/rpc/rpc-eth-api/src/helpers/block.rs index 1ae084fbe..4cb01d16d 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/block.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/block.rs @@ -88,7 +88,7 @@ pub trait EthBlocks: LoadBlock { .provider() .pending_block() .map_err(Self::Error::from_eth_err)? - .map(|block| block.body.transactions().len())) + .map(|block| block.body().transactions().len())) } let block_hash = match self @@ -105,7 +105,7 @@ pub trait EthBlocks: LoadBlock { .get_sealed_block_with_senders(block_hash) .await .map_err(Self::Error::from_eth_err)? - .map(|b| b.body.transactions().len())) + .map(|b| b.body().transactions().len())) } } @@ -188,7 +188,7 @@ pub trait EthBlocks: LoadBlock { self.provider() .pending_block() .map_err(Self::Error::from_eth_err)? - .and_then(|block| block.body.ommers().map(|o| o.to_vec())) + .and_then(|block| block.body().ommers().map(|o| o.to_vec())) } else { self.provider().ommers_by_id(block_id).map_err(Self::Error::from_eth_err)? } diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index d05929992..1b20dd9d9 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -314,11 +314,11 @@ pub trait EthCall: EstimateCall + Call + LoadPendingBlock + LoadBlock + FullEthA let mut replay_block_txs = true; let num_txs = - transaction_index.index().unwrap_or_else(|| block.body.transactions().len()); + transaction_index.index().unwrap_or_else(|| block.body().transactions().len()); // but if all transactions are to be replayed, we can use the state at the block itself, // however only if we're not targeting the pending block, because for pending we can't // rely on the block's state being available - if !is_block_target_pending && num_txs == block.body.transactions().len() { + if !is_block_target_pending && num_txs == block.body().transactions().len() { at = block.hash(); replay_block_txs = false; } diff --git a/crates/rpc/rpc-eth-api/src/helpers/fee.rs b/crates/rpc/rpc-eth-api/src/helpers/fee.rs index 194558873..f2ab11acc 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/fee.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/fee.rs @@ -185,7 +185,7 @@ pub trait EthFees: LoadFee { percentiles, header.gas_used(), header.base_fee_per_gas().unwrap_or_default(), - block.body.transactions(), + block.body().transactions(), &receipts, ) .unwrap_or_default(), diff --git a/crates/rpc/rpc-eth-api/src/helpers/trace.rs b/crates/rpc/rpc-eth-api/src/helpers/trace.rs index 9ef8020f7..a5808b04c 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/trace.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/trace.rs @@ -320,7 +320,7 @@ pub trait Trace: let Some(block) = block else { return Ok(None) }; - if block.body.transactions().is_empty() { + if block.body().transactions().is_empty() { // nothing to trace return Ok(Some(Vec::new())) } @@ -350,7 +350,7 @@ pub trait Trace: // prepare transactions, we do everything upfront to reduce time spent with open // state let max_transactions = - highest_index.map_or(block.body.transactions().len(), |highest| { + highest_index.map_or(block.body().transactions().len(), |highest| { // we need + 1 because the index is 0-based highest as usize + 1 }); diff --git a/crates/rpc/rpc-eth-api/src/helpers/transaction.rs b/crates/rpc/rpc-eth-api/src/helpers/transaction.rs index cb35d7f5d..39e5153be 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/transaction.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/transaction.rs @@ -94,7 +94,7 @@ pub trait EthTransactions: LoadTransaction { self.cache() .get_sealed_block_with_senders(block) .await - .map(|b| b.map(|b| b.body.transactions().to_vec())) + .map(|b| b.map(|b| b.body().transactions().to_vec())) .map_err(Self::Error::from_eth_err) } } diff --git a/crates/rpc/rpc-eth-types/src/cache/mod.rs b/crates/rpc/rpc-eth-types/src/cache/mod.rs index b27ca7dad..271f9d214 100644 --- a/crates/rpc/rpc-eth-types/src/cache/mod.rs +++ b/crates/rpc/rpc-eth-types/src/cache/mod.rs @@ -304,7 +304,7 @@ where } Either::Right(transaction_tx) => { let _ = transaction_tx.send(res.clone().map(|maybe_block| { - maybe_block.map(|block| block.block.body.transactions().to_vec()) + maybe_block.map(|block| block.block.body().transactions().to_vec()) })); } } @@ -350,7 +350,7 @@ where } Either::Right(transaction_tx) => { let _ = transaction_tx.send(res.clone().map(|maybe_block| { - maybe_block.map(|block| block.block.body.transactions().to_vec()) + maybe_block.map(|block| block.block.body().transactions().to_vec()) })); } } diff --git a/crates/rpc/rpc-eth-types/src/fee_history.rs b/crates/rpc/rpc-eth-types/src/fee_history.rs index 9b0118203..2bf3fc7a1 100644 --- a/crates/rpc/rpc-eth-types/src/fee_history.rs +++ b/crates/rpc/rpc-eth-types/src/fee_history.rs @@ -89,7 +89,7 @@ impl FeeHistoryCache { &percentiles, fee_history_entry.gas_used, fee_history_entry.base_fee_per_gas, - block.body.transactions(), + block.body().transactions(), &receipts, ) .unwrap_or_default(); @@ -370,7 +370,7 @@ impl FeeHistoryEntry { base_fee_per_blob_gas: block .excess_blob_gas() .map(alloy_eips::eip4844::calc_blob_gasprice), - blob_gas_used_ratio: block.body.blob_gas_used() as f64 / + blob_gas_used_ratio: block.body().blob_gas_used() as f64 / alloy_eips::eip4844::MAX_DATA_GAS_PER_BLOCK as f64, excess_blob_gas: block.excess_blob_gas(), blob_gas_used: block.blob_gas_used(), diff --git a/crates/rpc/rpc-eth-types/src/gas_oracle.rs b/crates/rpc/rpc-eth-types/src/gas_oracle.rs index e13c9f5a0..34e430313 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-eth-types/src/logs_utils.rs b/crates/rpc/rpc-eth-types/src/logs_utils.rs index 8b2dbaa54..dd523a19a 100644 --- a/crates/rpc/rpc-eth-types/src/logs_utils.rs +++ b/crates/rpc/rpc-eth-types/src/logs_utils.rs @@ -92,7 +92,7 @@ where if transaction_hash.is_none() { transaction_hash = match &provider_or_block { ProviderOrBlock::Block(block) => { - block.body.transactions().get(receipt_idx).map(|t| t.trie_hash()) + block.body().transactions().get(receipt_idx).map(|t| t.trie_hash()) } ProviderOrBlock::Provider(provider) => { let first_tx_num = match loaded_first_tx_num { diff --git a/crates/rpc/rpc-types-compat/src/engine/payload.rs b/crates/rpc/rpc-types-compat/src/engine/payload.rs index 4b5e6ee11..2ce20865b 100644 --- a/crates/rpc/rpc-types-compat/src/engine/payload.rs +++ b/crates/rpc/rpc-types-compat/src/engine/payload.rs @@ -16,14 +16,11 @@ use reth_primitives_traits::{BlockBody as _, SignedTransaction}; pub fn block_to_payload( value: SealedBlock>, ) -> (ExecutionPayload, ExecutionPayloadSidecar) { - let cancun = if let Some(parent_beacon_block_root) = value.parent_beacon_block_root { - Some(CancunPayloadFields { + let cancun = + value.parent_beacon_block_root.map(|parent_beacon_block_root| CancunPayloadFields { parent_beacon_block_root, - versioned_hashes: value.body.blob_versioned_hashes_iter().copied().collect(), - }) - } else { - None - }; + versioned_hashes: value.body().blob_versioned_hashes_iter().copied().collect(), + }); let prague = value .requests_hash @@ -38,7 +35,7 @@ pub fn block_to_payload( let execution_payload = if value.header.parent_beacon_block_root.is_some() { // block with parent beacon block root: V3 ExecutionPayload::V3(block_to_payload_v3(value)) - } else if value.body.withdrawals.is_some() { + } else if value.body().withdrawals.is_some() { // block with withdrawals: V2 ExecutionPayload::V2(block_to_payload_v2(value)) } else { @@ -54,7 +51,7 @@ pub fn block_to_payload_v1( value: SealedBlock>, ) -> ExecutionPayloadV1 { let transactions = - value.body.transactions.iter().map(|tx| tx.encoded_2718().into()).collect::>(); + value.body().transactions.iter().map(|tx| tx.encoded_2718().into()).collect::>(); ExecutionPayloadV1 { parent_hash: value.parent_hash, fee_recipient: value.beneficiary, @@ -75,10 +72,10 @@ pub fn block_to_payload_v1( /// Converts [`SealedBlock`] to [`ExecutionPayloadV2`] pub fn block_to_payload_v2( - mut value: SealedBlock>, + value: SealedBlock>, ) -> ExecutionPayloadV2 { ExecutionPayloadV2 { - withdrawals: value.body.withdrawals.take().unwrap_or_default().into_inner(), + withdrawals: value.body().withdrawals.clone().unwrap_or_default().into_inner(), payload_inner: block_to_payload_v1(value), } } @@ -99,7 +96,7 @@ pub fn convert_block_to_payload_field_v2( value: SealedBlock>, ) -> ExecutionPayloadFieldV2 { // if there are withdrawals, return V2 - if value.body.withdrawals.is_some() { + if value.body().withdrawals.is_some() { ExecutionPayloadFieldV2::V2(block_to_payload_v2(value)) } else { ExecutionPayloadFieldV2::V1(block_to_payload_v1(value)) diff --git a/crates/rpc/rpc/src/debug.rs b/crates/rpc/rpc/src/debug.rs index d4b8c3757..8421b371d 100644 --- a/crates/rpc/rpc/src/debug.rs +++ b/crates/rpc/rpc/src/debug.rs @@ -103,7 +103,7 @@ where let this = self.clone(); self.eth_api() .spawn_with_state_at_block(block.parent_hash().into(), move |state| { - let mut results = Vec::with_capacity(block.body.transactions().len()); + let mut results = Vec::with_capacity(block.body().transactions().len()); let mut db = CacheDB::new(StateProviderDatabase::new(state)); this.eth_api().apply_pre_execution_changes(&block, &mut db, &cfg, &block_env)?; @@ -527,11 +527,12 @@ where let mut replay_block_txs = true; // if a transaction index is provided, we need to replay the transactions until the index - let num_txs = transaction_index.index().unwrap_or_else(|| block.body.transactions().len()); + let num_txs = + transaction_index.index().unwrap_or_else(|| block.body().transactions().len()); // but if all transactions are to be replayed, we can use the state at the block itself // this works with the exception of the PENDING block, because its state might not exist if // built locally - if !target_block.is_pending() && num_txs == block.body.transactions().len() { + if !target_block.is_pending() && num_txs == block.body().transactions().len() { at = block.hash(); replay_block_txs = false; } diff --git a/crates/rpc/rpc/src/eth/helpers/block.rs b/crates/rpc/rpc/src/eth/helpers/block.rs index 51a76f4e9..7fbbb837c 100644 --- a/crates/rpc/rpc/src/eth/helpers/block.rs +++ b/crates/rpc/rpc/src/eth/helpers/block.rs @@ -40,7 +40,7 @@ where let timestamp = block.timestamp(); return block - .body + .body() .transactions() .iter() .zip(receipts.iter()) diff --git a/crates/rpc/rpc/src/trace.rs b/crates/rpc/rpc/src/trace.rs index b98cfce62..aaf8539ab 100644 --- a/crates/rpc/rpc/src/trace.rs +++ b/crates/rpc/rpc/src/trace.rs @@ -315,7 +315,7 @@ where all_traces.extend( self.extract_reward_traces( block.header.header(), - block.body.ommers(), + block.body().ommers(), base_block_reward, ) .into_iter() @@ -396,7 +396,7 @@ where { traces.extend(self.extract_reward_traces( block.block.header(), - block.body.ommers(), + block.body().ommers(), base_block_reward, )); } diff --git a/crates/stages/stages/benches/setup/mod.rs b/crates/stages/stages/benches/setup/mod.rs index b2e6d4efc..2c1174d63 100644 --- a/crates/stages/stages/benches/setup/mod.rs +++ b/crates/stages/stages/benches/setup/mod.rs @@ -151,9 +151,10 @@ pub(crate) fn txs_testdata(num_blocks: u64) -> TestStageDB { .unwrap(); let second_block = blocks.get_mut(1).unwrap(); let cloned_second = second_block.clone(); - let mut updated_header = cloned_second.header.unseal(); + let mut updated_header = cloned_second.header.clone().unseal(); updated_header.state_root = root; - *second_block = SealedBlock { header: SealedHeader::seal(updated_header), ..cloned_second }; + *second_block = + SealedBlock::new(SealedHeader::seal(updated_header), cloned_second.into_body()); let offset = transitions.len() as u64; @@ -184,9 +185,9 @@ pub(crate) fn txs_testdata(num_blocks: u64) -> TestStageDB { let last_block = blocks.last_mut().unwrap(); let cloned_last = last_block.clone(); - let mut updated_header = cloned_last.header.unseal(); + let mut updated_header = cloned_last.header.clone().unseal(); updated_header.state_root = root; - *last_block = SealedBlock { header: SealedHeader::seal(updated_header), ..cloned_last }; + *last_block = SealedBlock::new(SealedHeader::seal(updated_header), cloned_last.into_body()); db.insert_blocks(blocks.iter(), StorageKind::Static).unwrap(); diff --git a/crates/stages/stages/src/stages/bodies.rs b/crates/stages/stages/src/stages/bodies.rs index 0f311b1bc..9bc1bcc45 100644 --- a/crates/stages/stages/src/stages/bodies.rs +++ b/crates/stages/stages/src/stages/bodies.rs @@ -519,7 +519,7 @@ mod tests { /// A helper to create a collection of block bodies keyed by their hash. pub(crate) fn body_by_hash(block: &SealedBlock) -> (B256, BlockBody) { - (block.hash(), block.body.clone()) + (block.hash(), block.body().clone()) } /// A helper struct for running the [`BodyStage`]. @@ -592,7 +592,7 @@ mod tests { let body = StoredBlockBodyIndices { first_tx_num: 0, - tx_count: progress.body.transactions.len() as u64, + tx_count: progress.body().transactions.len() as u64, }; static_file_producer.set_block_range(0..=progress.number); @@ -614,7 +614,7 @@ mod tests { if !progress.ommers_hash_is_empty() { tx.put::( progress.number, - StoredBlockOmmers { ommers: progress.body.ommers.clone() }, + StoredBlockOmmers { ommers: progress.body().ommers.clone() }, )?; } @@ -801,7 +801,7 @@ mod tests { } else { let body = this.responses.remove(&header.hash()).expect("requested unknown body"); - response.push(BlockResponse::Full(SealedBlock { header, body })); + response.push(BlockResponse::Full(SealedBlock::new(header, body))); } if response.len() as u64 >= this.batch_size { diff --git a/crates/stages/stages/src/stages/hashing_storage.rs b/crates/stages/stages/src/stages/hashing_storage.rs index 0be84665b..6110d2101 100644 --- a/crates/stages/stages/src/stages/hashing_storage.rs +++ b/crates/stages/stages/src/stages/hashing_storage.rs @@ -353,7 +353,7 @@ mod tests { // Insert last progress data let block_number = progress.number; self.db.commit(|tx| { - progress.body.transactions.iter().try_for_each( + progress.body().transactions.iter().try_for_each( |transaction| -> Result<(), reth_db::DatabaseError> { tx.put::( transaction.hash(), @@ -398,7 +398,7 @@ mod tests { let body = StoredBlockBodyIndices { first_tx_num, - tx_count: progress.body.transactions.len() as u64, + tx_count: progress.body().transactions.len() as u64, }; first_tx_num = next_tx_num; diff --git a/crates/stages/stages/src/stages/merkle.rs b/crates/stages/stages/src/stages/merkle.rs index 8cd7abc73..f697ced2d 100644 --- a/crates/stages/stages/src/stages/merkle.rs +++ b/crates/stages/stages/src/stages/merkle.rs @@ -520,11 +520,12 @@ mod tests { accounts.iter().map(|(addr, acc)| (*addr, (*acc, std::iter::empty()))), )?; - let SealedBlock { header, body } = random_block( + let (header, body) = random_block( &mut rng, stage_progress, BlockParams { parent: preblocks.last().map(|b| b.hash()), ..Default::default() }, - ); + ) + .split_header_body(); let mut header = header.unseal(); header.state_root = state_root( @@ -533,7 +534,7 @@ mod tests { .into_iter() .map(|(address, account)| (address, (account, std::iter::empty()))), ); - let sealed_head = SealedBlock { header: SealedHeader::seal(header), body }; + let sealed_head = SealedBlock::new(SealedHeader::seal(header), body); let head_hash = sealed_head.hash(); let mut blocks = vec![sealed_head]; diff --git a/crates/stages/stages/src/stages/mod.rs b/crates/stages/stages/src/stages/mod.rs index 955d0d01e..6ef5b2659 100644 --- a/crates/stages/stages/src/stages/mod.rs +++ b/crates/stages/stages/src/stages/mod.rs @@ -267,8 +267,8 @@ mod tests { let mut receipts = Vec::with_capacity(blocks.len()); let mut tx_num = 0u64; for block in &blocks { - let mut block_receipts = Vec::with_capacity(block.body.transactions.len()); - for transaction in &block.body.transactions { + let mut block_receipts = Vec::with_capacity(block.body().transactions.len()); + for transaction in &block.body().transactions { block_receipts.push((tx_num, random_receipt(&mut rng, transaction, Some(0)))); tx_num += 1; } diff --git a/crates/stages/stages/src/stages/prune.rs b/crates/stages/stages/src/stages/prune.rs index 7e5d7af46..4bd298827 100644 --- a/crates/stages/stages/src/stages/prune.rs +++ b/crates/stages/stages/src/stages/prune.rs @@ -216,7 +216,7 @@ mod tests { ); self.db.insert_blocks(blocks.iter(), StorageKind::Static)?; self.db.insert_transaction_senders( - blocks.iter().flat_map(|block| block.body.transactions.iter()).enumerate().map( + blocks.iter().flat_map(|block| block.body().transactions.iter()).enumerate().map( |(i, tx)| (i as u64, tx.recover_signer().expect("failed to recover signer")), ), )?; diff --git a/crates/stages/stages/src/stages/sender_recovery.rs b/crates/stages/stages/src/stages/sender_recovery.rs index 833246b1b..f832df7ff 100644 --- a/crates/stages/stages/src/stages/sender_recovery.rs +++ b/crates/stages/stages/src/stages/sender_recovery.rs @@ -477,7 +477,7 @@ mod tests { let expected_progress = seed .iter() .find(|x| { - tx_count += x.body.transactions.len(); + tx_count += x.body().transactions.len(); tx_count as u64 > threshold }) .map(|x| x.number) @@ -536,7 +536,7 @@ mod tests { let mut tx_senders = Vec::new(); let mut tx_number = 0; for block in &blocks[..=max_processed_block] { - for transaction in &block.body.transactions { + for transaction in &block.body().transactions { if block.number > max_pruned_block { tx_senders .push((tx_number, transaction.recover_signer().expect("recover signer"))); @@ -555,7 +555,7 @@ mod tests { tx_number: Some( blocks[..=max_pruned_block as usize] .iter() - .map(|block| block.body.transactions.len() as u64) + .map(|block| block.body().transactions.len() as u64) .sum(), ), prune_mode: PruneMode::Full, @@ -570,9 +570,9 @@ mod tests { EntitiesCheckpoint { processed: blocks[..=max_processed_block] .iter() - .map(|block| block.body.transactions.len() as u64) + .map(|block| block.body().transactions.len() as u64) .sum(), - total: blocks.iter().map(|block| block.body.transactions.len() as u64).sum() + total: blocks.iter().map(|block| block.body().transactions.len() as u64).sum() } ); } diff --git a/crates/stages/stages/src/stages/tx_lookup.rs b/crates/stages/stages/src/stages/tx_lookup.rs index 90f577360..04542e1e0 100644 --- a/crates/stages/stages/src/stages/tx_lookup.rs +++ b/crates/stages/stages/src/stages/tx_lookup.rs @@ -385,7 +385,7 @@ mod tests { let mut tx_hash_numbers = Vec::new(); let mut tx_hash_number = 0; for block in &blocks[..=max_processed_block] { - for transaction in &block.body.transactions { + for transaction in &block.body().transactions { if block.number > max_pruned_block { tx_hash_numbers.push((transaction.hash(), tx_hash_number)); } @@ -403,7 +403,7 @@ mod tests { tx_number: Some( blocks[..=max_pruned_block as usize] .iter() - .map(|block| block.body.transactions.len() as u64) + .map(|block| block.body().transactions.len() as u64) .sum::() .sub(1), // `TxNumber` is 0-indexed ), @@ -419,9 +419,9 @@ mod tests { EntitiesCheckpoint { processed: blocks[..=max_processed_block] .iter() - .map(|block| block.body.transactions.len() as u64) + .map(|block| block.body().transactions.len() as u64) .sum(), - total: blocks.iter().map(|block| block.body.transactions.len() as u64).sum() + total: blocks.iter().map(|block| block.body().transactions.len() as u64).sum() } ); } diff --git a/crates/stages/stages/src/test_utils/test_db.rs b/crates/stages/stages/src/test_utils/test_db.rs index 5a6c12d8e..18680c8ec 100644 --- a/crates/stages/stages/src/test_utils/test_db.rs +++ b/crates/stages/stages/src/test_utils/test_db.rs @@ -252,10 +252,10 @@ impl TestStageDB { // Insert into body tables. let block_body_indices = StoredBlockBodyIndices { first_tx_num: next_tx_num, - tx_count: block.body.transactions.len() as u64, + tx_count: block.body().transactions.len() as u64, }; - if !block.body.transactions.is_empty() { + if !block.body().transactions.is_empty() { tx.put::( block_body_indices.last_tx_num(), block.number, @@ -263,7 +263,7 @@ impl TestStageDB { } tx.put::(block.number, block_body_indices)?; - let res = block.body.transactions.iter().try_for_each(|body_tx| { + let res = block.body().transactions.iter().try_for_each(|body_tx| { if let Some(txs_writer) = &mut txs_writer { txs_writer.append_transaction(next_tx_num, body_tx)?; } else { diff --git a/crates/static-file/static-file/src/static_file_producer.rs b/crates/static-file/static-file/src/static_file_producer.rs index 66b01235a..7653d0d5a 100644 --- a/crates/static-file/static-file/src/static_file_producer.rs +++ b/crates/static-file/static-file/src/static_file_producer.rs @@ -299,7 +299,7 @@ mod tests { let mut receipts = Vec::new(); for block in &blocks { - for transaction in &block.body.transactions { + for transaction in &block.body().transactions { receipts .push((receipts.len() as u64, random_receipt(&mut rng, transaction, Some(0)))); } diff --git a/crates/storage/provider/src/providers/blockchain_provider.rs b/crates/storage/provider/src/providers/blockchain_provider.rs index c147c4534..e81818a02 100644 --- a/crates/storage/provider/src/providers/blockchain_provider.rs +++ b/crates/storage/provider/src/providers/blockchain_provider.rs @@ -882,7 +882,7 @@ mod tests { let receipts: Vec> = database_blocks .iter() .chain(in_memory_blocks.iter()) - .map(|block| block.body.transactions.iter()) + .map(|block| block.body().transactions.iter()) .map(|tx| tx.map(|tx| random_receipt(rng, tx, Some(2))).collect()) .collect(); @@ -1253,11 +1253,11 @@ mod tests { // First in memory block ommers should be found assert_eq!( provider.ommers(first_in_mem_block.number.into())?, - Some(first_in_mem_block.body.ommers.clone()) + Some(first_in_mem_block.body().ommers.clone()) ); assert_eq!( provider.ommers(first_in_mem_block.hash().into())?, - Some(first_in_mem_block.body.ommers.clone()) + Some(first_in_mem_block.body().ommers.clone()) ); // A random hash should return None as the block number is not found @@ -1468,7 +1468,7 @@ mod tests { shainghai_timestamp )? .unwrap(), - block.body.withdrawals.unwrap(), + block.body().withdrawals.clone().unwrap(), "Expected withdrawals_by_block to return correct withdrawals" ); } @@ -1478,7 +1478,7 @@ mod tests { assert_eq!( Some(provider.latest_withdrawal()?.unwrap()), - canonical_block.body.withdrawals.clone().unwrap().pop(), + canonical_block.body().withdrawals.clone().unwrap().pop(), "Expected latest withdrawal to be equal to last withdrawal entry in canonical block" ); @@ -1675,11 +1675,11 @@ mod tests { assert_eq!( provider.ommers_by_id(block_number.into()).unwrap().unwrap_or_default(), - database_block.body.ommers + database_block.body().ommers ); assert_eq!( provider.ommers_by_id(block_hash.into()).unwrap().unwrap_or_default(), - database_block.body.ommers + database_block.body().ommers ); let block_number = in_memory_block.number; @@ -1687,11 +1687,11 @@ mod tests { assert_eq!( provider.ommers_by_id(block_number.into()).unwrap().unwrap_or_default(), - in_memory_block.body.ommers + in_memory_block.body().ommers ); assert_eq!( provider.ommers_by_id(block_hash.into()).unwrap().unwrap_or_default(), - in_memory_block.body.ommers + in_memory_block.body().ommers ); Ok(()) @@ -2168,9 +2168,9 @@ mod tests { $( // Since data moves for each tried method, need to recalculate everything let db_tx_count = - database_blocks.iter().map(|b| b.body.transactions.len()).sum::() as u64; + database_blocks.iter().map(|b| b.body().transactions.len()).sum::() as u64; let in_mem_tx_count = - in_memory_blocks.iter().map(|b| b.body.transactions.len()).sum::() as u64; + in_memory_blocks.iter().map(|b| b.body().transactions.len()).sum::() as u64; let db_range = 0..=(db_tx_count - 1); let in_mem_range = db_tx_count..=(in_mem_tx_count + db_range.end()); @@ -2249,7 +2249,7 @@ mod tests { .senders() .unwrap()), (transactions_by_tx_range, |block: &SealedBlock, _: &Vec>| block - .body + .body() .transactions .clone()), (receipts_by_tx_range, |block: &SealedBlock, receipts: &Vec>| receipts @@ -2348,7 +2348,7 @@ mod tests { (sealed_block_with_senders_range, |block: &SealedBlock| block .clone() .with_senders_unchecked(vec![])), - (transactions_by_block_range, |block: &SealedBlock| block.body.transactions.clone()), + (transactions_by_block_range, |block: &SealedBlock| block.body().transactions.clone()), ]); Ok(()) @@ -2405,13 +2405,13 @@ mod tests { let mut in_memory_blocks: std::collections::VecDeque<_> = in_memory_blocks.into(); $( - let tx_hash = |block: &SealedBlock| block.body.transactions[0].hash(); + let tx_hash = |block: &SealedBlock| block.body().transactions[0].hash(); let tx_num = |block: &SealedBlock| { database_blocks .iter() .chain(in_memory_blocks.iter()) .take_while(|b| b.number < block.number) - .map(|b| b.body.transactions.len()) + .map(|b| b.body().transactions.len()) .sum::() as u64 }; @@ -2432,7 +2432,7 @@ mod tests { .iter() .chain(in_memory_blocks.iter()) .take_while(|b| b.number < block.number) - .map(|b| b.body.transactions.len()) + .map(|b| b.body().transactions.len()) .sum::() as u64 }; @@ -2528,7 +2528,7 @@ mod tests { block.number, Some(StoredBlockBodyIndices { first_tx_num: tx_num, - tx_count: block.body.transactions.len() as u64 + tx_count: block.body().transactions.len() as u64 }) ), u64::MAX @@ -2597,7 +2597,7 @@ mod tests { transaction_by_id, |block: &SealedBlock, tx_num: TxNumber, _: B256, _: &Vec>| ( tx_num, - Some(block.body.transactions[test_tx_index].clone()) + Some(block.body().transactions[test_tx_index].clone()) ), u64::MAX ), @@ -2606,7 +2606,7 @@ mod tests { transaction_by_id_unhashed, |block: &SealedBlock, tx_num: TxNumber, _: B256, _: &Vec>| ( tx_num, - Some(block.body.transactions[test_tx_index].clone()) + Some(block.body().transactions[test_tx_index].clone()) ), u64::MAX ), @@ -2615,7 +2615,7 @@ mod tests { transaction_by_hash, |block: &SealedBlock, _: TxNumber, tx_hash: B256, _: &Vec>| ( tx_hash, - Some(block.body.transactions[test_tx_index].clone()) + Some(block.body().transactions[test_tx_index].clone()) ), B256::random() ), @@ -2633,7 +2633,7 @@ mod tests { transactions_by_block, |block: &SealedBlock, _: TxNumber, _: B256, _: &Vec>| ( BlockHashOrNumber::Number(block.number), - Some(block.body.transactions.clone()) + Some(block.body().transactions.clone()) ), BlockHashOrNumber::Number(u64::MAX) ), @@ -2642,7 +2642,7 @@ mod tests { transactions_by_block, |block: &SealedBlock, _: TxNumber, _: B256, _: &Vec>| ( BlockHashOrNumber::Hash(block.hash()), - Some(block.body.transactions.clone()) + Some(block.body().transactions.clone()) ), BlockHashOrNumber::Number(u64::MAX) ), @@ -2651,7 +2651,7 @@ mod tests { transaction_sender, |block: &SealedBlock, tx_num: TxNumber, _: B256, _: &Vec>| ( tx_num, - block.body.transactions[test_tx_index].recover_signer() + block.body().transactions[test_tx_index].recover_signer() ), u64::MAX ), @@ -2737,7 +2737,7 @@ mod tests { // This will persist block 1 AFTER a database is created. Moving it from memory to // storage. persist_block_after_db_tx_creation(provider.clone(), in_memory_blocks[0].number); - let to_be_persisted_tx = in_memory_blocks[0].body.transactions[0].clone(); + let to_be_persisted_tx = in_memory_blocks[0].body().transactions[0].clone(); // Even though the block exists, given the order of provider queries done in the method // above, we do not see it. @@ -2756,7 +2756,7 @@ mod tests { // This will persist block 1 AFTER a database is created. Moving it from memory to // storage. persist_block_after_db_tx_creation(provider.clone(), in_memory_blocks[1].number); - let to_be_persisted_tx = in_memory_blocks[1].body.transactions[0].clone(); + let to_be_persisted_tx = in_memory_blocks[1].body().transactions[0].clone(); assert_eq!( correct_transaction_hash_fn( diff --git a/crates/storage/provider/src/providers/consistent.rs b/crates/storage/provider/src/providers/consistent.rs index f72e0a1d5..1352a8acf 100644 --- a/crates/storage/provider/src/providers/consistent.rs +++ b/crates/storage/provider/src/providers/consistent.rs @@ -444,7 +444,7 @@ impl ConsistentProvider { let (start, end) = self.convert_range_bounds(range, || { in_mem_chain .iter() - .map(|b| b.block_ref().block().body.transactions().len() as u64) + .map(|b| b.block_ref().block().body().transactions().len() as u64) .sum::() + last_block_body_index.last_tx_num() }); @@ -476,7 +476,7 @@ impl ConsistentProvider { // Iterate from the lowest block to the highest in-memory chain for block_state in in_mem_chain.iter().rev() { - let block_tx_count = block_state.block_ref().block().body.transactions().len(); + let block_tx_count = block_state.block_ref().block().body().transactions().len(); let remaining = (tx_range.end() - tx_range.start() + 1) as usize; // If the transaction range start is equal or higher than the next block first @@ -550,10 +550,10 @@ impl ConsistentProvider { let executed_block = block_state.block_ref(); let block = executed_block.block(); - for tx_index in 0..block.body.transactions().len() { + for tx_index in 0..block.body().transactions().len() { match id { HashOrNumber::Hash(tx_hash) => { - if tx_hash == block.body.transactions()[tx_index].trie_hash() { + if tx_hash == block.body().transactions()[tx_index].trie_hash() { return fetch_from_block_state(tx_index, in_memory_tx_num, block_state) } } @@ -917,7 +917,7 @@ impl TransactionsProvider for ConsistentProvider { id.into(), |provider| provider.transaction_by_id(id), |tx_index, _, block_state| { - Ok(block_state.block_ref().block().body.transactions().get(tx_index).cloned()) + Ok(block_state.block_ref().block().body().transactions().get(tx_index).cloned()) }, ) } @@ -930,7 +930,7 @@ impl TransactionsProvider for ConsistentProvider { id.into(), |provider| provider.transaction_by_id_unhashed(id), |tx_index, _, block_state| { - Ok(block_state.block_ref().block().body.transactions().get(tx_index).cloned()) + Ok(block_state.block_ref().block().body().transactions().get(tx_index).cloned()) }, ) } @@ -971,7 +971,7 @@ impl TransactionsProvider for ConsistentProvider { self.get_in_memory_or_storage_by_block( id, |provider| provider.transactions_by_block(id), - |block_state| Ok(Some(block_state.block_ref().block().body.transactions().to_vec())), + |block_state| Ok(Some(block_state.block_ref().block().body().transactions().to_vec())), ) } @@ -982,7 +982,7 @@ impl TransactionsProvider for ConsistentProvider { self.get_in_memory_or_storage_by_block_range_while( range, |db_provider, range, _| db_provider.transactions_by_block_range(range), - |block_state, _| Some(block_state.block_ref().block().body.transactions().to_vec()), + |block_state, _| Some(block_state.block_ref().block().body().transactions().to_vec()), |_| true, ) } @@ -995,7 +995,7 @@ impl TransactionsProvider for ConsistentProvider { range, |db_provider, db_range| db_provider.transactions_by_tx_range(db_range), |index_range, block_state| { - Ok(block_state.block_ref().block().body.transactions()[index_range].to_vec()) + Ok(block_state.block_ref().block().body().transactions()[index_range].to_vec()) }, ) } @@ -1041,13 +1041,13 @@ impl ReceiptProvider for ConsistentProvider { // assuming 1:1 correspondence between transactions and receipts debug_assert_eq!( - block.body.transactions().len(), + block.body().transactions().len(), receipts.len(), "Mismatch between transaction and receipt count" ); 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()); @@ -1128,7 +1128,7 @@ impl WithdrawalsProvider for ConsistentProvider { self.get_in_memory_or_storage_by_block( id, |db_provider| db_provider.withdrawals_by_block(id, timestamp), - |block_state| Ok(block_state.block_ref().block().body.withdrawals().cloned()), + |block_state| Ok(block_state.block_ref().block().body().withdrawals().cloned()), ) } @@ -1142,7 +1142,7 @@ impl WithdrawalsProvider for ConsistentProvider { Ok(block_state .block_ref() .block() - .body + .body() .withdrawals() .cloned() .and_then(|mut w| w.pop())) @@ -1161,7 +1161,7 @@ impl OmmersProvider for ConsistentProvider { return Ok(Some(Vec::new())) } - Ok(block_state.block_ref().block().body.ommers().map(|o| o.to_vec())) + Ok(block_state.block_ref().block().body().ommers().map(|o| o.to_vec())) }, ) } @@ -1189,7 +1189,7 @@ impl BlockBodyIndicesProvider for ConsistentProvider { // Iterate from the lowest block in memory until our target block for state in block_state.chain().collect::>().into_iter().rev() { - let block_tx_count = state.block_ref().block.body.transactions().len() as u64; + let block_tx_count = state.block_ref().block.body().transactions().len() as u64; if state.block_ref().block().number() == number { stored_indices.tx_count = block_tx_count; } else { diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index 64623f15a..04024abbb 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -718,10 +718,10 @@ mod tests { ); assert_matches!( provider.transaction_sender(0), Ok(Some(sender)) - if sender == block.body.transactions[0].recover_signer().unwrap() + if sender == block.body().transactions[0].recover_signer().unwrap() ); assert_matches!( - provider.transaction_id(block.body.transactions[0].hash()), + provider.transaction_id(block.body().transactions[0].hash()), Ok(Some(0)) ); } @@ -741,7 +741,7 @@ mod tests { Ok(_) ); assert_matches!(provider.transaction_sender(0), Ok(None)); - assert_matches!(provider.transaction_id(block.body.transactions[0].hash()), Ok(None)); + assert_matches!(provider.transaction_id(block.body().transactions[0].hash()), Ok(None)); } } @@ -772,7 +772,7 @@ mod tests { .clone() .map(|tx_number| ( tx_number, - block.body.transactions[tx_number as usize].recover_signer().unwrap() + block.body().transactions[tx_number as usize].recover_signer().unwrap() )) .collect()) ); diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 006ba369b..74c94158d 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -1255,7 +1255,7 @@ impl BlockReader for DatabaseProvid transaction_kind, |block_number| self.sealed_header(block_number), |header, body, senders| { - SealedBlock { header, body } + SealedBlock::new(header, body) // Note: we're using unchecked here because we know the block contains valid txs // wrt to its height and can ignore the s value check so pre // EIP-2 txs are allowed @@ -1297,7 +1297,7 @@ impl BlockReader for DatabaseProvid range, |range| self.sealed_headers_range(range), |header, body, senders| { - SealedBlockWithSenders::new(SealedBlock { header, body }, senders) + SealedBlockWithSenders::new(SealedBlock::new(header, body), senders) .ok_or(ProviderError::SenderRecoveryError) }, ) @@ -2806,11 +2806,11 @@ impl BlockWrite durations_recorder.record_relative(metrics::Action::GetNextTxNum); let first_tx_num = next_tx_num; - let tx_count = block.block.body.transactions().len() as u64; + let tx_count = block.block.body().transactions().len() as u64; // Ensures we have all the senders for the block's transactions. for (transaction, sender) in - block.block.body.transactions().iter().zip(block.senders.iter()) + block.block.body().transactions().iter().zip(block.senders.iter()) { let hash = transaction.tx_hash(); @@ -2824,7 +2824,7 @@ impl BlockWrite next_tx_num += 1; } - self.append_block_bodies(vec![(block_number, Some(block.block.body))], write_to)?; + self.append_block_bodies(vec![(block_number, Some(block.block.into_body()))], write_to)?; debug!( target: "providers::db", diff --git a/crates/storage/provider/src/test_utils/blocks.rs b/crates/storage/provider/src/test_utils/blocks.rs index 8d81e98e9..5ed8b09ee 100644 --- a/crates/storage/provider/src/test_utils/blocks.rs +++ b/crates/storage/provider/src/test_utils/blocks.rs @@ -63,32 +63,39 @@ pub fn assert_genesis_block( // StageCheckpoints is not updated in tests } -pub(crate) static TEST_BLOCK: LazyLock = LazyLock::new(|| SealedBlock { - header: SealedHeader::new( - Header { - parent_hash: hex!("c86e8cc0310ae7c531c758678ddbfd16fc51c8cef8cec650b032de9869e8b94f") +pub(crate) static TEST_BLOCK: LazyLock = LazyLock::new(|| { + SealedBlock::new( + SealedHeader::new( + Header { + parent_hash: hex!( + "c86e8cc0310ae7c531c758678ddbfd16fc51c8cef8cec650b032de9869e8b94f" + ) .into(), - ommers_hash: EMPTY_OMMER_ROOT_HASH, - beneficiary: hex!("2adc25665018aa1fe0e6bc666dac8fc2697ff9ba").into(), - state_root: hex!("50554882fbbda2c2fd93fdc466db9946ea262a67f7a76cc169e714f105ab583d") + ommers_hash: EMPTY_OMMER_ROOT_HASH, + beneficiary: hex!("2adc25665018aa1fe0e6bc666dac8fc2697ff9ba").into(), + state_root: hex!( + "50554882fbbda2c2fd93fdc466db9946ea262a67f7a76cc169e714f105ab583d" + ) .into(), - transactions_root: hex!( - "0967f09ef1dfed20c0eacfaa94d5cd4002eda3242ac47eae68972d07b106d192" - ) - .into(), - receipts_root: hex!("e3c8b47fbfc94667ef4cceb17e5cc21e3b1eebd442cebb27f07562b33836290d") + transactions_root: hex!( + "0967f09ef1dfed20c0eacfaa94d5cd4002eda3242ac47eae68972d07b106d192" + ) .into(), - difficulty: U256::from(131_072), - number: 1, - gas_limit: 1_000_000, - gas_used: 14_352, - timestamp: 1_000, - ..Default::default() - }, - hex!("cf7b274520720b50e6a4c3e5c4d553101f44945396827705518ce17cb7219a42").into(), - ), - body: BlockBody { - transactions: vec![TransactionSigned::new( + receipts_root: hex!( + "e3c8b47fbfc94667ef4cceb17e5cc21e3b1eebd442cebb27f07562b33836290d" + ) + .into(), + difficulty: U256::from(131_072), + number: 1, + gas_limit: 1_000_000, + gas_used: 14_352, + timestamp: 1_000, + ..Default::default() + }, + hex!("cf7b274520720b50e6a4c3e5c4d553101f44945396827705518ce17cb7219a42").into(), + ), + BlockBody { + transactions: vec![TransactionSigned::new( Transaction::Legacy(TxLegacy { gas_price: 10, gas_limit: 400_000, @@ -108,8 +115,9 @@ pub(crate) static TEST_BLOCK: LazyLock = LazyLock::new(|| SealedBlo ), b256!("3541dd1d17e76adeb25dcf2b0a9b60a1669219502e58dcf26a2beafbfb550397"), )], - ..Default::default() - }, + ..Default::default() + }, + ) }); /// Test chain with genesis, blocks, execution results @@ -155,13 +163,13 @@ impl Default for BlockchainTestData { /// Genesis block pub fn genesis() -> SealedBlock { - SealedBlock { - header: SealedHeader::new( + SealedBlock::new( + SealedHeader::new( Header { number: 0, difficulty: U256::from(1), ..Default::default() }, B256::ZERO, ), - body: Default::default(), - } + Default::default(), + ) } fn bundle_state_root(execution_outcome: &ExecutionOutcome) -> B256 { @@ -224,13 +232,13 @@ fn block1(number: BlockNumber) -> (SealedBlockWithSenders, ExecutionOutcome) { b256!("5d035ccb3e75a9057452ff060b773b213ec1fc353426174068edfc3971a0b6bd") ); - let mut block = TEST_BLOCK.clone(); - block.body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); - let mut header = block.header.clone().unseal(); + let (header, mut body) = TEST_BLOCK.clone().split_header_body(); + body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); + let mut header = header.unseal(); header.number = number; header.state_root = state_root; header.parent_hash = B256::ZERO; - block.header = SealedHeader::seal(header); + let block = SealedBlock::new(SealedHeader::seal(header), body); (SealedBlockWithSenders { block, senders: vec![Address::new([0x30; 20])] }, execution_outcome) } @@ -286,15 +294,15 @@ fn block2( b256!("90101a13dd059fa5cca99ed93d1dc23657f63626c5b8f993a2ccbdf7446b64f8") ); - let mut block = TEST_BLOCK.clone(); + let (header, mut body) = TEST_BLOCK.clone().split_header_body(); - block.body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); - let mut header = block.header.clone().unseal(); + body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); + let mut header = header.unseal(); header.number = number; header.state_root = state_root; // parent_hash points to block1 hash header.parent_hash = parent_hash; - block.header = SealedHeader::seal(header); + let block = SealedBlock::new(SealedHeader::seal(header), body); (SealedBlockWithSenders { block, senders: vec![Address::new([0x31; 20])] }, execution_outcome) } @@ -351,14 +359,14 @@ fn block3( extended.extend(execution_outcome.clone()); let state_root = bundle_state_root(&extended); - let mut block = TEST_BLOCK.clone(); - block.body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); - let mut header = block.header.clone().unseal(); + let (header, mut body) = TEST_BLOCK.clone().split_header_body(); + body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); + let mut header = header.unseal(); header.number = number; header.state_root = state_root; // parent_hash points to block1 hash header.parent_hash = parent_hash; - block.header = SealedHeader::seal(header); + let block = SealedBlock::new(SealedHeader::seal(header), body); (SealedBlockWithSenders { block, senders: vec![Address::new([0x31; 20])] }, execution_outcome) } @@ -440,14 +448,14 @@ fn block4( extended.extend(execution_outcome.clone()); let state_root = bundle_state_root(&extended); - let mut block = TEST_BLOCK.clone(); - block.body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); - let mut header = block.header.clone().unseal(); + let (header, mut body) = TEST_BLOCK.clone().split_header_body(); + body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); + let mut header = header.unseal(); header.number = number; header.state_root = state_root; // parent_hash points to block1 hash header.parent_hash = parent_hash; - block.header = SealedHeader::seal(header); + let block = SealedBlock::new(SealedHeader::seal(header), body); (SealedBlockWithSenders { block, senders: vec![Address::new([0x31; 20])] }, execution_outcome) } @@ -526,14 +534,14 @@ fn block5( extended.extend(execution_outcome.clone()); let state_root = bundle_state_root(&extended); - let mut block = TEST_BLOCK.clone(); - block.body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); - let mut header = block.header.clone().unseal(); + let (header, mut body) = TEST_BLOCK.clone().split_header_body(); + body.withdrawals = Some(Withdrawals::new(vec![Withdrawal::default()])); + let mut header = header.unseal(); header.number = number; header.state_root = state_root; // parent_hash points to block1 hash header.parent_hash = parent_hash; - block.header = SealedHeader::seal(header); + let block = SealedBlock::new(SealedHeader::seal(header), body); (SealedBlockWithSenders { block, senders: vec![Address::new([0x31; 20])] }, execution_outcome) } diff --git a/crates/transaction-pool/src/blobstore/tracker.rs b/crates/transaction-pool/src/blobstore/tracker.rs index c359dcc7c..88c8faa78 100644 --- a/crates/transaction-pool/src/blobstore/tracker.rs +++ b/crates/transaction-pool/src/blobstore/tracker.rs @@ -46,7 +46,7 @@ impl BlobStoreCanonTracker { { let blob_txs = blocks.iter().map(|(num, block)| { let iter = block - .body + .body() .transactions() .iter() .filter(|tx| tx.is_eip4844()) @@ -128,12 +128,9 @@ mod tests { // Creating a first block with EIP-4844 transactions let block1 = SealedBlockWithSenders { - block: SealedBlock { - header: SealedHeader::new( - Header { number: 10, ..Default::default() }, - B256::random(), - ), - body: BlockBody { + block: SealedBlock::new( + SealedHeader::new(Header { number: 10, ..Default::default() }, B256::random()), + BlockBody { transactions: vec![ TransactionSigned::new( Transaction::Eip4844(Default::default()), @@ -154,19 +151,16 @@ mod tests { ], ..Default::default() }, - }, + ), ..Default::default() }; // Creating a second block with EIP-1559 and EIP-2930 transactions // Note: This block does not contain any EIP-4844 transactions let block2 = SealedBlockWithSenders { - block: SealedBlock { - header: SealedHeader::new( - Header { number: 11, ..Default::default() }, - B256::random(), - ), - body: BlockBody { + block: SealedBlock::new( + SealedHeader::new(Header { number: 11, ..Default::default() }, B256::random()), + BlockBody { transactions: vec![ TransactionSigned::new( Transaction::Eip1559(Default::default()), @@ -181,7 +175,7 @@ mod tests { ], ..Default::default() }, - }, + ), ..Default::default() }; diff --git a/testing/testing-utils/src/generators.rs b/testing/testing-utils/src/generators.rs index a6610afe9..529c0a49f 100644 --- a/testing/testing-utils/src/generators.rs +++ b/testing/testing-utils/src/generators.rs @@ -232,10 +232,10 @@ pub fn random_block(rng: &mut R, number: u64, block_params: BlockParams) ..Default::default() }; - SealedBlock { - header: SealedHeader::seal(header), - body: BlockBody { transactions, ommers, withdrawals: withdrawals.map(Withdrawals::new) }, - } + SealedBlock::new( + SealedHeader::seal(header), + BlockBody { transactions, ommers, withdrawals: withdrawals.map(Withdrawals::new) }, + ) } /// Generate a range of random blocks.