From 1c443e5ecfd000279830262a4a35cbc83a9aacec Mon Sep 17 00:00:00 2001 From: Joonatan Saarhelo Date: Wed, 24 Jul 2024 18:43:58 +0100 Subject: [PATCH] perf: writing tx to bootloader memory is no longer quadratic (#2479) It used to grow proportionally to the number of transactions in the L2 block squared. --- .../vm_latest/bootloader_state/l2_block.rs | 8 +------ .../vm_latest/bootloader_state/state.rs | 2 +- .../vm_latest/bootloader_state/utils.rs | 22 +++++++++++++------ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/core/lib/multivm/src/versions/vm_latest/bootloader_state/l2_block.rs b/core/lib/multivm/src/versions/vm_latest/bootloader_state/l2_block.rs index bb74f9628946..103c5d16540e 100644 --- a/core/lib/multivm/src/versions/vm_latest/bootloader_state/l2_block.rs +++ b/core/lib/multivm/src/versions/vm_latest/bootloader_state/l2_block.rs @@ -13,7 +13,7 @@ use crate::{ const EMPTY_TXS_ROLLING_HASH: H256 = H256::zero(); -#[derive(Debug, Clone)] +#[derive(Debug)] pub(crate) struct BootloaderL2Block { pub(crate) number: u32, pub(crate) timestamp: u64, @@ -56,12 +56,6 @@ impl BootloaderL2Block { self.txs_rolling_hash = concat_and_hash(self.txs_rolling_hash, tx_hash) } - pub(crate) fn interim_version(&self) -> BootloaderL2Block { - let mut interim = self.clone(); - interim.max_virtual_blocks_to_create = 0; - interim - } - pub(crate) fn make_snapshot(&self) -> L2BlockSnapshot { L2BlockSnapshot { txs_rolling_hash: self.txs_rolling_hash, diff --git a/core/lib/multivm/src/versions/vm_latest/bootloader_state/state.rs b/core/lib/multivm/src/versions/vm_latest/bootloader_state/state.rs index c43d82b0d281..a3f59937d57e 100644 --- a/core/lib/multivm/src/versions/vm_latest/bootloader_state/state.rs +++ b/core/lib/multivm/src/versions/vm_latest/bootloader_state/state.rs @@ -29,7 +29,7 @@ use crate::{ /// Serves two purposes: /// - Tracks where next tx should be pushed to in the bootloader memory. /// - Tracks which transaction should be executed next. -#[derive(Debug, Clone)] +#[derive(Debug)] pub struct BootloaderState { /// ID of the next transaction to be executed. /// See the structure doc-comment for a better explanation of purpose. diff --git a/core/lib/multivm/src/versions/vm_latest/bootloader_state/utils.rs b/core/lib/multivm/src/versions/vm_latest/bootloader_state/utils.rs index 346c1bde5368..db4c834fbc77 100644 --- a/core/lib/multivm/src/versions/vm_latest/bootloader_state/utils.rs +++ b/core/lib/multivm/src/versions/vm_latest/bootloader_state/utils.rs @@ -67,12 +67,7 @@ pub(super) fn apply_tx_to_memory( .zip(bootloader_tx.encoded.clone()), ); - let bootloader_l2_block = if start_new_l2_block { - bootloader_l2_block.clone() - } else { - bootloader_l2_block.interim_version() - }; - apply_l2_block(memory, &bootloader_l2_block, tx_index); + apply_l2_block_inner(memory, bootloader_l2_block, tx_index, start_new_l2_block); // Note, +1 is moving for pointer let compressed_bytecodes_offset = COMPRESSED_BYTECODES_OFFSET + 1 + compressed_bytecodes_size; @@ -93,6 +88,15 @@ pub(crate) fn apply_l2_block( memory: &mut BootloaderMemory, bootloader_l2_block: &BootloaderL2Block, txs_index: usize, +) { + apply_l2_block_inner(memory, bootloader_l2_block, txs_index, true) +} + +fn apply_l2_block_inner( + memory: &mut BootloaderMemory, + bootloader_l2_block: &BootloaderL2Block, + txs_index: usize, + start_new_l2_block: bool, ) { // Since L2 block information start from the `TX_OPERATOR_L2_BLOCK_INFO_OFFSET` and each // L2 block info takes `TX_OPERATOR_SLOTS_PER_L2_BLOCK_INFO` slots, the position where the L2 block info @@ -110,7 +114,11 @@ pub(crate) fn apply_l2_block( ), ( block_position + 3, - bootloader_l2_block.max_virtual_blocks_to_create.into(), + if start_new_l2_block { + bootloader_l2_block.max_virtual_blocks_to_create.into() + } else { + U256::zero() + }, ), ]) }