diff --git a/etherlink/CHANGES_KERNEL.md b/etherlink/CHANGES_KERNEL.md index 9552d5116aa399ece2105513f7513ac537cf1ed4..f8cfec8306d3316c956a8d143a92456c7c344ff4 100644 --- a/etherlink/CHANGES_KERNEL.md +++ b/etherlink/CHANGES_KERNEL.md @@ -10,6 +10,7 @@ - Maximum gas per transaction is stored in the durable storage. (!15468) - Minimum base fee per gas is stored in the durable storage. (!15475) - Blueprints from the past are refused on parsing. (!15636) +- Clear blueprints on migration (!15637) ### Bug fixes diff --git a/etherlink/kernel_evm/kernel/src/blueprint_storage.rs b/etherlink/kernel_evm/kernel/src/blueprint_storage.rs index 690213da5cc76604943d33287b55c7280995726a..983e11fc98660a5a7f4919589c05e2f09ee72656 100644 --- a/etherlink/kernel_evm/kernel/src/blueprint_storage.rs +++ b/etherlink/kernel_evm/kernel/src/blueprint_storage.rs @@ -473,7 +473,7 @@ pub fn drop_blueprint(host: &mut Host, number: U256) -> Result<() host.store_delete(&path).map_err(Error::from) } -pub fn clear_all_blueprint(host: &mut Host) -> Result<(), Error> { +pub fn clear_all_blueprints(host: &mut Host) -> Result<(), Error> { if host.store_has(&EVM_BLUEPRINTS)?.is_some() { Ok(host.store_delete(&EVM_BLUEPRINTS)?) } else { diff --git a/etherlink/kernel_evm/kernel/src/migration.rs b/etherlink/kernel_evm/kernel/src/migration.rs index ec623aaaccb101d88e8fae38e55fee5e4cf047c3..5dc1766596f2bb129e6dc41a3016248c793d2b39 100644 --- a/etherlink/kernel_evm/kernel/src/migration.rs +++ b/etherlink/kernel_evm/kernel/src/migration.rs @@ -5,6 +5,9 @@ // SPDX-License-Identifier: MIT use crate::block_storage; +use crate::blueprint_storage::{ + blueprint_path, clear_all_blueprints, read_next_blueprint_number, +}; use crate::error::Error; use crate::error::StorageError; use crate::error::UpgradeProcessError; @@ -63,6 +66,9 @@ fn allow_path_not_found(res: Result<(), RuntimeError>) -> Result<(), RuntimeErro } } +const TMP_NEXT_BLUEPRINT_PATH: RefPath = + RefPath::assert_from(b"/__tmp_next_blueprint_path"); + fn migrate_to( host: &mut Host, version: StorageVersion, @@ -184,6 +190,27 @@ fn migrate_to( Ok(MigrationStatus::None) } } + StorageVersion::V23 => { + // Clear all the blueprints, we accumulated a lot of old + // blueprints without cleaning them. + // + // As we remove everything that means the sequencer will + // have to republish some. + // + // However we need to keep the next blueprint as it + // trigerred the upgrade. + + let next_blueprint_number = read_next_blueprint_number(host)?; + let blueprint_path = blueprint_path(next_blueprint_number)?; + allow_path_not_found( + host.store_move(&blueprint_path, &TMP_NEXT_BLUEPRINT_PATH), + )?; + clear_all_blueprints(host)?; + allow_path_not_found( + host.store_move(&TMP_NEXT_BLUEPRINT_PATH, &blueprint_path), + )?; + Ok(MigrationStatus::Done) + } } } diff --git a/etherlink/kernel_evm/kernel/src/storage.rs b/etherlink/kernel_evm/kernel/src/storage.rs index 4b67610545b37539583895ae4b90bae91aa241d7..e4e40e1d2a984255cc2ae58fc2d479bd9fe447fd 100644 --- a/etherlink/kernel_evm/kernel/src/storage.rs +++ b/etherlink/kernel_evm/kernel/src/storage.rs @@ -55,6 +55,7 @@ pub enum StorageVersion { V20, V21, V22, + V23, } impl From for u64 { @@ -69,7 +70,7 @@ impl StorageVersion { } } -pub const STORAGE_VERSION: StorageVersion = StorageVersion::V22; +pub const STORAGE_VERSION: StorageVersion = StorageVersion::V23; pub const PRIVATE_FLAG_PATH: RefPath = RefPath::assert_from(b"/evm/remove_whitelist"); diff --git a/etherlink/kernel_evm/kernel/src/upgrade.rs b/etherlink/kernel_evm/kernel/src/upgrade.rs index 32f69aa0ed42aaf1853e2c284839c659bf5cbfdf..90c413ff4f09414aba1aaf040cf26fec046f20e3 100644 --- a/etherlink/kernel_evm/kernel/src/upgrade.rs +++ b/etherlink/kernel_evm/kernel/src/upgrade.rs @@ -236,7 +236,7 @@ pub fn possible_sequencer_upgrade(host: &mut Host) -> anyhow::Res let ipl_timestamp = storage::read_last_info_per_level_timestamp(host)?; if ipl_timestamp >= upgrade.activation_timestamp { sequencer_upgrade(host, upgrade.pool_address, &upgrade.sequencer)?; - blueprint_storage::clear_all_blueprint(host)?; + blueprint_storage::clear_all_blueprints(host)?; } } Ok(()) diff --git a/etherlink/kernel_evm/kernel/tests/resources/failed_migration.wasm b/etherlink/kernel_evm/kernel/tests/resources/failed_migration.wasm index f1b329a883f469906e9c65c7e62851af3fb4f37e..9fed3bc1d485aa954cb7bf8f0746e7295e7e1f48 100755 Binary files a/etherlink/kernel_evm/kernel/tests/resources/failed_migration.wasm and b/etherlink/kernel_evm/kernel/tests/resources/failed_migration.wasm differ diff --git a/etherlink/tezt/tests/evm_sequencer.ml b/etherlink/tezt/tests/evm_sequencer.ml index c7c1759a3dbc9951f2a50563acf32d2916b868ab..77063f414bb260c8a44e6d442590aa80385dc39f 100644 --- a/etherlink/tezt/tests/evm_sequencer.ml +++ b/etherlink/tezt/tests/evm_sequencer.ml @@ -2790,9 +2790,8 @@ let test_upgrade_kernel_auto_sync = node and the sequencer will upgrade to debug kernel and therefore not produce the block. *) let* _ = - repeat 2 (fun () -> - let*@ _ = produce_block ~timestamp:"2020-01-01T00:00:15Z" sequencer in - unit) + let*@ _ = produce_block ~timestamp:"2020-01-01T00:00:15Z" sequencer in + unit and* _upgrade = Evm_node.wait_for_successful_upgrade sequencer in let* () = bake_until_sync ~sc_rollup_node ~client ~sequencer ~proxy () in @@ -2819,7 +2818,7 @@ let test_upgrade_kernel_auto_sync = let* () = Evm_node.run observer in let* _upgrade = Evm_node.wait_for_successful_upgrade observer in - let* () = Evm_node.wait_for_blueprint_applied observer 4 in + let* () = Evm_node.wait_for_blueprint_applied observer 3 in let* () = check_head_consistency