From 22afa05576949e376341d599539b58d362235b34 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 26 Feb 2025 16:17:47 +0100 Subject: [PATCH 1/8] EVM node: read chain_family when starting non-sequencer nodes --- etherlink/bin_node/lib_dev/evm_ro_context.ml | 7 +++++++ etherlink/bin_node/lib_dev/evm_ro_context.mli | 3 +++ etherlink/bin_node/lib_dev/observer.ml | 11 +++++++++++ etherlink/bin_node/lib_dev/proxy.ml | 8 ++++++++ etherlink/bin_node/lib_dev/rpc.ml | 9 +++++++++ 5 files changed, 38 insertions(+) diff --git a/etherlink/bin_node/lib_dev/evm_ro_context.ml b/etherlink/bin_node/lib_dev/evm_ro_context.ml index 5c27c2fcdf65..87f32e856215 100644 --- a/etherlink/bin_node/lib_dev/evm_ro_context.ml +++ b/etherlink/bin_node/lib_dev/evm_ro_context.ml @@ -29,6 +29,13 @@ let read state path = let*! res = Evm_state.inspect state path in return res +let read_chain_family ctxt chain_id = + let open Lwt_result_syntax in + let* _, hash = Evm_store.(use ctxt.store Context_hashes.get_latest) in + let* evm_state = get_evm_state ctxt hash in + let* chain_family = Durable_storage.chain_family (read evm_state) chain_id in + return chain_family + let network_sanity_check ~network ctxt = let open Lwt_result_syntax in let expected_smart_rollup_address = Constants.rollup_address network in diff --git a/etherlink/bin_node/lib_dev/evm_ro_context.mli b/etherlink/bin_node/lib_dev/evm_ro_context.mli index e99ce9a08b7d..3a3da1965603 100644 --- a/etherlink/bin_node/lib_dev/evm_ro_context.mli +++ b/etherlink/bin_node/lib_dev/evm_ro_context.mli @@ -33,6 +33,9 @@ val load : Configuration.t -> t tzresult Lwt.t +val read_chain_family : + t -> Ethereum_types.chain_id -> Ethereum_types.chain_family tzresult Lwt.t + (** [preload_known_kernels ctxt] uses [ctxt] to preload every kernel known to the node in the Fast Execution kernel cache. *) val preload_known_kernels : t -> unit tzresult Lwt.t diff --git a/etherlink/bin_node/lib_dev/observer.ml b/etherlink/bin_node/lib_dev/observer.ml index aabe9e197251..7c2a84ab71d3 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -237,6 +237,17 @@ let main ?network ?kernel_path ~data_dir ~(config : Configuration.t) ~no_sync ~tx_pool_size_info:Tx_pool.size_info ~smart_rollup_address ; + let* _chain_family = + match config.experimental_features.l2_chains with + | None -> return EVM + | Some [l2_chain] -> + let* family = + Evm_ro_context.read_chain_family ro_ctxt l2_chain.chain_id + in + return family + | _ -> failwith "Too many L2 chains for observer" + in + let* finalizer_public_server = Rpc_server.start_public_server ~evm_services: diff --git a/etherlink/bin_node/lib_dev/proxy.ml b/etherlink/bin_node/lib_dev/proxy.ml index 3cf1cb90221e..d9e95955acb4 100644 --- a/etherlink/bin_node/lib_dev/proxy.ml +++ b/etherlink/bin_node/lib_dev/proxy.ml @@ -96,6 +96,14 @@ let main ~rollup_node_endpoint () in + let* _chain_family = + match config.experimental_features.l2_chains with + | None -> return Ethereum_types.EVM + | Some [l2_chain] -> + let* family = Rollup_node_rpc.chain_family l2_chain.chain_id in + return family + | _ -> failwith "Too many L2 chains for proxy" + in let* server_finalizer = Rpc_server.start_public_server validation_mode diff --git a/etherlink/bin_node/lib_dev/rpc.ml b/etherlink/bin_node/lib_dev/rpc.ml index 36b9c8ef95c0..577c90eed45e 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -122,6 +122,15 @@ let main ~data_dir ~evm_node_endpoint ?evm_node_private_endpoint } in + let* _chain_family = + match config.experimental_features.l2_chains with + | None -> return Ethereum_types.EVM + | Some [l2_chain] -> + let* family = Evm_ro_context.read_chain_family ctxt l2_chain.chain_id in + return family (* This ensures the result is an option inside Lwt *) + | _ -> failwith "Too many L2 chains for rpc" + in + let* server_public_finalizer = Rpc_server.start_public_server ~delegate_health_check_to:evm_node_endpoint -- GitLab From b06a9852e1aebf9e64b182f0705841437719f626 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 26 Feb 2025 16:56:53 +0100 Subject: [PATCH 2/8] EVM Node: add feature_flag paths to durable storage --- etherlink/bin_node/lib_dev/durable_storage_path.ml | 10 ++++++++++ etherlink/bin_node/lib_dev/durable_storage_path.mli | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/etherlink/bin_node/lib_dev/durable_storage_path.ml b/etherlink/bin_node/lib_dev/durable_storage_path.ml index f3cbe1d47375..3d4e89b3c864 100644 --- a/etherlink/bin_node/lib_dev/durable_storage_path.ml +++ b/etherlink/bin_node/lib_dev/durable_storage_path.ml @@ -242,3 +242,13 @@ module Chain_configuration = struct let world_state chain_id = root chain_id ^ "/world_state" end + +module Feature_flags = struct + let root = EVM.make "/feature_flags" + + let dal = root ^ "/enable_dal" + + let fa_bridge = root ^ "/enable_fa_bridge" + + let multichain = root ^ "/enable_multichain" +end diff --git a/etherlink/bin_node/lib_dev/durable_storage_path.mli b/etherlink/bin_node/lib_dev/durable_storage_path.mli index 70efeb8735cf..065613087536 100644 --- a/etherlink/bin_node/lib_dev/durable_storage_path.mli +++ b/etherlink/bin_node/lib_dev/durable_storage_path.mli @@ -172,3 +172,11 @@ module Chain_configuration : sig val world_state : Ethereum_types.chain_id -> path end + +module Feature_flags : sig + val dal : path + + val fa_bridge : path + + val multichain : path +end -- GitLab From 975fc716a1c7d5cc7fd131458a9accc4edd10a4a Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 26 Feb 2025 17:26:33 +0100 Subject: [PATCH 3/8] EVM Node: add reader to enable_multichain in durable storage --- etherlink/bin_node/lib_dev/durable_storage.ml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/etherlink/bin_node/lib_dev/durable_storage.ml b/etherlink/bin_node/lib_dev/durable_storage.ml index 0409574ae0be..484ecc53212d 100644 --- a/etherlink/bin_node/lib_dev/durable_storage.ml +++ b/etherlink/bin_node/lib_dev/durable_storage.ml @@ -334,6 +334,22 @@ let kernel_root_hash read = Durable_storage_path.kernel_root_hash Bytes.to_string +let enable_multichain read = + let open Lwt_result_syntax in + let bytes_to_bool (b : bytes) : bool = + if Bytes.length b <> 1 then + invalid_arg + "Expected a single byte representing the multichain feature flag" + else Bytes.get b 0 <> '\x00' + in + let* res_opt = + inspect_durable_and_decode_opt + read + Durable_storage_path.Feature_flags.multichain + bytes_to_bool + in + match res_opt with Some res -> return res | None -> return false + let storage_at read address (Qty pos) = let open Lwt_result_syntax in let pad32left0 s = @@ -420,6 +436,11 @@ module Make (Reader : READER) = struct let* read = read_with_state () in chain_id read + let enable_multichain () = + let open Lwt_result_syntax in + let* read = read_with_state () in + enable_multichain read + let l2_minimum_base_fee_per_gas chain_id = let open Lwt_result_syntax in let* read = read_with_state () in -- GitLab From b78209906391ac7d33d2b978dc6de453fcb9ff17 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 26 Feb 2025 17:29:43 +0100 Subject: [PATCH 4/8] EVM Node: add enable_multichain reader to evm_ro_context --- etherlink/bin_node/lib_dev/evm_ro_context.ml | 7 +++++++ etherlink/bin_node/lib_dev/evm_ro_context.mli | 2 ++ 2 files changed, 9 insertions(+) diff --git a/etherlink/bin_node/lib_dev/evm_ro_context.ml b/etherlink/bin_node/lib_dev/evm_ro_context.ml index 87f32e856215..4ed1e8e33482 100644 --- a/etherlink/bin_node/lib_dev/evm_ro_context.ml +++ b/etherlink/bin_node/lib_dev/evm_ro_context.ml @@ -36,6 +36,13 @@ let read_chain_family ctxt chain_id = let* chain_family = Durable_storage.chain_family (read evm_state) chain_id in return chain_family +let read_enable_multichain ctxt = + let open Lwt_result_syntax in + let* _, hash = Evm_store.(use ctxt.store Context_hashes.get_latest) in + let* evm_state = get_evm_state ctxt hash in + let* enable_multichain = Durable_storage.enable_multichain (read evm_state) in + return enable_multichain + let network_sanity_check ~network ctxt = let open Lwt_result_syntax in let expected_smart_rollup_address = Constants.rollup_address network in diff --git a/etherlink/bin_node/lib_dev/evm_ro_context.mli b/etherlink/bin_node/lib_dev/evm_ro_context.mli index 3a3da1965603..a0071ff3787b 100644 --- a/etherlink/bin_node/lib_dev/evm_ro_context.mli +++ b/etherlink/bin_node/lib_dev/evm_ro_context.mli @@ -36,6 +36,8 @@ val load : val read_chain_family : t -> Ethereum_types.chain_id -> Ethereum_types.chain_family tzresult Lwt.t +val read_enable_multichain : t -> bool tzresult Lwt.t + (** [preload_known_kernels ctxt] uses [ctxt] to preload every kernel known to the node in the Fast Execution kernel cache. *) val preload_known_kernels : t -> unit tzresult Lwt.t -- GitLab From d0b11df265e16a1fe4de6a115d2fc80d3046bcc0 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Thu, 27 Feb 2025 14:48:07 +0100 Subject: [PATCH 5/8] EVM Node: add backend service to read enable_multichain --- etherlink/bin_node/lib_dev/services_backend_sig.ml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etherlink/bin_node/lib_dev/services_backend_sig.ml b/etherlink/bin_node/lib_dev/services_backend_sig.ml index a69faca1e48b..e24c60d5b9e0 100644 --- a/etherlink/bin_node/lib_dev/services_backend_sig.ml +++ b/etherlink/bin_node/lib_dev/services_backend_sig.ml @@ -99,6 +99,11 @@ module type S = sig or the zero address. *) val coinbase : unit -> Ethereum_types.address tzresult Lwt.t + (** enable_multichain () returns the value of the enable_multichain + this method targets proxy nodes that do not have direct access + to the durable storage. *) + val enable_multichain : unit -> bool tzresult Lwt.t + include Tracer_sig.S end -- GitLab From 8dafea73aabea027162e9b2005a9487e587fbf04 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 26 Feb 2025 17:37:58 +0100 Subject: [PATCH 6/8] EVM Node: read enable_multichain feature flag on startup --- etherlink/bin_node/lib_dev/observer.ml | 2 ++ etherlink/bin_node/lib_dev/proxy.ml | 2 ++ etherlink/bin_node/lib_dev/rpc.ml | 2 ++ etherlink/bin_node/lib_dev/sequencer.ml | 1 + 4 files changed, 7 insertions(+) diff --git a/etherlink/bin_node/lib_dev/observer.ml b/etherlink/bin_node/lib_dev/observer.ml index 7c2a84ab71d3..cc9edfb572be 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -248,6 +248,8 @@ let main ?network ?kernel_path ~data_dir ~(config : Configuration.t) ~no_sync | _ -> failwith "Too many L2 chains for observer" in + let* _enable_multichain = Evm_ro_context.read_enable_multichain ro_ctxt in + let* finalizer_public_server = Rpc_server.start_public_server ~evm_services: diff --git a/etherlink/bin_node/lib_dev/proxy.ml b/etherlink/bin_node/lib_dev/proxy.ml index d9e95955acb4..cdf8e09a27ad 100644 --- a/etherlink/bin_node/lib_dev/proxy.ml +++ b/etherlink/bin_node/lib_dev/proxy.ml @@ -104,6 +104,8 @@ let main return family | _ -> failwith "Too many L2 chains for proxy" in + let* _enable_multichain = Rollup_node_rpc.enable_multichain () in + let* server_finalizer = Rpc_server.start_public_server validation_mode diff --git a/etherlink/bin_node/lib_dev/rpc.ml b/etherlink/bin_node/lib_dev/rpc.ml index 577c90eed45e..5d5fddfeb28a 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -131,6 +131,8 @@ let main ~data_dir ~evm_node_endpoint ?evm_node_private_endpoint | _ -> failwith "Too many L2 chains for rpc" in + let* _enable_multichain = Evm_ro_context.read_enable_multichain ctxt in + let* server_public_finalizer = Rpc_server.start_public_server ~delegate_health_check_to:evm_node_endpoint diff --git a/etherlink/bin_node/lib_dev/sequencer.ml b/etherlink/bin_node/lib_dev/sequencer.ml index 62da7d22ea27..92d05991db12 100644 --- a/etherlink/bin_node/lib_dev/sequencer.ml +++ b/etherlink/bin_node/lib_dev/sequencer.ml @@ -189,6 +189,7 @@ let main ~data_dir ?(genesis_timestamp = Misc.now ()) ~cctxt in return_unit in + let* _enable_multichain = Evm_ro_context.read_enable_multichain ro_ctxt in let* finalizer_public_server = Rpc_server.start_public_server ~evm_services: -- GitLab From e37ec19e0f5b86f68006a7b56115d48da3b4b9ae Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Fri, 28 Feb 2025 08:50:39 +0100 Subject: [PATCH 7/8] tmp --- etherlink/bin_node/lib_dev/observer.ml | 5 +++-- etherlink/bin_node/lib_dev/rpc_server.ml | 5 +++-- etherlink/bin_node/lib_dev/rpc_types.ml | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 etherlink/bin_node/lib_dev/rpc_types.ml diff --git a/etherlink/bin_node/lib_dev/observer.ml b/etherlink/bin_node/lib_dev/observer.ml index cc9edfb572be..57b4f00b4706 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -237,7 +237,7 @@ let main ?network ?kernel_path ~data_dir ~(config : Configuration.t) ~no_sync ~tx_pool_size_info:Tx_pool.size_info ~smart_rollup_address ; - let* _chain_family = + let* chain_family = match config.experimental_features.l2_chains with | None -> return EVM | Some [l2_chain] -> @@ -248,10 +248,11 @@ let main ?network ?kernel_path ~data_dir ~(config : Configuration.t) ~no_sync | _ -> failwith "Too many L2 chains for observer" in - let* _enable_multichain = Evm_ro_context.read_enable_multichain ro_ctxt in + let* enable_multichain = Evm_ro_context.read_enable_multichain ro_ctxt in let* finalizer_public_server = Rpc_server.start_public_server + ~_chain_family:chain_family ~evm_services: Evm_ro_context.(evm_services_methods ro_ctxt time_between_blocks) ~data_dir diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index f76c806dffd6..379ce945628d 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -124,8 +124,9 @@ let monitor_performances ~data_dir = in Lwt.dont_wait aux (Fun.const ()) -let start_public_server ?delegate_health_check_to ?evm_services ?data_dir - validation (config : Configuration.t) ctxt = +let start_public_server ~_rpc_server_family ~_enable_multichain + ?delegate_health_check_to ?evm_services ?data_dir validation + (config : Configuration.t) ctxt = let open Lwt_result_syntax in let*! can_start_performance_metrics = Octez_performance_metrics.supports_performance_metrics () diff --git a/etherlink/bin_node/lib_dev/rpc_types.ml b/etherlink/bin_node/lib_dev/rpc_types.ml new file mode 100644 index 000000000000..acea652f00d9 --- /dev/null +++ b/etherlink/bin_node/lib_dev/rpc_types.ml @@ -0,0 +1,16 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +(* The set of supported RPCs depends on the mode. + For the sequencer, only very few JSON RPCs need to be supported. + For the observer, proxy, and RPC modes, we assume that a single + chain is followed even when the multichain feature is activated + and the set of supported RPCs depends on the chain family. *) + +type rpc_server_family = + | Sequencer_rpc_server + | Single_chain_node_rpc_server of Ethereum_types.chain_family -- GitLab From 7823ecab38391612bdcdcdd783515d71b164580a Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Mon, 3 Mar 2025 07:24:13 +0000 Subject: [PATCH 8/8] Apply 1 suggestion(s) to 1 file(s) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Raphaƫl Cauderlier --- etherlink/bin_node/lib_dev/rpc_types.ml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etherlink/bin_node/lib_dev/rpc_types.ml b/etherlink/bin_node/lib_dev/rpc_types.ml index acea652f00d9..d9abf37df45b 100644 --- a/etherlink/bin_node/lib_dev/rpc_types.ml +++ b/etherlink/bin_node/lib_dev/rpc_types.ml @@ -11,6 +11,11 @@ chain is followed even when the multichain feature is activated and the set of supported RPCs depends on the chain family. *) +(* The set of supported RPCs depends on the mode. + For the sequencer, only very few JSON RPCs need to be supported. + For the observer, proxy, and RPC modes, we assume that a single + chain is followed even when the multichain feature is activated + and the set of supported RPCs depends on the chain family. *) type rpc_server_family = | Sequencer_rpc_server | Single_chain_node_rpc_server of Ethereum_types.chain_family -- GitLab