From a54135f6209582500238afc95e9e86b7131bda2e Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Mon, 10 Mar 2025 15:03:14 +0100 Subject: [PATCH 1/6] EVM Node: add dependency to protocol parameters --- etherlink/bin_node/lib_dev/dune | 3 ++- manifest/product_etherlink.ml | 6 ++++++ manifest/product_octez.ml | 4 ++++ manifest/product_octez.mli | 2 ++ opam/octez-evm-node-libs.opam | 1 + 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/etherlink/bin_node/lib_dev/dune b/etherlink/bin_node/lib_dev/dune index 009cf739edae..7ee561a10155 100644 --- a/etherlink/bin_node/lib_dev/dune +++ b/etherlink/bin_node/lib_dev/dune @@ -37,7 +37,8 @@ octez-evm-node-libs.evm_node_supported_installers octez-evm-node-libs.evm_node_wasm_runtime octez-performance-metrics - octez-protocol-021-PsQuebec-libs.plugin) + octez-protocol-021-PsQuebec-libs.plugin + tezos-protocol-021-PsQuebec.parameters) (flags (:standard) -open Tezos_base.TzPervasives diff --git a/manifest/product_etherlink.ml b/manifest/product_etherlink.ml index ccd22abf9f9c..6ab22376c44d 100644 --- a/manifest/product_etherlink.ml +++ b/manifest/product_etherlink.ml @@ -249,6 +249,11 @@ let evm_node_lib_dev = | Some target -> target | None -> (* unreachable *) assert false in + let parameters = + match Protocol.parameters quebec with + | Some target -> target + | None -> (* unreachable *) assert false + in octez_evm_node_lib "evm_node_lib_dev" ~path:"etherlink/bin_node/lib_dev" @@ -289,6 +294,7 @@ let evm_node_lib_dev = wasm_runtime; performance_metrics; plugin; + parameters; ] let evm_node_lib_dev_client = diff --git a/manifest/product_octez.ml b/manifest/product_octez.ml index ac28dd1123d4..278d53d69697 100644 --- a/manifest/product_octez.ml +++ b/manifest/product_octez.ml @@ -5408,6 +5408,8 @@ module Protocol : sig val agnostic_baker : t -> target option + val parameters : t -> target option + val parameters_exn : t -> target val benchmarks_proto_exn : t -> target @@ -5609,6 +5611,8 @@ end = struct let agnostic_baker p = p.agnostic_baker + let parameters p = p.parameters + let parameters_exn p = mandatory "parameters" p p.parameters let benchmarks_proto_exn p = mandatory "benchmarks_proto" p p.benchmarks_proto diff --git a/manifest/product_octez.mli b/manifest/product_octez.mli index 4bec8e83f0cd..f06e1f7b2c8c 100644 --- a/manifest/product_octez.mli +++ b/manifest/product_octez.mli @@ -127,6 +127,8 @@ module Protocol : sig val plugin : t -> Manifest.target option + val parameters : t -> Manifest.target option + val alpha : t (** List of all protocols. *) diff --git a/opam/octez-evm-node-libs.opam b/opam/octez-evm-node-libs.opam index 6de07ec6ffd5..936ce9006061 100644 --- a/opam/octez-evm-node-libs.opam +++ b/opam/octez-evm-node-libs.opam @@ -33,6 +33,7 @@ depends: [ "tezos-dal-node-services" "octez-performance-metrics" "octez-protocol-021-PsQuebec-libs" + "tezos-protocol-021-PsQuebec" ] conflicts: [ "websocket" -- GitLab From 9d29c6d0ea5536f7d953a96cddff9c2736368654 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Fri, 7 Mar 2025 11:18:06 +0100 Subject: [PATCH 2/6] Tezlink: implement current_level Co-authored-by: Pierre-Emmanuel CORNILLEAU --- .../bin_node/lib_dev/tezlink_services_impl.ml | 49 +++++++++++++++++++ etherlink/bin_node/lib_dev/tezos_services.mli | 2 + 2 files changed, 51 insertions(+) create mode 100644 etherlink/bin_node/lib_dev/tezlink_services_impl.ml diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml new file mode 100644 index 000000000000..34bece1d50bc --- /dev/null +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -0,0 +1,49 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +open Tezos_services + +let current_level (module Backend : Services_backend_sig.S) + (constants : + Imported_protocol.Protocol.Alpha_context.Constants.Parametric.t) chain + block level_query = + let open Lwt_result_syntax in + (* TODO: #7831 + take chain into account + For the moment this implementation only supports the main chain, once + the rpc support of tezlink is more stable, we can add support for other chains *) + let* () = + match chain with `Main -> return_unit | _ -> failwith "Unsupported chain" + in + + (* TODO: #7831 + take block into account + For the moment this implementation only supports the head block, once + the rpc support of tezlink is more stable, we can add support for other blocks *) + let* () = + match block with + | `Head _ -> return_unit + | _ -> failwith "Unsupported block" + in + + let* (Qty current_block_number) = + Backend.block_param_to_block_number (Block_parameter Latest) + in + + let current_block_number = Z.to_int32 current_block_number in + let offset = level_query.offset in + + let level = Int32.add current_block_number offset in + return + { + level; + cycle = Int32.div level constants.blocks_per_cycle; + cycle_position = Int32.rem level constants.blocks_per_cycle; + } + +let michelson_services_methods backend constants = + {current_level = current_level backend constants} diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index bb669e12f44b..3afb900ad6a8 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -5,6 +5,8 @@ (* *) (*****************************************************************************) +module Imported_protocol = Tezos_protocol_021_PsQuebec + type level = { level : int32; (** The level of the block relative to genesis. This -- GitLab From ff47cb393cc9b67667f04c5ba519f96c4c8306cb Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 12 Mar 2025 08:04:05 +0100 Subject: [PATCH 3/6] Tezlink: create constants module --- etherlink/bin_node/lib_dev/tezlink_constants.ml | 10 ++++++++++ etherlink/bin_node/lib_dev/tezos_services.ml | 1 + etherlink/bin_node/lib_dev/tezos_services.mli | 1 + 3 files changed, 12 insertions(+) create mode 100644 etherlink/bin_node/lib_dev/tezlink_constants.ml diff --git a/etherlink/bin_node/lib_dev/tezlink_constants.ml b/etherlink/bin_node/lib_dev/tezlink_constants.ml new file mode 100644 index 000000000000..89467909650a --- /dev/null +++ b/etherlink/bin_node/lib_dev/tezlink_constants.ml @@ -0,0 +1,10 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +let mainnet = + Tezos_services.Imported_protocol_parameters.Default_parameters + .constants_mainnet diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 6dbf9614fcd0..b7b4a903b1d0 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -6,6 +6,7 @@ (*****************************************************************************) module Imported_protocol = Tezos_protocol_021_PsQuebec module Imported_protocol_plugin = Tezos_protocol_plugin_021_PsQuebec +module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters (* The output type of the current_level service but with less duplicated information. Can be changed, as long as the [conversion_encoding] is also diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index 3afb900ad6a8..e7f429fe709f 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -6,6 +6,7 @@ (*****************************************************************************) module Imported_protocol = Tezos_protocol_021_PsQuebec +module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters type level = { level : int32; -- GitLab From 01b4db4522ac6883f8cfd1fb82ebeb9591b6c4ca Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Wed, 12 Mar 2025 16:23:28 +0100 Subject: [PATCH 4/6] Tezlink/EVM Node: pass tezlink rpc implem on startup --- etherlink/bin_node/lib_dev/observer.ml | 8 ++++++++ etherlink/bin_node/lib_dev/proxy.ml | 8 ++++++++ etherlink/bin_node/lib_dev/rpc.ml | 6 ++++++ etherlink/bin_node/lib_dev/rpc_server.ml | 4 ++-- etherlink/bin_node/lib_dev/rpc_server.mli | 1 + 5 files changed, 25 insertions(+), 2 deletions(-) diff --git a/etherlink/bin_node/lib_dev/observer.ml b/etherlink/bin_node/lib_dev/observer.ml index 89b8104d7398..1587330c80a1 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -206,6 +206,14 @@ let main ?network ?kernel_path ~data_dir ~(config : Configuration.t) ~no_sync Evm_ro_context.(evm_services_methods ro_ctxt time_between_blocks) ~data_dir ~rpc_server_family:(Rpc_types.Single_chain_node_rpc_server chain_family) + ?tezlink_services: + (if chain_family = Michelson then + Some + Tezlink_services_impl.( + michelson_services_methods + observer_backend + Tezlink_constants.mainnet) + else None) Stateless config (observer_backend, smart_rollup_address) diff --git a/etherlink/bin_node/lib_dev/proxy.ml b/etherlink/bin_node/lib_dev/proxy.ml index 7e884b6f1c3e..2e36076472f8 100644 --- a/etherlink/bin_node/lib_dev/proxy.ml +++ b/etherlink/bin_node/lib_dev/proxy.ml @@ -118,6 +118,14 @@ let main let* server_finalizer = Rpc_server.start_public_server ~rpc_server_family:(Rpc_types.Single_chain_node_rpc_server chain_family) + ?tezlink_services: + (if chain_family = Michelson then + Some + Tezlink_services_impl.( + michelson_services_methods + (module Rollup_node_rpc) + Tezlink_constants.mainnet) + else None) validation_mode config ((module Rollup_node_rpc), smart_rollup_address) diff --git a/etherlink/bin_node/lib_dev/rpc.ml b/etherlink/bin_node/lib_dev/rpc.ml index e63f3db4cb02..ee1afde6689f 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -141,6 +141,12 @@ let main ~data_dir ~evm_node_endpoint ?evm_node_private_endpoint Evm_ro_context.(evm_services_methods ctxt time_between_blocks) ~data_dir ~rpc_server_family:(Rpc_types.Single_chain_node_rpc_server chain_family) + ?tezlink_services: + (if chain_family = Michelson then + Some + Tezlink_services_impl.( + michelson_services_methods rpc_backend Tezlink_constants.mainnet) + else None) Stateless rpc_config (rpc_backend, ctxt.smart_rollup_address) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index ec84351b1767..69615e8d44b9 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -125,8 +125,8 @@ let monitor_performances ~data_dir = Lwt.dont_wait aux (Fun.const ()) let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) - ?delegate_health_check_to ?evm_services ?data_dir validation - (config : Configuration.t) ctxt = + ?delegate_health_check_to ?evm_services ?tezlink_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_server.mli b/etherlink/bin_node/lib_dev/rpc_server.mli index 4715b3af3b0d..28c42e294121 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.mli +++ b/etherlink/bin_node/lib_dev/rpc_server.mli @@ -47,6 +47,7 @@ val start_public_server : rpc_server_family:Rpc_types.rpc_server_family -> ?delegate_health_check_to:Uri.t -> ?evm_services:evm_services_methods -> + ?tezlink_services:Tezos_services.tezos_services_implementation -> ?data_dir:string -> Validate.validation_mode -> Configuration.t -> -- GitLab From 20647c5bdfef3a2bc3eb820e1b784bcf5b6b2f53 Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Fri, 7 Mar 2025 14:04:02 +0100 Subject: [PATCH 5/6] Tezlink/EVM Node: register tezlink services --- etherlink/bin_node/lib_dev/rpc_server.ml | 23 ++++++++++++++--------- etherlink/bin_node/lib_dev/services.ml | 6 +++--- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index 69615e8d44b9..e06004e26810 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -125,7 +125,7 @@ let monitor_performances ~data_dir = Lwt.dont_wait aux (Fun.const ()) let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) - ?delegate_health_check_to ?evm_services ?tezlink_services:_ ?data_dir + ?delegate_health_check_to ?evm_services ?tezlink_services ?data_dir validation (config : Configuration.t) ctxt = let open Lwt_result_syntax in let*! can_start_performance_metrics = @@ -144,7 +144,11 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) impl.smart_rollup_address impl.time_between_blocks in - + let register_tezos_services = + match tezlink_services with + | None -> Evm_directory.empty config.experimental_features.rpc_server + | Some impl -> Tezos_services.register_tezlink_services impl + in (* If spawn_rpc is defined, use it as intermediate *) let rpc = match config.experimental_features.spawn_rpc with @@ -153,13 +157,14 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) in let directory = - Services.directory - ~rpc_server_family - ?delegate_health_check_to - rpc - validation - config - ctxt + register_tezos_services + |> Services.directory + ~rpc_server_family + ?delegate_health_check_to + rpc + validation + config + ctxt |> register_evm_services |> Evm_directory.register_metrics "/metrics" in diff --git a/etherlink/bin_node/lib_dev/services.ml b/etherlink/bin_node/lib_dev/services.ml index 30eaea934cdd..d835cf396043 100644 --- a/etherlink/bin_node/lib_dev/services.ml +++ b/etherlink/bin_node/lib_dev/services.ml @@ -1154,9 +1154,9 @@ let dispatch_websocket_private (rpc_server_family : Rpc_types.rpc_server_family) (dispatch_private_websocket rpc_server_family ~block_production rpc) let directory ~rpc_server_family ?delegate_health_check_to rpc validation config - ((module Rollup_node_rpc : Services_backend_sig.S), smart_rollup_address) = - Evm_directory.empty config.experimental_features.rpc_server - |> version |> configuration config + ((module Rollup_node_rpc : Services_backend_sig.S), smart_rollup_address) + dir = + dir |> version |> configuration config |> health_check ?delegate_to:delegate_health_check_to |> dispatch_public rpc_server_family -- GitLab From 7c6d5d92d536537ba751532f3dac13271cdd5fcc Mon Sep 17 00:00:00 2001 From: Luciano Freitas Date: Fri, 7 Mar 2025 18:11:28 +0100 Subject: [PATCH 6/6] Tezlink/EVM Node: fail with dream and michelson family 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 | 11 ++++++++++- etherlink/bin_node/lib_dev/rpc_server.ml | 10 +++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/etherlink/bin_node/lib_dev/node_error.ml b/etherlink/bin_node/lib_dev/node_error.ml index eeb7f90af07b..795024db7cfc 100644 --- a/etherlink/bin_node/lib_dev/node_error.ml +++ b/etherlink/bin_node/lib_dev/node_error.ml @@ -33,6 +33,7 @@ type error += | Unexpected_multichain | Proxy_finalize_with_multichain of error_source | Mismatched_multichain of error_source + | Dream_rpc_tezlink let () = register_error_kind @@ -148,4 +149,12 @@ let () = environment.") Data_encoding.(obj1 (req "source" error_source_encoding)) (function Mismatched_multichain source -> Some source | _ -> None) - (fun source -> Mismatched_multichain source) + (fun source -> Mismatched_multichain source) ; + register_error_kind + `Permanent + ~id:"dream_rpc_tezlink" + ~title:"Dream RPC node with Tezlink" + ~description:"Tezlink is only compatible with Resto RPC nodes." + Data_encoding.empty + (function Dream_rpc_tezlink -> Some () | _ -> None) + (fun () -> Dream_rpc_tezlink) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index e06004e26810..9d42a3ef3c9a 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -144,10 +144,14 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) impl.smart_rollup_address impl.time_between_blocks in - let register_tezos_services = + let* register_tezos_services = match tezlink_services with - | None -> Evm_directory.empty config.experimental_features.rpc_server - | Some impl -> Tezos_services.register_tezlink_services impl + | None -> + return (Evm_directory.empty config.experimental_features.rpc_server) + | Some impl -> ( + match config.experimental_features.rpc_server with + | Resto -> return (Tezos_services.register_tezlink_services impl) + | Dream -> tzfail Node_error.Dream_rpc_tezlink) in (* If spawn_rpc is defined, use it as intermediate *) let rpc = -- GitLab