From 14ee57e6c892ee2e8f90e2c5d4fe9371b16d828b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Mon, 10 Feb 2025 21:09:24 +0100 Subject: [PATCH 1/2] Etherlink/Kernel/Stage 2: clone previous roots only when needed This commit delays the copy of the root hash of receipts and transactions of the previous block, and totally avoids it when the block is not empty. --- etherlink/kernel_evm/kernel/src/block.rs | 4 ++-- .../kernel_evm/kernel/src/block_in_progress.rs | 16 ++++++++-------- etherlink/kernel_evm/kernel/src/gas_price.rs | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/etherlink/kernel_evm/kernel/src/block.rs b/etherlink/kernel_evm/kernel/src/block.rs index 97a4a6ad5539..737b2f57560e 100644 --- a/etherlink/kernel_evm/kernel/src/block.rs +++ b/etherlink/kernel_evm/kernel/src/block.rs @@ -340,8 +340,8 @@ fn compute_bip( .finalize_and_store( host, &constants, - previous_receipts_root.clone(), - previous_transactions_root.clone(), + previous_receipts_root, + previous_transactions_root, ) .context("Failed to finalize the block in progress")?; *current_block_number = new_block.number + 1; diff --git a/etherlink/kernel_evm/kernel/src/block_in_progress.rs b/etherlink/kernel_evm/kernel/src/block_in_progress.rs index 00452ee4dae2..32670f99833b 100644 --- a/etherlink/kernel_evm/kernel/src/block_in_progress.rs +++ b/etherlink/kernel_evm/kernel/src/block_in_progress.rs @@ -364,17 +364,17 @@ impl BlockInProgress { fn receipts_root( &self, host: &mut impl Runtime, - previous_receipts_root: Vec, + previous_receipts_root: &[u8], ) -> anyhow::Result> { if self.valid_txs.is_empty() { - Ok(previous_receipts_root) + Ok(previous_receipts_root.to_vec()) } else { for hash in &self.valid_txs { let receipt_path = receipt_path(hash)?; let new_receipt_path = concat(&Self::RECEIPTS, &receipt_path)?; host.store_copy(&receipt_path, &new_receipt_path)?; } - host.store_write_all(&Self::RECEIPTS_PREVIOUS_ROOT, &previous_receipts_root)?; + host.store_write_all(&Self::RECEIPTS_PREVIOUS_ROOT, previous_receipts_root)?; let receipts_root = Self::safe_store_get_hash(host, &Self::RECEIPTS)?; host.store_delete(&Self::RECEIPTS)?; Ok(receipts_root) @@ -388,10 +388,10 @@ impl BlockInProgress { fn transactions_root( &self, host: &mut impl Runtime, - previous_transactions_root: Vec, + previous_transactions_root: &[u8], ) -> anyhow::Result> { if self.valid_txs.is_empty() { - Ok(previous_transactions_root) + Ok(previous_transactions_root.to_vec()) } else { for hash in &self.valid_txs { let object_path = object_path(hash)?; @@ -400,7 +400,7 @@ impl BlockInProgress { } host.store_write_all( &Self::OBJECTS_PREVIOUS_ROOT, - &previous_transactions_root, + previous_transactions_root, )?; let objects_root = Self::safe_store_get_hash(host, &Self::OBJECTS)?; host.store_delete(&Self::OBJECTS)?; @@ -413,8 +413,8 @@ impl BlockInProgress { self, host: &mut Host, block_constants: &BlockConstants, - previous_receipts_root: Vec, - previous_transactions_root: Vec, + previous_receipts_root: &[u8], + previous_transactions_root: &[u8], ) -> Result { let state_root = Self::safe_store_get_hash(host, &EVM_ACCOUNTS_PATH)?; let receipts_root = self.receipts_root(host, previous_receipts_root)?; diff --git a/etherlink/kernel_evm/kernel/src/gas_price.rs b/etherlink/kernel_evm/kernel/src/gas_price.rs index 8d79fec4f759..c74e18669bcd 100644 --- a/etherlink/kernel_evm/kernel/src/gas_price.rs +++ b/etherlink/kernel_evm/kernel/src/gas_price.rs @@ -209,7 +209,7 @@ mod test { register_block(&mut host, &bip).unwrap(); bip.clone() - .finalize_and_store(&mut host, &dummy_block_constants, vec![], vec![]) + .finalize_and_store(&mut host, &dummy_block_constants, &[], &[]) .unwrap(); // At tolerance, gas price should be min. @@ -222,7 +222,7 @@ mod test { // register more blocks - now double tolerance bip.number = 1.into(); register_block(&mut host, &bip).unwrap(); - bip.finalize_and_store(&mut host, &dummy_block_constants, vec![], vec![]) + bip.finalize_and_store(&mut host, &dummy_block_constants, &[], &[]) .unwrap(); let gas_price_now = base_fee_per_gas(&host, timestamp.into(), min); -- GitLab From 3f2c9c01b4f61b92246659534cb34b18d721322e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Cauderlier?= Date: Mon, 10 Feb 2025 21:13:33 +0100 Subject: [PATCH 2/2] Etherlink/Kernel/Stage 2: remove useless mutations This commit removes the update to 4 variables related to the previous block. Thanks to !16274, these variables are not read after these updates anymore so the update has no effect. --- etherlink/kernel_evm/kernel/src/block.rs | 26 ++++++++---------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/etherlink/kernel_evm/kernel/src/block.rs b/etherlink/kernel_evm/kernel/src/block.rs index 737b2f57560e..331a1de16051 100644 --- a/etherlink/kernel_evm/kernel/src/block.rs +++ b/etherlink/kernel_evm/kernel/src/block.rs @@ -286,10 +286,8 @@ fn compute_bip( host: &mut Host, outbox_queue: &OutboxQueue<'_, impl Path>, mut block_in_progress: BlockInProgress, - current_block_number: &mut U256, - current_block_parent_hash: &mut H256, - previous_receipts_root: &mut Vec, - previous_transactions_root: &mut Vec, + previous_receipts_root: &[u8], + previous_transactions_root: &[u8], precompiles: &PrecompileBTreeMap, evm_account_storage: &mut EthereumAccountStorage, tick_counter: &mut TickCounter, @@ -336,7 +334,7 @@ fn compute_bip( crate::gas_price::register_block(host, &block_in_progress)?; *tick_counter = TickCounter::finalize(block_in_progress.estimated_ticks_in_run); - let new_block = block_in_progress + let _new_block = block_in_progress .finalize_and_store( host, &constants, @@ -344,10 +342,6 @@ fn compute_bip( previous_transactions_root, ) .context("Failed to finalize the block in progress")?; - *current_block_number = new_block.number + 1; - *current_block_parent_hash = new_block.hash; - *previous_receipts_root = new_block.receipts_root; - *previous_transactions_root = new_block.transactions_root; } } Ok(result) @@ -443,10 +437,10 @@ pub fn produce( let coinbase = sequencer_pool_address.unwrap_or_default(); let ( - mut current_block_number, - mut current_block_parent_hash, - mut previous_receipts_root, - mut previous_transactions_root, + current_block_number, + current_block_parent_hash, + previous_receipts_root, + previous_transactions_root, ) = match block_storage::read_current(host) { Ok(block) => ( block.number + 1, @@ -514,10 +508,8 @@ pub fn produce( &mut safe_host, &outbox_queue, block_in_progress, - &mut current_block_number, - &mut current_block_parent_hash, - &mut previous_receipts_root, - &mut previous_transactions_root, + &previous_receipts_root, + &previous_transactions_root, &precompiles, &mut evm_account_storage, &mut tick_counter, -- GitLab