From c11cd3c88dbbe024bb8d09782178aef1810c946a Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Wed, 5 Jun 2024 18:06:03 +0200 Subject: [PATCH 1/3] EVM/Kernel: move /evm/ticketer to /evm/world_state/ticketer --- etherlink/bin_node/lib_dev/kernel_config.ml | 3 +- etherlink/kernel_evm/kernel/src/migration.rs | 7 +++- etherlink/kernel_evm/kernel/src/storage.rs | 2 +- etherlink/scripts/docker-compose/init.sh | 2 +- etherlink/tezt/tests/evm_rollup.ml | 34 +++++++++++++++++++- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/etherlink/bin_node/lib_dev/kernel_config.ml b/etherlink/bin_node/lib_dev/kernel_config.ml index a48a2feab75e..5ea51368d0f0 100644 --- a/etherlink/bin_node/lib_dev/kernel_config.ml +++ b/etherlink/bin_node/lib_dev/kernel_config.ml @@ -47,7 +47,8 @@ let make ~boostrap_balance ?bootstrap_accounts ?kernel_root_hash ?chain_id ~convert:(fun s -> Hex.to_bytes_exn (`Hex s) |> Bytes.to_string) kernel_root_hash @ make_instr ~convert:parse_z_to_padded_32_le_int_bytes chain_id - @ make_instr sequencer @ make_instr delayed_bridge @ make_instr ticketer + @ make_instr sequencer @ make_instr delayed_bridge + @ make_instr ~path_prefix:"/evm/world_state/" ticketer @ make_instr admin @ make_instr sequencer_governance @ make_instr kernel_governance diff --git a/etherlink/kernel_evm/kernel/src/migration.rs b/etherlink/kernel_evm/kernel/src/migration.rs index 0e04ec2f4a74..ee461200f40e 100644 --- a/etherlink/kernel_evm/kernel/src/migration.rs +++ b/etherlink/kernel_evm/kernel/src/migration.rs @@ -8,8 +8,9 @@ use crate::error::Error; use crate::error::UpgradeProcessError::Fallback; use crate::storage::{ read_chain_id, read_storage_version, store_sequencer_pool_address, - store_storage_version, STORAGE_VERSION, + store_storage_version, STORAGE_VERSION, TICKETER, }; +use tezos_smart_rollup_host::path::RefPath; use tezos_smart_rollup_host::runtime::{Runtime, RuntimeError}; use primitive_types::H160; @@ -64,6 +65,10 @@ fn migration(host: &mut Host) -> anyhow::Result let address = H160::from_str("CF02B9Ca488f8F6F4E28e37AA1bDD16b3F1b2aD8")?; store_sequencer_pool_address(host, address)?; }; + let legacy_ticketer_path = RefPath::assert_from(b"/evm/ticketer"); + if host.store_has(&legacy_ticketer_path)?.is_some() { + host.store_move(&legacy_ticketer_path, &TICKETER)?; + } // MIGRATION CODE - END store_storage_version(host, STORAGE_VERSION)?; return Ok(MigrationStatus::Done); diff --git a/etherlink/kernel_evm/kernel/src/storage.rs b/etherlink/kernel_evm/kernel/src/storage.rs index 570c8b1c33bd..9a66b41a4b9a 100644 --- a/etherlink/kernel_evm/kernel/src/storage.rs +++ b/etherlink/kernel_evm/kernel/src/storage.rs @@ -40,7 +40,7 @@ pub const STORAGE_VERSION_PATH: RefPath = RefPath::assert_from(b"/evm/storage_ve const KERNEL_VERSION_PATH: RefPath = RefPath::assert_from(b"/evm/kernel_version"); -const TICKETER: RefPath = RefPath::assert_from(b"/evm/ticketer"); +pub const TICKETER: RefPath = RefPath::assert_from(b"/evm/world_state/ticketer"); pub const ADMIN: RefPath = RefPath::assert_from(b"/evm/admin"); pub const SEQUENCER_GOVERNANCE: RefPath = RefPath::assert_from(b"/evm/sequencer_governance"); diff --git a/etherlink/scripts/docker-compose/init.sh b/etherlink/scripts/docker-compose/init.sh index ca52a4aaaa42..5f9283ce2b46 100755 --- a/etherlink/scripts/docker-compose/init.sh +++ b/etherlink/scripts/docker-compose/init.sh @@ -68,7 +68,7 @@ create_kernel_config() { add_kernel_config_set "$file" /evm/chain_id "${evm_chain_id}" "Chain ID: ${EVM_CHAIN_ID}" # ticketer config - add_kernel_config_contract "$file" /evm/ticketer "${BRIDGE_ALIAS}" "BRIDGE" + add_kernel_config_contract "$file" /evm/world_state/ticketer "${BRIDGE_ALIAS}" "BRIDGE" # evm admin config add_kernel_config_contract "$file" /evm/admin "${EVM_ADMIN_ALIAS}_contract" "ADMIN" diff --git a/etherlink/tezt/tests/evm_rollup.ml b/etherlink/tezt/tests/evm_rollup.ml index 10a95d449bca..aea69b0d7b55 100644 --- a/etherlink/tezt/tests/evm_rollup.ml +++ b/etherlink/tezt/tests/evm_rollup.ml @@ -2865,7 +2865,7 @@ let gen_kernel_migration_test ?bootstrap_accounts ?(admin = Constant.bootstrap5) let test_kernel_migration = Protocol.register_test ~__FILE__ - ~tags:["evm"; "migration"; "upgrade"] + ~tags:["evm"; "migration"; "upgrade"; "foo"] ~uses:(fun _protocol -> [ Constant.octez_smart_rollup_node; @@ -2889,9 +2889,41 @@ let test_kernel_migration = in let*@ block_result = latest_block evm_setup.evm_node in let* config_result = config_setup evm_setup in + let* ticketer = + Sc_rollup_node.RPC.call evm_setup.sc_rollup_node + @@ Sc_rollup_rpc.get_global_block_durable_state_value + ~pvm_kind:"wasm_2_0_0" + ~operation:Sc_rollup_rpc.Value + ~key:"/evm/ticketer" + () + in + let ticketer = Option.value ~default:"none ticketer" ticketer in + Log.info "Ticketer before: %s" ticketer ; return {transfer_result; block_result; config_result} in let scenario_after ~evm_setup ~sanity_check = + let* ticketer = + Sc_rollup_node.RPC.call evm_setup.sc_rollup_node + @@ Sc_rollup_rpc.get_global_block_durable_state_value + ~pvm_kind:"wasm_2_0_0" + ~operation:Sc_rollup_rpc.Value + ~key:"/evm/ticketer" + () + in + let ticketer = Option.value ~default:"none ticketer" ticketer in + Log.info "Ticketer after prev path: %s" ticketer ; + + let* ticketer = + Sc_rollup_node.RPC.call evm_setup.sc_rollup_node + @@ Sc_rollup_rpc.get_global_block_durable_state_value + ~pvm_kind:"wasm_2_0_0" + ~operation:Sc_rollup_rpc.Value + ~key:"/evm/world_state/ticketer" + () + in + let ticketer = Option.value ~default:"none ticketer" ticketer in + Log.info "Ticketer after new path: %s" ticketer ; + let* () = ensure_transfer_result_integrity ~sender -- GitLab From ebb3b53925e9c74ed480fdadaa7b43951eccaea1 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 6 Jun 2024 09:44:44 +0200 Subject: [PATCH 2/3] EVM/Tezt: test migration Co-authored-by: Sylvain R. --- etherlink/bin_node/main.ml | 74 ++++++++++++++++++++---------- etherlink/tezt/lib/evm_node.ml | 9 ++-- etherlink/tezt/lib/evm_node.mli | 1 + etherlink/tezt/tests/evm_rollup.ml | 47 ++++++++++++++----- 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/etherlink/bin_node/main.ml b/etherlink/bin_node/main.ml index 767a6970a47f..8923f31e0085 100644 --- a/etherlink/bin_node/main.ml +++ b/etherlink/bin_node/main.ml @@ -1538,7 +1538,8 @@ let make_kernel_config_command = let open Lwt_result_syntax in command ~desc:"Transforms the JSON list of instructions to a RLP list" - (args19 + (args20 + devmode_arg (config_key_arg ~name:"kernel_root_hash" ~placeholder:"root hash") (config_key_arg ~name:"chain_id" ~placeholder:"chain id") (config_key_arg ~name:"sequencer" ~placeholder:"edpk...") @@ -1571,7 +1572,8 @@ let make_kernel_config_command = ~desc:"file path where the config will be written to" Params.string @@ stop) - (fun ( kernel_root_hash, + (fun ( devmode, + kernel_root_hash, chain_id, sequencer, delayed_bridge, @@ -1592,28 +1594,52 @@ let make_kernel_config_command = bootstrap_accounts ) output () -> - Evm_node_lib_dev.Kernel_config.make - ?kernel_root_hash - ?chain_id - ?sequencer - ?delayed_bridge - ?ticketer - ?admin - ?sequencer_governance - ?kernel_governance - ?kernel_security_governance - ?minimum_base_fee_per_gas - ?da_fee_per_byte - ?delayed_inbox_timeout - ?delayed_inbox_min_levels - ?sequencer_pool_address - ?maximum_allowed_ticks - ?maximum_gas_per_transaction - ?remove_whitelist - ~boostrap_balance - ?bootstrap_accounts - ~output - ()) + if devmode then + Evm_node_lib_dev.Kernel_config.make + ?kernel_root_hash + ?chain_id + ?sequencer + ?delayed_bridge + ?ticketer + ?admin + ?sequencer_governance + ?kernel_governance + ?kernel_security_governance + ?minimum_base_fee_per_gas + ?da_fee_per_byte + ?delayed_inbox_timeout + ?delayed_inbox_min_levels + ?sequencer_pool_address + ?maximum_allowed_ticks + ?maximum_gas_per_transaction + ?remove_whitelist + ~boostrap_balance + ?bootstrap_accounts + ~output + () + else + Evm_node_lib_prod.Kernel_config.make + ?kernel_root_hash + ?chain_id + ?sequencer + ?delayed_bridge + ?ticketer + ?admin + ?sequencer_governance + ?kernel_governance + ?kernel_security_governance + ?minimum_base_fee_per_gas + ?da_fee_per_byte + ?delayed_inbox_timeout + ?delayed_inbox_min_levels + ?sequencer_pool_address + ?maximum_allowed_ticks + ?maximum_gas_per_transaction + ?remove_whitelist + ~boostrap_balance + ?bootstrap_accounts + ~output + ()) let proxy_simple_command = let open Tezos_clic in diff --git a/etherlink/tezt/lib/evm_node.ml b/etherlink/tezt/lib/evm_node.ml index b0b3c7ffc5ff..940437ddeab9 100644 --- a/etherlink/tezt/lib/evm_node.ml +++ b/etherlink/tezt/lib/evm_node.ml @@ -981,10 +981,10 @@ let wait_termination (evm_node : t) = let* _status = Process.wait process in unit -let make_kernel_installer_config ?(remove_whitelist = false) ?kernel_root_hash - ?chain_id ?bootstrap_balance ?bootstrap_accounts ?sequencer ?delayed_bridge - ?ticketer ?administrator ?sequencer_governance ?kernel_governance - ?kernel_security_governance ?minimum_base_fee_per_gas +let make_kernel_installer_config ?(devmode = true) ?(remove_whitelist = false) + ?kernel_root_hash ?chain_id ?bootstrap_balance ?bootstrap_accounts + ?sequencer ?delayed_bridge ?ticketer ?administrator ?sequencer_governance + ?kernel_governance ?kernel_security_governance ?minimum_base_fee_per_gas ?(da_fee_per_byte = Wei.zero) ?delayed_inbox_timeout ?delayed_inbox_min_levels ?sequencer_pool_address ?maximum_allowed_ticks ?maximum_gas_per_transaction ~output () = @@ -1029,6 +1029,7 @@ let make_kernel_installer_config ?(remove_whitelist = false) ?kernel_root_hash Int64.to_string maximum_gas_per_transaction @ Cli_arg.optional_arg "bootstrap-balance" Wei.to_string bootstrap_balance + @ Cli_arg.optional_switch "devmode" devmode @ match bootstrap_accounts with | None -> [] diff --git a/etherlink/tezt/lib/evm_node.mli b/etherlink/tezt/lib/evm_node.mli index 4fd719bb7a2c..5e0f801713c4 100644 --- a/etherlink/tezt/lib/evm_node.mli +++ b/etherlink/tezt/lib/evm_node.mli @@ -359,6 +359,7 @@ val wait_termination : t -> unit Lwt.t (** [make_kernel_installer_config ~output ()] create the config needed for the evm kernel used by the installer *) val make_kernel_installer_config : + ?devmode:bool -> ?remove_whitelist:bool -> ?kernel_root_hash:string -> ?chain_id:int -> diff --git a/etherlink/tezt/tests/evm_rollup.ml b/etherlink/tezt/tests/evm_rollup.ml index aea69b0d7b55..0f35e770edf2 100644 --- a/etherlink/tezt/tests/evm_rollup.ml +++ b/etherlink/tezt/tests/evm_rollup.ml @@ -279,7 +279,8 @@ type setup_mode = } | Setup_proxy of {devmode : bool} -let setup_evm_kernel ?additional_config ?(setup_kernel_root_hash = true) +let setup_evm_kernel ?devmode ?additional_config + ?(setup_kernel_root_hash = true) ?(kernel_installee = Constant.WASM.evm_kernel) ?(originator_key = Constant.bootstrap1.public_key_hash) ?(rollup_operator_key = Constant.bootstrap1.public_key_hash) @@ -337,6 +338,7 @@ let setup_evm_kernel ?additional_config ?(setup_kernel_root_hash = true) let*! () = Evm_node.make_kernel_installer_config ~remove_whitelist:Option.(is_some whitelist) + ?devmode ?kernel_root_hash ~bootstrap_accounts ?da_fee_per_byte @@ -2359,8 +2361,8 @@ let get_kernel_boot_wasm ~sc_rollup_node = | Some boot_wasm -> return boot_wasm | None -> failwith "Kernel `boot.wasm` should be accessible/readable." -let gen_test_kernel_upgrade ?setup_kernel_root_hash ?admin_contract ?timestamp - ?(activation_timestamp = "0") ?evm_setup ?rollup_address +let gen_test_kernel_upgrade ?devmode ?setup_kernel_root_hash ?admin_contract + ?timestamp ?(activation_timestamp = "0") ?evm_setup ?rollup_address ?(should_fail = false) ~installee ?with_administrator ?expect_l1_failure ?(admin = Constant.bootstrap1) ?(upgrador = admin) protocol = let* { @@ -2376,6 +2378,7 @@ let gen_test_kernel_upgrade ?setup_kernel_root_hash ?admin_contract ?timestamp | Some evm_setup -> return evm_setup | None -> setup_evm_kernel + ?devmode ?setup_kernel_root_hash ?timestamp ?with_administrator @@ -2821,6 +2824,7 @@ let gen_kernel_migration_test ?bootstrap_accounts ?(admin = Constant.bootstrap5) ~scenario_prior ~scenario_after protocol = let* evm_setup = setup_evm_kernel + ~devmode:false ?bootstrap_accounts ~da_fee_per_byte:Wei.zero ~minimum_base_fee_per_gas:(Wei.of_string "21000") @@ -2865,7 +2869,7 @@ let gen_kernel_migration_test ?bootstrap_accounts ?(admin = Constant.bootstrap5) let test_kernel_migration = Protocol.register_test ~__FILE__ - ~tags:["evm"; "migration"; "upgrade"; "foo"] + ~tags:["evm"; "migration"; "upgrade"] ~uses:(fun _protocol -> [ Constant.octez_smart_rollup_node; @@ -2879,6 +2883,12 @@ let test_kernel_migration = let sender, receiver = (Eth_account.bootstrap_accounts.(0), Eth_account.bootstrap_accounts.(1)) in + let expected_ticketer evm_setup = + match evm_setup.l1_contracts with + | Some {exchanger; _} -> exchanger + | None -> Test.fail "The test needs a ticketer" + in + let scenario_prior ~evm_setup = let* transfer_result = make_transfer @@ -2889,6 +2899,7 @@ let test_kernel_migration = in let*@ block_result = latest_block evm_setup.evm_node in let* config_result = config_setup evm_setup in + let expected_ticketer = expected_ticketer evm_setup in let* ticketer = Sc_rollup_node.RPC.call evm_setup.sc_rollup_node @@ Sc_rollup_rpc.get_global_block_durable_state_value @@ -2897,12 +2908,16 @@ let test_kernel_migration = ~key:"/evm/ticketer" () in - let ticketer = Option.value ~default:"none ticketer" ticketer in - Log.info "Ticketer before: %s" ticketer ; + let ticketer = + Option.map (fun ticketer -> Hex.to_string (`Hex ticketer)) ticketer + in + Check.((Some expected_ticketer = ticketer) (option string)) + ~error_msg:"Ticketer not found at /evm/ticketer" ; return {transfer_result; block_result; config_result} in let scenario_after ~evm_setup ~sanity_check = - let* ticketer = + let expected_ticketer = expected_ticketer evm_setup in + let* evm_ticketer = Sc_rollup_node.RPC.call evm_setup.sc_rollup_node @@ Sc_rollup_rpc.get_global_block_durable_state_value ~pvm_kind:"wasm_2_0_0" @@ -2910,10 +2925,13 @@ let test_kernel_migration = ~key:"/evm/ticketer" () in - let ticketer = Option.value ~default:"none ticketer" ticketer in - Log.info "Ticketer after prev path: %s" ticketer ; + let evm_ticketer = + Option.map (fun ticketer -> Hex.to_string (`Hex ticketer)) evm_ticketer + in + Check.((None = evm_ticketer) (option string)) + ~error_msg:"/evm/ticketer should be none after migration" ; - let* ticketer = + let* evm_world_state_ticketer = Sc_rollup_node.RPC.call evm_setup.sc_rollup_node @@ Sc_rollup_rpc.get_global_block_durable_state_value ~pvm_kind:"wasm_2_0_0" @@ -2921,8 +2939,13 @@ let test_kernel_migration = ~key:"/evm/world_state/ticketer" () in - let ticketer = Option.value ~default:"none ticketer" ticketer in - Log.info "Ticketer after new path: %s" ticketer ; + let evm_world_state_ticketer = + Option.map + (fun ticketer -> Hex.to_string (`Hex ticketer)) + evm_world_state_ticketer + in + Check.((Some expected_ticketer = evm_world_state_ticketer) (option string)) + ~error_msg:"Ticketer not found at /evm/world_state/ticketer" ; let* () = ensure_transfer_result_integrity -- GitLab From fbaf4014e5657bdd21ef304861bcd7cc9b3e3c23 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 6 Jun 2024 13:46:35 +0200 Subject: [PATCH 3/3] EVM/Tezt: remove dailynet test Bwarf --- etherlink/tezt/tests/evm_rollup.ml | 117 ----------------------------- 1 file changed, 117 deletions(-) diff --git a/etherlink/tezt/tests/evm_rollup.ml b/etherlink/tezt/tests/evm_rollup.ml index 0f35e770edf2..ad05f38e09d2 100644 --- a/etherlink/tezt/tests/evm_rollup.ml +++ b/etherlink/tezt/tests/evm_rollup.ml @@ -2963,122 +2963,6 @@ let test_kernel_migration = in gen_kernel_migration_test ~scenario_prior ~scenario_after protocol -let test_deposit_dailynet = - Protocol.register_test - ~__FILE__ - ~tags:["evm"; "deposit"; "dailynet"] - ~uses:(fun _protocol -> - Constant. - [ - octez_smart_rollup_node; - smart_rollup_installer; - octez_evm_node; - Constant.WASM.evm_kernel; - ]) - ~title:"deposit on dailynet" - @@ fun protocol -> - let bridge_address = "KT1QwBaLj5TRaGU3qkU4ZKKQ5mvNvyyzGBFv" in - let exchanger_address = "KT1FHqsvc7vRS3u54L66DdMX4gb6QKqxJ1JW" in - let rollup_address = "sr1RYurGZtN8KNSpkMcCt9CgWeUaNkzsAfXf" in - - let mockup_client = Client.create_with_mode Mockup in - let make_bootstrap_contract ~address ~code ~storage ?typecheck () = - let* code_json = Client.convert_script_to_json ~script:code mockup_client in - let* storage_json = - Client.convert_data_to_json ~data:storage ?typecheck mockup_client - in - let script : Ezjsonm.value = - `O [("code", code_json); ("storage", storage_json)] - in - return - Protocol. - {delegate = None; amount = Tez.of_int 0; script; hash = Some address} - in - - (* Creates the exchanger contract. *) - let* exchanger_contract = - make_bootstrap_contract - ~address:exchanger_address - ~code:(exchanger_path ()) - ~storage:"Unit" - () - in - (* Creates the bridge contract initialized with exchanger contract. *) - let* bridge_contract = - make_bootstrap_contract - ~address:bridge_address - ~code:(bridge_path ()) - ~storage:(sf "Pair %S None" exchanger_address) - () - in - - (* Creates the EVM rollup that listens to the bootstrap smart contract exchanger. *) - let* { - bootstrap_smart_rollup = evm; - smart_rollup_node_data_dir; - smart_rollup_node_extra_args; - } = - setup_bootstrap_smart_rollup - ~name:"evm" - ~address:rollup_address - ~parameters_ty:evm_type - ~installee:Constant.WASM.evm_kernel - ~config:(`Path Base.(project_root // "etherlink/config/dailynet.yaml")) - () - in - - (* Setup a chain where the EVM rollup, the exchanger contract and the bridge - are all originated. *) - let* node, client = - setup_l1 - ~bootstrap_smart_rollups:[evm] - ~bootstrap_contracts:[exchanger_contract; bridge_contract] - protocol - in - - let sc_rollup_node = - Sc_rollup_node.create - Operator - node - ~data_dir:smart_rollup_node_data_dir - ~base_dir:(Client.base_dir client) - ~default_operator:Constant.bootstrap1.public_key_hash - in - let* () = Client.bake_for_and_wait ~keys:[] client in - - let* () = - Sc_rollup_node.run - sc_rollup_node - rollup_address - smart_rollup_node_extra_args - in - - let* evm_node = - Evm_node.init - ~mode:(Proxy {devmode = true}) - (Sc_rollup_node.endpoint sc_rollup_node) - in - let endpoint = Evm_node.endpoint evm_node in - - (* Deposit tokens to the EVM rollup. *) - let amount_mutez = Tez.of_mutez_int 100_000_000 in - let receiver = "0x119811f34EF4491014Fbc3C969C426d37067D6A4" in - - let* () = - deposit - ~amount_mutez - ~bridge:bridge_address - ~depositor:Constant.bootstrap2 - ~receiver - ~evm_node - ~sc_rollup_node - ~sc_rollup_address:rollup_address - client - in - - (* Check the balance in the EVM rollup. *) - check_balance ~receiver ~endpoint amount_mutez - let test_cannot_prepayed_leads_to_no_inclusion = register_both ~tags:["evm"; "prepay"; "inclusion"] @@ -5843,7 +5727,6 @@ let register_evm_node ~protocols = test_kernel_upgrade_via_governance protocols ; test_kernel_upgrade_via_kernel_security_governance protocols ; test_rpc_sendRawTransaction protocols ; - test_deposit_dailynet protocols ; test_cannot_prepayed_leads_to_no_inclusion protocols ; test_cannot_prepayed_with_delay_leads_to_no_injection protocols ; test_rpc_sendRawTransaction_nonce_too_low protocols ; -- GitLab