diff --git a/etherlink/CHANGES_KERNEL.md b/etherlink/CHANGES_KERNEL.md index 7c2200fdfe0947d29176016233a51ae1108d6c79..8b74badb8e566f767dda477e5b19b5be70ac41c4 100644 --- a/etherlink/CHANGES_KERNEL.md +++ b/etherlink/CHANGES_KERNEL.md @@ -43,6 +43,12 @@ versions. (!13895) - Add FA withdrawal execution methods and FA bridge precompile. (!13941) +- A DAL feature flag is added to the configuration. If the path has a + value in `/evm/feature_flags/enable_dal`, the kernel is allowed to + import data from the DAL. (!13634) + +- The list of DAL slot indices on which the sequencer may publish DAL slots can be configured at path `/evm/dal_slots`. (!13717) + ## Version ec7c3b349624896b269e179384d0a45cf39e1145 ### Features diff --git a/etherlink/bin_node/lib_dev/kernel_config.ml b/etherlink/bin_node/lib_dev/kernel_config.ml index 317d0713a61c762dd11c2c239ea3191225009b8f..a4d1a0aae87f5a4674923fa8d82ee887d369da07 100644 --- a/etherlink/bin_node/lib_dev/kernel_config.ml +++ b/etherlink/bin_node/lib_dev/kernel_config.ml @@ -24,7 +24,7 @@ let make ~mainnet_compat ~boostrap_balance ?bootstrap_accounts ?kernel_root_hash ?da_fee_per_byte ?delayed_inbox_timeout ?delayed_inbox_min_levels ?sequencer_pool_address ?maximum_allowed_ticks ?maximum_gas_per_transaction ?max_blueprint_lookahead_in_seconds ?remove_whitelist ?enable_fa_bridge - ?enable_dal ~output () = + ?enable_dal ?dal_slots ~output () = let bootstrap_accounts = match bootstrap_accounts with | None -> [] @@ -43,6 +43,13 @@ let make ~mainnet_compat ~boostrap_balance ?bootstrap_accounts ?kernel_root_hash Bytes.set_int64_le b 0 (Int64.of_string i) ; String.of_bytes b in + (* Convert a comma-separated list of decimal values in the [0; 255] + range into a sequence of bytes (of type string). *) + let decimal_list_to_bytes l = + l |> String.split ',' |> List.to_seq + |> Seq.map (fun s -> Char.chr (int_of_string s)) + |> String.of_seq + in let instrs = (if mainnet_compat then make_instr ~path_prefix:"/evm/" ticketer else @@ -78,5 +85,6 @@ let make ~mainnet_compat ~boostrap_balance ?bootstrap_accounts ?kernel_root_hash @ make_instr remove_whitelist @ make_instr ~path_prefix:"/evm/feature_flags/" enable_fa_bridge @ make_instr ~path_prefix:"/evm/feature_flags/" enable_dal + @ make_instr ~convert:decimal_list_to_bytes dal_slots in Installer_config.to_file instrs ~output diff --git a/etherlink/bin_node/lib_dev/kernel_config.mli b/etherlink/bin_node/lib_dev/kernel_config.mli index d8f5e0c5f813ec8a467cedd3c6894be1e628658b..e8f35e342cb61eb10e85c3881902c57e2e6ad4ce 100644 --- a/etherlink/bin_node/lib_dev/kernel_config.mli +++ b/etherlink/bin_node/lib_dev/kernel_config.mli @@ -32,6 +32,7 @@ val make : ?remove_whitelist:string * string -> ?enable_fa_bridge:string * string -> ?enable_dal:string * string -> + ?dal_slots:string * string -> output:string -> unit -> unit tzresult Lwt.t diff --git a/etherlink/bin_node/main.ml b/etherlink/bin_node/main.ml index e28fbb59bfb59693d8c8fbceeb3377b1555528e9..9c8b2471d5e72c941a4198b1d745225ae0159536 100644 --- a/etherlink/bin_node/main.ml +++ b/etherlink/bin_node/main.ml @@ -1478,7 +1478,7 @@ let make_kernel_config_command = let open Lwt_result_syntax in command ~desc:"Transforms the JSON list of instructions to a RLP list" - (args23 + (args24 mainnet_compat_arg (config_key_arg ~name:"kernel_root_hash" ~placeholder:"root hash") (config_key_arg ~name:"chain_id" ~placeholder:"chain id") @@ -1510,7 +1510,8 @@ let make_kernel_config_command = @@ Tezos_clic.parameter (fun _ s -> return @@ Z.of_string s)) bootstrap_account_arg (config_key_flag ~name:"enable_fa_bridge") - (config_key_flag ~name:"enable_dal")) + (config_key_flag ~name:"enable_dal") + (config_key_arg ~name:"dal_slots" ~placeholder:"0,1,4,6,...")) (prefixes ["make"; "kernel"; "installer"; "config"] @@ param ~name:"kernel config file" @@ -1539,7 +1540,8 @@ let make_kernel_config_command = boostrap_balance, bootstrap_accounts, enable_fa_bridge, - enable_dal ) + enable_dal, + dal_slots ) output () -> Evm_node_lib_dev.Kernel_config.make @@ -1566,6 +1568,7 @@ let make_kernel_config_command = ?bootstrap_accounts ?enable_fa_bridge ?enable_dal + ?dal_slots ~output ()) diff --git a/etherlink/kernel_evm/kernel/src/blueprint_storage.rs b/etherlink/kernel_evm/kernel/src/blueprint_storage.rs index b898a93aedb81b34ccf170e59647c19e3e5b7453..d210ddc9cd04c6cd4d9c601fec7e7a3b35fe0737 100644 --- a/etherlink/kernel_evm/kernel/src/blueprint_storage.rs +++ b/etherlink/kernel_evm/kernel/src/blueprint_storage.rs @@ -478,7 +478,7 @@ pub fn clear_all_blueprint(host: &mut Host) -> Result<(), Error> mod tests { use super::*; - use crate::configuration::{Limits, TezosContracts}; + use crate::configuration::{DalConfiguration, Limits, TezosContracts}; use crate::delayed_inbox::Hash; use crate::sequencer_blueprint::UnsignedSequencerBlueprint; use crate::storage::store_last_info_per_level_timestamp; @@ -501,13 +501,20 @@ mod tests { "edpkuDMUm7Y53wp4gxeLBXuiAhXZrLn8XB1R83ksvvesH8Lp8bmCfK", ) .unwrap(); + let dal = if enable_dal { + Some(DalConfiguration { + slot_indices: vec![5], + }) + } else { + None + }; let mut config = Configuration { tezos_contracts: TezosContracts::default(), mode: ConfigurationMode::Sequencer { delayed_bridge, delayed_inbox: Box::new(delayed_inbox), sequencer, - enable_dal, + dal, evm_node_flag: false, max_blueprint_lookahead_in_seconds: 100_000i64, }, diff --git a/etherlink/kernel_evm/kernel/src/configuration.rs b/etherlink/kernel_evm/kernel/src/configuration.rs index 95c4eeaea483c6b61f6cbbd01b924782b8f142e5..fbfd79f46e34c4f12ebd3e3a75fe1330a05e546c 100644 --- a/etherlink/kernel_evm/kernel/src/configuration.rs +++ b/etherlink/kernel_evm/kernel/src/configuration.rs @@ -2,7 +2,7 @@ use crate::{ blueprint_storage::DEFAULT_MAX_BLUEPRINT_LOOKAHEAD_IN_SECONDS, delayed_inbox::DelayedInbox, storage::{ - enable_dal, evm_node_flag, is_enable_fa_bridge, + dal_slots, enable_dal, evm_node_flag, is_enable_fa_bridge, max_blueprint_lookahead_in_seconds, read_admin, read_delayed_transaction_bridge, read_kernel_governance, read_kernel_security_governance, read_maximum_allowed_ticks, read_maximum_gas_per_transaction, @@ -16,13 +16,18 @@ use tezos_evm_logging::{log, Level::*}; use tezos_smart_rollup_debug::Runtime; use tezos_smart_rollup_encoding::public_key::PublicKey; +#[derive(Debug, Clone, Default)] +pub struct DalConfiguration { + pub slot_indices: Vec, +} + pub enum ConfigurationMode { Proxy, Sequencer { delayed_bridge: ContractKt1Hash, delayed_inbox: Box, sequencer: PublicKey, - enable_dal: bool, + dal: Option, evm_node_flag: bool, max_blueprint_lookahead_in_seconds: i64, }, @@ -36,13 +41,13 @@ impl std::fmt::Display for ConfigurationMode { delayed_bridge, delayed_inbox: _, // Ignoring delayed_inbox sequencer, - enable_dal, + dal, evm_node_flag, max_blueprint_lookahead_in_seconds, } => write!( f, - "Sequencer {{ delayed_bridge: {:?}, sequencer: {:?}, enable_dal: {}, evm_node_flag: {}, max_blueprints_lookahead_in_seconds: {} }}", - delayed_bridge, sequencer, enable_dal, evm_node_flag, max_blueprint_lookahead_in_seconds + "Sequencer {{ delayed_bridge: {:?}, sequencer: {:?}, dal: {:?}, evm_node_flag: {}, max_blueprints_lookahead_in_seconds: {} }}", + delayed_bridge, sequencer, dal, evm_node_flag, max_blueprint_lookahead_in_seconds ), } } @@ -177,12 +182,22 @@ pub fn fetch_limits(host: &mut impl Runtime) -> Limits { } } +fn fetch_dal_configuration(host: &mut Host) -> Option { + let enable_dal = enable_dal(host).unwrap_or(false); + if enable_dal { + let slot_indices: Vec = dal_slots(host).unwrap_or(None)?; + Some(DalConfiguration { slot_indices }) + } else { + None + } +} + pub fn fetch_configuration(host: &mut Host) -> Configuration { let tezos_contracts = fetch_tezos_contracts(host); let limits = fetch_limits(host); let sequencer = sequencer(host).unwrap_or_default(); let enable_fa_bridge = is_enable_fa_bridge(host).unwrap_or_default(); - let enable_dal = enable_dal(host).unwrap_or(false); + let dal: Option = fetch_dal_configuration(host); let evm_node_flag = evm_node_flag(host).unwrap_or(false); match sequencer { Some(sequencer) => { @@ -206,7 +221,7 @@ pub fn fetch_configuration(host: &mut Host) -> Configuration { delayed_bridge, delayed_inbox: Box::new(delayed_inbox), sequencer, - enable_dal, + dal, evm_node_flag, max_blueprint_lookahead_in_seconds, }, diff --git a/etherlink/kernel_evm/kernel/src/stage_one.rs b/etherlink/kernel_evm/kernel/src/stage_one.rs index 5a18a2f6ccd4a96cc6755873342f650aeb670947..546a2126b7f253f1ba780de2bc52097129f91e12 100644 --- a/etherlink/kernel_evm/kernel/src/stage_one.rs +++ b/etherlink/kernel_evm/kernel/src/stage_one.rs @@ -4,7 +4,9 @@ use crate::blueprint::Blueprint; use crate::blueprint_storage::{store_immediate_blueprint, store_inbox_blueprint}; -use crate::configuration::{Configuration, ConfigurationMode, TezosContracts}; +use crate::configuration::{ + Configuration, ConfigurationMode, DalConfiguration, TezosContracts, +}; use crate::current_timestamp; use crate::delayed_inbox::DelayedInbox; use crate::inbox::{read_proxy_inbox, read_sequencer_inbox}; @@ -100,7 +102,7 @@ fn fetch_sequencer_blueprints( delayed_bridge: ContractKt1Hash, delayed_inbox: &mut DelayedInbox, sequencer: PublicKey, - _enable_dal: bool, + _dal: Option, enable_fa_deposits: bool, ) -> Result { match read_sequencer_inbox( @@ -140,7 +142,7 @@ pub fn fetch_blueprints( delayed_bridge, delayed_inbox, sequencer, - enable_dal, + dal, evm_node_flag: _, max_blueprint_lookahead_in_seconds: _, } => fetch_sequencer_blueprints( @@ -150,7 +152,7 @@ pub fn fetch_blueprints( delayed_bridge.clone(), delayed_inbox, sequencer.clone(), - *enable_dal, + dal.clone(), config.enable_fa_bridge, ), ConfigurationMode::Proxy => fetch_proxy_blueprints( @@ -197,6 +199,13 @@ mod tests { "edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav", ) .unwrap(); + let dal = if enable_dal { + Some(DalConfiguration { + slot_indices: vec![6], + }) + } else { + None + }; let contracts = TezosContracts::default(); Configuration { @@ -208,7 +217,7 @@ mod tests { delayed_bridge, delayed_inbox: Box::new(delayed_inbox), sequencer, - enable_dal, + dal, evm_node_flag: false, max_blueprint_lookahead_in_seconds: 100_000i64, }, diff --git a/etherlink/kernel_evm/kernel/src/storage.rs b/etherlink/kernel_evm/kernel/src/storage.rs index d58d376fa3923ca33a9596968c694db2e06dfc37..d982a448314984bdba33d680c97477567931a5d1 100644 --- a/etherlink/kernel_evm/kernel/src/storage.rs +++ b/etherlink/kernel_evm/kernel/src/storage.rs @@ -165,6 +165,9 @@ pub const SEQUENCER: RefPath = RefPath::assert_from(b"/evm/sequencer"); // is not used. pub const ENABLE_DAL: RefPath = RefPath::assert_from(b"/evm/feature_flags/enable_dal"); +// Path to the DAL slot indices to use. +pub const DAL_SLOTS: RefPath = RefPath::assert_from(b"/evm/dal_slots"); + // Path where the input for the tracer is stored by the sequencer. const TRACER_INPUT: RefPath = RefPath::assert_from(b"/evm/trace/input"); @@ -1039,6 +1042,15 @@ pub fn enable_dal(host: &Host) -> anyhow::Result { } } +pub fn dal_slots(host: &Host) -> anyhow::Result>> { + if host.store_has(&DAL_SLOTS)?.is_some() { + let bytes = host.store_read_all(&DAL_SLOTS)?; + Ok(Some(bytes)) + } else { + Ok(None) + } +} + pub fn remove_sequencer(host: &mut Host) -> anyhow::Result<()> { host.store_delete(&SEQUENCER).map_err(Into::into) } diff --git a/etherlink/tezt/lib/evm_node.ml b/etherlink/tezt/lib/evm_node.ml index 63d7b1695b29c6476060106bb770db699e9cf76f..e9fd96c5951a3bffe01628970728de7955f0eea8 100644 --- a/etherlink/tezt/lib/evm_node.ml +++ b/etherlink/tezt/lib/evm_node.ml @@ -1019,7 +1019,7 @@ let make_kernel_installer_config ?(mainnet_compat = false) ?delayed_inbox_timeout ?delayed_inbox_min_levels ?sequencer_pool_address ?maximum_allowed_ticks ?maximum_gas_per_transaction ?(max_blueprint_lookahead_in_seconds = 157_680_000L) - ?(enable_fa_bridge = false) ?(enable_dal = false) ~output () = + ?(enable_fa_bridge = false) ?(enable_dal = false) ?dal_slots ~output () = let cmd = ["make"; "kernel"; "installer"; "config"; output] @ Cli_arg.optional_switch "mainnet-compat" mainnet_compat @@ -1067,6 +1067,10 @@ let make_kernel_installer_config ?(mainnet_compat = false) ] @ Cli_arg.optional_switch "enable-fa-bridge" enable_fa_bridge @ Cli_arg.optional_switch "enable-dal" enable_dal + @ Cli_arg.optional_arg + "dal-slots" + (fun l -> String.concat "," (List.map string_of_int l)) + dal_slots @ Cli_arg.optional_arg "bootstrap-balance" Wei.to_string bootstrap_balance @ match bootstrap_accounts with diff --git a/etherlink/tezt/lib/evm_node.mli b/etherlink/tezt/lib/evm_node.mli index aa063b6f37c5c5632c9c49876d987c146fd9c518..e10ba44fc717ab7d9bc753231d652c2ae4d8cf23 100644 --- a/etherlink/tezt/lib/evm_node.mli +++ b/etherlink/tezt/lib/evm_node.mli @@ -395,6 +395,7 @@ val make_kernel_installer_config : ?max_blueprint_lookahead_in_seconds:int64 -> ?enable_fa_bridge:bool -> ?enable_dal:bool -> + ?dal_slots:int list -> output:string -> unit -> (Process.t, unit) Runnable.t diff --git a/etherlink/tezt/tests/evm_rollup.ml b/etherlink/tezt/tests/evm_rollup.ml index 54ca8931667988e40fb2b77279aaa40eec93a708..93cca316965f6ffd8d6db19b2a03ac7aefb27aed 100644 --- a/etherlink/tezt/tests/evm_rollup.ml +++ b/etherlink/tezt/tests/evm_rollup.ml @@ -305,7 +305,7 @@ let setup_evm_kernel ?additional_config ?(setup_kernel_root_hash = true) ?tx_pool_timeout_limit ?tx_pool_addr_limit ?tx_pool_tx_per_addr_limit ?max_number_of_chunks ?(setup_mode = Setup_proxy) ?(force_install_kernel = true) ?whitelist ?maximum_allowed_ticks - ?restricted_rpcs ?enable_dal protocol = + ?restricted_rpcs ?enable_dal ?dal_slots protocol = let _, kernel_installee = Kernel.to_uses_and_tags kernel in let* node, client = setup_l1 ?commitment_period ?challenge_window ?timestamp protocol @@ -368,6 +368,7 @@ let setup_evm_kernel ?additional_config ?(setup_kernel_root_hash = true) ?maximum_allowed_ticks ~output:output_config ?enable_dal + ?dal_slots () in match additional_config with @@ -463,7 +464,8 @@ let register_test ~title ~tags ?(kernels = Kernel.all) ?additional_config ?admin ?(additional_uses = []) ?commitment_period ?challenge_window ?bootstrap_accounts ?whitelist ?da_fee_per_byte ?minimum_base_fee_per_gas ?rollup_operator_key ?maximum_allowed_ticks ?restricted_rpcs ~setup_mode - ~enable_dal f protocols = + ~enable_dal ?(dal_slots = if enable_dal then Some [4] else None) f protocols + = let extra_tag = match setup_mode with | Setup_proxy -> "proxy" @@ -511,6 +513,7 @@ let register_test ~title ~tags ?(kernels = Kernel.all) ?additional_config ?admin ~admin ~setup_mode ~enable_dal + ?dal_slots protocol in f ~protocol ~evm_setup) diff --git a/etherlink/tezt/tests/evm_sequencer.ml b/etherlink/tezt/tests/evm_sequencer.ml index e20810ab056d615b7d072427e63406b3efeec041..ebf3ff89f1e83def67e7a790d55456a9774366a1 100644 --- a/etherlink/tezt/tests/evm_sequencer.ml +++ b/etherlink/tezt/tests/evm_sequencer.ml @@ -177,7 +177,8 @@ let setup_sequencer ~mainnet_compat ?genesis_timestamp ?time_between_blocks ?preimages_dir ?maximum_allowed_ticks ?maximum_gas_per_transaction ?max_blueprint_lookahead_in_seconds ?enable_fa_bridge ?(threshold_encryption = false) ?(wal_sqlite_journal_mode = true) - ?(drop_duplicate_when_injection = true) ?history_mode ~enable_dal protocol = + ?(drop_duplicate_when_injection = true) ?history_mode ~enable_dal ?dal_slots + protocol = let* node, client = setup_l1 ?timestamp:genesis_timestamp protocol in let* l1_contracts = setup_l1_contracts client in let sc_rollup_node = @@ -210,6 +211,7 @@ let setup_sequencer ~mainnet_compat ?genesis_timestamp ?time_between_blocks ?maximum_allowed_ticks ?maximum_gas_per_transaction ~enable_dal + ?dal_slots ?max_blueprint_lookahead_in_seconds ~bootstrap_accounts ~output:output_config @@ -424,7 +426,9 @@ let register_test ~mainnet_compat ?genesis_timestamp ?time_between_blocks ?maximum_allowed_ticks ?maximum_gas_per_transaction ?max_blueprint_lookahead_in_seconds ?enable_fa_bridge ?(threshold_encryption = false) ?(uses = uses) ?(additional_uses = []) - ?history_mode ~enable_dal body ~title ~tags protocols = + ?history_mode ~enable_dal + ?(dal_slots = if enable_dal then Some [4] else None) body ~title ~tags + protocols = let additional_uses = if threshold_encryption then Constant.octez_dsn_node :: kernel :: additional_uses @@ -457,6 +461,7 @@ let register_test ~mainnet_compat ?genesis_timestamp ?time_between_blocks ~threshold_encryption ?history_mode ~enable_dal + ?dal_slots protocol in body sequencer_setup protocol