From 9d59445f1ab2b7d0619ea8c56c9636ddc0ccf72d Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Tue, 4 Mar 2025 13:57:06 +0100 Subject: [PATCH 1/2] EVM Node: create Unexpected_multichain error 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/node_error.ml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/etherlink/bin_node/lib_dev/node_error.ml b/etherlink/bin_node/lib_dev/node_error.ml index 915138f21fb9..f98116ef32fd 100644 --- a/etherlink/bin_node/lib_dev/node_error.ml +++ b/etherlink/bin_node/lib_dev/node_error.ml @@ -20,6 +20,7 @@ type error += } | Out_of_sync of {level_expected : int32; level_received : int32} | Cannot_handle_flushed_blueprint of Ethereum_types.quantity + | Unexpected_multichain let () = register_error_kind @@ -84,4 +85,14 @@ let () = level) Data_encoding.(obj1 (req "level" Ethereum_types.quantity_encoding)) (function Cannot_handle_flushed_blueprint level -> Some level | _ -> None) - (fun level -> Cannot_handle_flushed_blueprint level) + (fun level -> Cannot_handle_flushed_blueprint level) ; + register_error_kind + `Permanent + ~id:"unexpected_multichain" + ~title:"Multiple chains configured to a single chain node" + ~description: + "Observer, proxy, and rpc nodes follow a single chain. However, the \ + configuration attempted to configure multiple chains." + Data_encoding.empty + (function Unexpected_multichain -> Some () | _ -> None) + (fun () -> Unexpected_multichain) -- GitLab From 5a0d0dc9f29520e05e71faea75d25f89ad1a0804 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Thu, 6 Mar 2025 12:08:17 +0100 Subject: [PATCH 2/2] 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 | 8 ++++++++ etherlink/bin_node/lib_dev/proxy.ml | 8 ++++++++ etherlink/bin_node/lib_dev/rpc.ml | 7 +++++++ 5 files changed, 33 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 4d1783eae4de..b6c24777dc47 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -247,6 +247,14 @@ 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 : Ethereum_types.chain_family) = + match config.experimental_features.l2_chains with + | None -> return EVM + | Some [l2_chain] -> + Evm_ro_context.read_chain_family ro_ctxt l2_chain.chain_id + | _ -> tzfail Node_error.Unexpected_multichain + 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..854875325595 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 : Ethereum_types.chain_family) = + if finalized_view then return Ethereum_types.EVM + else + match config.experimental_features.l2_chains with + | None -> return Ethereum_types.EVM + | Some [l2_chain] -> Rollup_node_rpc.chain_family l2_chain.chain_id + | _ -> tzfail Node_error.Unexpected_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 36b9c8ef95c0..68a0a087329e 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -122,6 +122,13 @@ let main ~data_dir ~evm_node_endpoint ?evm_node_private_endpoint } in + let* (_chain_family : Ethereum_types.chain_family) = + match config.experimental_features.l2_chains with + | None -> return Ethereum_types.EVM + | Some [l2_chain] -> Evm_ro_context.read_chain_family ctxt l2_chain.chain_id + | _ -> tzfail Node_error.Unexpected_multichain + in + let* server_public_finalizer = Rpc_server.start_public_server ~delegate_health_check_to:evm_node_endpoint -- GitLab