From 8f1c9c76c6cf79ee2080ce52479b7ed6c0f62668 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 15:30:22 +0200 Subject: [PATCH 01/13] Tezlink/Node: isolate dream / resto vs Michelson check --- etherlink/bin_node/lib_dev/rpc_server.ml | 11 ++++------- etherlink/bin_node/lib_dev/rpc_types.ml | 6 ++++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index 71e7a2f20387..dc28bd41d54a 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -163,14 +163,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 = + let*? () = Rpc_types.check_rpc_server_config rpc_server_family config in + let register_tezos_services = match tezlink_services with - | 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) + | 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 = diff --git a/etherlink/bin_node/lib_dev/rpc_types.ml b/etherlink/bin_node/lib_dev/rpc_types.ml index 180c66db9a9e..9cab54bb6012 100644 --- a/etherlink/bin_node/lib_dev/rpc_types.ml +++ b/etherlink/bin_node/lib_dev/rpc_types.ml @@ -14,3 +14,9 @@ type rpc_server_family = | Multichain_sequencer_rpc_server | Single_chain_node_rpc_server of L2_types.chain_family + +let check_rpc_server_config rpc_server_family (config : Configuration.t) = + match (rpc_server_family, config.experimental_features.rpc_server) with + | Single_chain_node_rpc_server L2_types.Michelson, Dream -> + Result_syntax.tzfail Node_error.Dream_rpc_tezlink + | _ -> Result_syntax.return_unit -- GitLab From 7c8ad7e772e0ba3aacd8ef2333d9b582d6ec8d72 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 15:55:23 +0200 Subject: [PATCH 02/13] Tezlink/Node: remove tezlink_impl argument --- etherlink/bin_node/lib_dev/observer.ml | 5 ----- etherlink/bin_node/lib_dev/proxy.ml | 6 ------ etherlink/bin_node/lib_dev/rpc.ml | 4 ---- etherlink/bin_node/lib_dev/rpc_server.ml | 15 ++++++++++----- etherlink/bin_node/lib_dev/rpc_server.mli | 1 - 5 files changed, 10 insertions(+), 21 deletions(-) diff --git a/etherlink/bin_node/lib_dev/observer.ml b/etherlink/bin_node/lib_dev/observer.ml index 3343d04d8e31..39e180e42c61 100644 --- a/etherlink/bin_node/lib_dev/observer.ml +++ b/etherlink/bin_node/lib_dev/observer.ml @@ -264,11 +264,6 @@ 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) - else None) Stateless config tx_container diff --git a/etherlink/bin_node/lib_dev/proxy.ml b/etherlink/bin_node/lib_dev/proxy.ml index f7e77850047b..e256c0fefc8a 100644 --- a/etherlink/bin_node/lib_dev/proxy.ml +++ b/etherlink/bin_node/lib_dev/proxy.ml @@ -213,12 +213,6 @@ 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)) - else None) validation_mode config tx_container diff --git a/etherlink/bin_node/lib_dev/rpc.ml b/etherlink/bin_node/lib_dev/rpc.ml index 90d94430c2b0..1e48ae755188 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -232,10 +232,6 @@ 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 = L2_types.Michelson then - Some Tezlink_services_impl.(michelson_services_methods rpc_backend) - else None) Stateless rpc_config tx_container diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index dc28bd41d54a..483cc013e384 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -144,8 +144,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 ?tezlink_services ?data_dir - validation (config : Configuration.t) tx_container ctxt = + ?delegate_health_check_to ?evm_services ?data_dir validation + (config : Configuration.t) tx_container ctxt = let open Lwt_result_syntax in let*! can_start_performance_metrics = Octez_performance_metrics.supports_performance_metrics () @@ -165,9 +165,14 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) in let*? () = Rpc_types.check_rpc_server_config rpc_server_family config 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 + match rpc_server_family with + | Rpc_types.Single_chain_node_rpc_server L2_types.Michelson -> + let backend, _ = ctxt in + Tezos_services.register_tezlink_services + (Tezlink_services_impl.michelson_services_methods backend) + | Single_chain_node_rpc_server L2_types.EVM + | Multichain_sequencer_rpc_server -> + Evm_directory.empty config.experimental_features.rpc_server in (* If spawn_rpc is defined, use it as intermediate *) let rpc = diff --git a/etherlink/bin_node/lib_dev/rpc_server.mli b/etherlink/bin_node/lib_dev/rpc_server.mli index 0068aadea958..99c7fb7476df 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.mli +++ b/etherlink/bin_node/lib_dev/rpc_server.mli @@ -48,7 +48,6 @@ 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 102ac6962134b5c4cad5b4e461053f51fda302e7 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 17:56:05 +0200 Subject: [PATCH 03/13] Tezlink/Node: define level in tezos_types --- .../bin_node/lib_dev/tezlink/tezos_types.ml | 2 ++ .../bin_node/lib_dev/tezlink/tezos_types.mli | 13 +++++++++++++ .../bin_node/lib_dev/tezlink_services_impl.ml | 11 ++++++----- etherlink/bin_node/lib_dev/tezos_services.ml | 5 +---- etherlink/bin_node/lib_dev/tezos_services.mli | 16 ++-------------- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml b/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml index 3dd32129b9e0..55369da2d202 100644 --- a/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml +++ b/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml @@ -4,3 +4,5 @@ (* Copyright (c) 2025 Functori *) (* *) (*****************************************************************************) + +type level = {level : int32; cycle : int32; cycle_position : int32} diff --git a/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli b/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli index 3dd32129b9e0..c67f78cb5d05 100644 --- a/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli +++ b/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli @@ -4,3 +4,16 @@ (* Copyright (c) 2025 Functori *) (* *) (*****************************************************************************) + +type level = { + level : int32; + (** The level of the block relative to genesis. This + is also the Shell's notion of level. *) + cycle : int32; + (** The current cycle's number. Note that cycles are a protocol-specific + notion. As a result, the cycle number starts at 0 with the first block of + the first version of protocol alpha. *) + cycle_position : int32; + (** The current level of the block relative to the first block of the current + cycle. *) +} diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index 87004ccd23e9..eb7bedf703d0 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -44,11 +44,12 @@ let current_level (module Backend : Services_backend_sig.S) chain block 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; - } + Tezos_types. + { + level; + cycle = Int32.div level constants.blocks_per_cycle; + cycle_position = Int32.rem level constants.blocks_per_cycle; + } let constants chain block = let open Lwt_result_syntax in diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index acbbbc8bc2ff..1fbea2316c6a 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -11,10 +11,7 @@ module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters module Imported_env = Tezos_protocol_environment_021_PsQuebec module Alpha_context = Imported_protocol.Alpha_context -(* The output type of the current_level service but with less duplicated - information. Can be changed, as long as the [conversion_encoding] is also - changed. *) -type level = {level : int32; cycle : int32; cycle_position : int32} +type level = Tezos_types.level type error += Serialization_for_conversion of string * string diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index 7ecc6c0a130c..7911f0b66a09 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -36,19 +36,6 @@ module Protocol_types : sig end end -type level = { - level : int32; - (** The level of the block relative to genesis. This - is also the Shell's notion of level. *) - cycle : int32; - (** The current cycle's number. Note that cycles are a protocol-specific - notion. As a result, the cycle number starts at 0 with the first block of - the first version of protocol alpha. *) - cycle_position : int32; - (** The current level of the block relative to the first block of the current - cycle. *) -} - (* Query types *) type level_query = {offset : int32} @@ -62,7 +49,8 @@ type contract = Imported_protocol.Alpha_context.Contract.t (** Container for the implementations necessary to answer tezos RPC requests. *) type tezos_services_implementation = { - current_level : chain -> block -> level_query -> level tzresult Lwt.t; + current_level : + chain -> block -> level_query -> Tezos_types.level tzresult Lwt.t; version : unit -> Tezlink_version.version tzresult Lwt.t; protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; balance : -- GitLab From 156e32c6178d4be0ec42bb957ffdfdb28eac6148 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Wed, 9 Apr 2025 15:12:20 +0200 Subject: [PATCH 04/13] Tezlink/Node: move convert_using_serialization --- .../bin_node/lib_dev/tezlink/tezos_types.ml | 39 +++++++++++++++ .../bin_node/lib_dev/tezlink/tezos_types.mli | 11 +++++ etherlink/bin_node/lib_dev/tezos_services.ml | 49 ++----------------- 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml b/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml index 55369da2d202..2834d2252a47 100644 --- a/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml +++ b/etherlink/bin_node/lib_dev/tezlink/tezos_types.ml @@ -6,3 +6,42 @@ (*****************************************************************************) type level = {level : int32; cycle : int32; cycle_position : int32} + +type error += Serialization_for_conversion of string * string + +let () = + register_error_kind + `Permanent + ~id:"evm_node.dev.tezlink.conversion_failure" + ~title:"Failed to convert a value through serialization" + ~description: + "Failed to convert a value to a protocol private datatype through \ + serialization." + ~pp:(fun ppf (name, error) -> + Format.fprintf + ppf + "Failed to convert a value of type %s to a protocol private datatype \ + through serialization: %s" + name + error) + Data_encoding.(obj2 (req "type_name" string) (req "error_msg" string)) + (function + | Serialization_for_conversion (name, error) -> Some (name, error) + | _ -> None) + (fun (name, error) -> Serialization_for_conversion (name, error)) + +let convert_using_serialization ~name ~dst ~src value = + let open Result_syntax in + let* bytes = + Data_encoding.Binary.to_bytes src value + |> Result.map_error_e (fun e -> + tzfail + @@ Serialization_for_conversion + ( name, + Format.asprintf "%a" Data_encoding.Binary.pp_write_error e )) + in + Data_encoding.Binary.of_bytes dst bytes + |> Result.map_error_e (fun e -> + tzfail + @@ Serialization_for_conversion + (name, Format.asprintf "%a" Data_encoding.Binary.pp_read_error e)) diff --git a/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli b/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli index c67f78cb5d05..243009e432d1 100644 --- a/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli +++ b/etherlink/bin_node/lib_dev/tezlink/tezos_types.mli @@ -17,3 +17,14 @@ type level = { (** The current level of the block relative to the first block of the current cycle. *) } + +(** [convert_using_serialization ~dst ~src value] Conversion from one type with + encoding [src] to another with encoding [dst], through serialization. + Costly, but useful to build instances of a type when no builder is + accessible. *) +val convert_using_serialization : + name:string -> + dst:'a Data_encoding.t -> + src:'b Data_encoding.t -> + 'b -> + 'a tzresult diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 1fbea2316c6a..68be7ce35236 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -13,49 +13,6 @@ module Alpha_context = Imported_protocol.Alpha_context type level = Tezos_types.level -type error += Serialization_for_conversion of string * string - -let () = - register_error_kind - `Permanent - ~id:"evm_node.dev.tezlink.conversion_failure" - ~title:"Failed to convert a value through serialization" - ~description: - "Failed to convert a value to a protocol private datatype through \ - serialization." - ~pp:(fun ppf (name, error) -> - Format.fprintf - ppf - "Failed to convert a value of type %s to a protocol private datatype \ - through serialization: %s" - name - error) - Data_encoding.(obj2 (req "type_name" string) (req "error_msg" string)) - (function - | Serialization_for_conversion (name, error) -> Some (name, error) - | _ -> None) - (fun (name, error) -> Serialization_for_conversion (name, error)) - -(** [convert_using_serialization ~dst ~src value] Conversion from one type with - encoding [src] to another with encoding [dst], through serialization. - Costly, but useful to build instances of a type when no builder is - accessible. *) -let convert_using_serialization ~name ~dst ~src value = - let open Result_syntax in - let* bytes = - Data_encoding.Binary.to_bytes src value - |> Result.map_error_e (fun e -> - tzfail - @@ Serialization_for_conversion - ( name, - Format.asprintf "%a" Data_encoding.Binary.pp_write_error e )) - in - Data_encoding.Binary.of_bytes dst bytes - |> Result.map_error_e (fun e -> - tzfail - @@ Serialization_for_conversion - (name, Format.asprintf "%a" Data_encoding.Binary.pp_read_error e)) - (* Module importing, amending, and converting, protocol types. Those types might be difficult to actually build, so we define conversion function from local types to protocol types. *) @@ -107,7 +64,7 @@ module Protocol_types = struct (req "expected_commitment" bool)) let convert : level -> t tzresult = - convert_using_serialization + Tezos_types.convert_using_serialization ~name:"level" ~dst:encoding ~src:conversion_encoding @@ -150,7 +107,7 @@ module Protocol_types = struct (req "smart_rollup_max_number_of_messages_per_level" n)) let values_to_fixed = - convert_using_serialization + Tezos_types.convert_using_serialization ~name:"values_to_fixed" ~dst:Alpha_context.Constants.fixed_encoding ~src:fixed_values_encoding @@ -165,7 +122,7 @@ module Protocol_types = struct (req "parametric" Alpha_context.Constants.Parametric.encoding)) let convert : t -> Alpha_context.Constants.t tzresult = - convert_using_serialization + Tezos_types.convert_using_serialization ~name:"constants" ~dst:Alpha_context.Constants.encoding ~src:constants_encoding -- GitLab From 8a4d7fe269666c231f440a43de6ae535577670dd Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 18:01:19 +0200 Subject: [PATCH 05/13] Tezlink/Node: Imported protocol accessible in constants --- .../bin_node/lib_dev/tezlink_constants.ml | 54 +++++++++++++++-- etherlink/bin_node/lib_dev/tezlink_imports.ml | 12 ++++ .../bin_node/lib_dev/tezlink_services_impl.ml | 10 +--- etherlink/bin_node/lib_dev/tezos_services.ml | 59 +------------------ etherlink/bin_node/lib_dev/tezos_services.mli | 17 +----- 5 files changed, 69 insertions(+), 83 deletions(-) create mode 100644 etherlink/bin_node/lib_dev/tezlink_imports.ml diff --git a/etherlink/bin_node/lib_dev/tezlink_constants.ml b/etherlink/bin_node/lib_dev/tezlink_constants.ml index 41c72d552f93..fee13bc9dc14 100644 --- a/etherlink/bin_node/lib_dev/tezlink_constants.ml +++ b/etherlink/bin_node/lib_dev/tezlink_constants.ml @@ -4,10 +4,56 @@ (* Copyright (c) 2025 Nomadic Labs *) (* *) (*****************************************************************************) +open Tezlink_imports -let mainnet = - Tezos_services.Imported_protocol_parameters.Default_parameters - .constants_mainnet +type fixed = Alpha_context.Constants.fixed + +type parametric = Alpha_context.Constants.Parametric.t + +type t = {fixed : fixed; parametric : parametric} + +let fixed_values_encoding = + let open Data_encoding in + merge_objs + (obj10 + (req "proof_of_work_nonce_size" uint8) + (req "nonce_length" uint8) + (req "max_anon_ops_per_block" uint8) + (req "max_operation_data_length" int31) + (req "max_proposals_per_delegate" uint8) + (req "max_micheline_node_count" int31) + (req "max_micheline_bytes_limit" int31) + (req "max_allowed_global_constants_depth" int31) + (req "cache_layout_size" uint8) + (req "michelson_maximum_type_size" uint16)) + (obj4 + (req "max_slashing_period" uint8) + (req "smart_rollup_max_wrapped_proof_binary_size" int31) + (req "smart_rollup_message_size_limit" int31) + (req "smart_rollup_max_number_of_messages_per_level" n)) + +let values_to_fixed = + Tezos_types.convert_using_serialization + ~name:"values_to_fixed" + ~dst:Alpha_context.Constants.fixed_encoding + ~src:fixed_values_encoding + +let constants_encoding = + let open Data_encoding in + conv + (fun {fixed; parametric} -> (fixed, parametric)) + (fun (fixed, parametric) -> {fixed; parametric}) + (obj2 + (req "fixed" Alpha_context.Constants.fixed_encoding) + (req "parametric" Alpha_context.Constants.Parametric.encoding)) + +let convert : t -> Alpha_context.Constants.t tzresult = + Tezos_types.convert_using_serialization + ~name:"constants" + ~dst:Alpha_context.Constants.encoding + ~src:constants_encoding + +let mainnet = Imported_protocol_parameters.Default_parameters.constants_mainnet let ( proof_of_work_nonce_size, nonce_length, @@ -23,7 +69,7 @@ let ( proof_of_work_nonce_size, sc_max_wrapped_proof_binary_size, sc_rollup_message_size_limit, sc_rollup_max_number_of_messages_per_level ) = - Tezos_services.Imported_protocol.Constants_repr. + Imported_protocol.Constants_repr. ( proof_of_work_nonce_size, nonce_length, max_anon_ops_per_block, diff --git a/etherlink/bin_node/lib_dev/tezlink_imports.ml b/etherlink/bin_node/lib_dev/tezlink_imports.ml new file mode 100644 index 000000000000..d2795cee6404 --- /dev/null +++ b/etherlink/bin_node/lib_dev/tezlink_imports.ml @@ -0,0 +1,12 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +module Imported_protocol = Tezos_protocol_021_PsQuebec.Protocol +module Imported_protocol_plugin = Tezos_protocol_plugin_021_PsQuebec +module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters +module Imported_env = Tezos_protocol_environment_021_PsQuebec +module Alpha_context = Imported_protocol.Alpha_context diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index eb7bedf703d0..cfbe41dfb2b8 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -10,8 +10,6 @@ open Tezos_services let current_level (module Backend : Services_backend_sig.S) chain block level_query = let open Lwt_result_syntax in - let constants = Tezlink_constants.mainnet in - let* offset = (* Tezos l1 requires non-negative offset #7845 *) if level_query.offset >= 0l then return level_query.offset @@ -42,6 +40,7 @@ let current_level (module Backend : Services_backend_sig.S) chain block let current_block_number = Z.to_int32 current_block_number in + let constants = Tezlink_constants.mainnet in let level = Int32.add current_block_number offset in return Tezos_types. @@ -90,9 +89,7 @@ let constants chain block = in let* fixed = - match - Tezos_services.Protocol_types.Constants.values_to_fixed fixed_values - with + match Tezlink_constants.values_to_fixed fixed_values with | Ok fixed -> return fixed | Error err -> failwith @@ -101,8 +98,7 @@ let constants chain block = err in return - Tezos_services.Protocol_types.Constants. - {fixed; parametric = Tezlink_constants.mainnet} + Tezlink_constants.{fixed; parametric = Tezlink_constants.mainnet} let michelson_services_methods backend = { diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 68be7ce35236..7fd235362329 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -5,11 +5,7 @@ (* *) (*****************************************************************************) -module Imported_protocol = Tezos_protocol_021_PsQuebec.Protocol -module Imported_protocol_plugin = Tezos_protocol_plugin_021_PsQuebec -module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters -module Imported_env = Tezos_protocol_environment_021_PsQuebec -module Alpha_context = Imported_protocol.Alpha_context +include Tezlink_imports type level = Tezos_types.level @@ -78,55 +74,6 @@ module Protocol_types = struct |> Option.value ~default:Alpha_context.Tez.zero |> Result_syntax.return end - - module Constants = struct - type fixed = Alpha_context.Constants.fixed - - type parametric = Alpha_context.Constants.Parametric.t - - type t = {fixed : fixed; parametric : parametric} - - let fixed_values_encoding = - let open Data_encoding in - merge_objs - (obj10 - (req "proof_of_work_nonce_size" uint8) - (req "nonce_length" uint8) - (req "max_anon_ops_per_block" uint8) - (req "max_operation_data_length" int31) - (req "max_proposals_per_delegate" uint8) - (req "max_micheline_node_count" int31) - (req "max_micheline_bytes_limit" int31) - (req "max_allowed_global_constants_depth" int31) - (req "cache_layout_size" uint8) - (req "michelson_maximum_type_size" uint16)) - (obj4 - (req "max_slashing_period" uint8) - (req "smart_rollup_max_wrapped_proof_binary_size" int31) - (req "smart_rollup_message_size_limit" int31) - (req "smart_rollup_max_number_of_messages_per_level" n)) - - let values_to_fixed = - Tezos_types.convert_using_serialization - ~name:"values_to_fixed" - ~dst:Alpha_context.Constants.fixed_encoding - ~src:fixed_values_encoding - - let constants_encoding = - let open Data_encoding in - conv - (fun {fixed; parametric} -> (fixed, parametric)) - (fun (fixed, parametric) -> {fixed; parametric}) - (obj2 - (req "fixed" Alpha_context.Constants.fixed_encoding) - (req "parametric" Alpha_context.Constants.Parametric.encoding)) - - let convert : t -> Alpha_context.Constants.t tzresult = - Tezos_types.convert_using_serialization - ~name:"constants" - ~dst:Alpha_context.Constants.encoding - ~src:constants_encoding - end end (** [wrap conversion service_implementation] changes the output type @@ -303,7 +250,7 @@ type tezos_services_implementation = { protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; balance : chain -> block -> contract -> Ethereum_types.quantity tzresult Lwt.t; - constants : chain -> block -> Protocol_types.Constants.t tzresult Lwt.t; + constants : chain -> block -> Tezlink_constants.t tzresult Lwt.t; } (** Builds the directory registering services under `/chains/
/blocks//...`. *) @@ -327,7 +274,7 @@ let build_block_dir impl = |> register_with_conversion ~service:Imported_services.constants ~impl:(fun {block; chain} () () -> impl.constants chain block) - ~convert_output:Protocol_types.Constants.convert + ~convert_output:Tezlink_constants.convert (** Builds the root director. *) let build_dir impl = diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index 7911f0b66a09..535659cff43c 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -21,21 +21,6 @@ module Tezlink_version : sig val mock : version end -module Protocol_types : sig - module Constants : sig - type fixed = Alpha_context.Constants.fixed - - type parametric = Alpha_context.Constants.Parametric.t - - type t = {fixed : fixed; parametric : parametric} - - val values_to_fixed : - (int * int * int * int * int * int * int * int * int * int) - * (int * int * int * Z.t) -> - (fixed, error trace) result - end -end - (* Query types *) type level_query = {offset : int32} @@ -55,7 +40,7 @@ type tezos_services_implementation = { protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; balance : chain -> block -> contract -> Ethereum_types.quantity tzresult Lwt.t; - constants : chain -> block -> Protocol_types.Constants.t tzresult Lwt.t; + constants : chain -> block -> Tezlink_constants.t tzresult Lwt.t; } (* THIS IS THE ENTRYPOINT *) -- GitLab From f766dc528819a965a9af4fb1aaf0c2b99d8bbee8 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 18:08:32 +0200 Subject: [PATCH 06/13] Tezlink/Node: dont rely on level_query type --- etherlink/bin_node/lib_dev/tezlink_services_impl.ml | 6 +++--- etherlink/bin_node/lib_dev/tezos_services.ml | 7 ++----- etherlink/bin_node/lib_dev/tezos_services.mli | 7 +------ 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index cfbe41dfb2b8..24d8d7fff852 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -7,12 +7,12 @@ open Tezos_services -let current_level (module Backend : Services_backend_sig.S) chain block - level_query = +let current_level (module Backend : Services_backend_sig.S) chain block ~offset + = let open Lwt_result_syntax in let* offset = (* Tezos l1 requires non-negative offset #7845 *) - if level_query.offset >= 0l then return level_query.offset + if offset >= 0l then return offset else failwith "The specified level offset should be positive." in diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 7fd235362329..9a6c126276ad 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -241,11 +241,8 @@ let block_directory_path = Tezos_shell_services.Chain_services.path Tezos_shell_services.Block_services.path -type level_query = Imported_services.level_query = {offset : int32} - type tezos_services_implementation = { - current_level : - chain -> block -> Imported_services.level_query -> level tzresult Lwt.t; + current_level : chain -> block -> offset:int32 -> level tzresult Lwt.t; version : unit -> Tezlink_version.version tzresult Lwt.t; protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; balance : @@ -262,7 +259,7 @@ let build_block_dir impl = |> register_with_conversion ~service:Imported_services.current_level ~impl:(fun {block; chain} query () -> - impl.current_level chain block query) + impl.current_level chain block ~offset:query.offset) ~convert_output:Protocol_types.Level.convert |> register ~service:Imported_services.protocols ~impl:(fun _ _ () -> impl.protocols ()) diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index 535659cff43c..f06d402df2e1 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -21,11 +21,6 @@ module Tezlink_version : sig val mock : version end -(* Query types *) -type level_query = {offset : int32} - -(* Param types *) - type block = Tezos_shell_services.Block_services.block type chain = Tezos_shell_services.Chain_services.chain @@ -35,7 +30,7 @@ type contract = Imported_protocol.Alpha_context.Contract.t (** Container for the implementations necessary to answer tezos RPC requests. *) type tezos_services_implementation = { current_level : - chain -> block -> level_query -> Tezos_types.level tzresult Lwt.t; + chain -> block -> offset:int32 -> Tezos_types.level tzresult Lwt.t; version : unit -> Tezlink_version.version tzresult Lwt.t; protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; balance : -- GitLab From 2ecce0c8eba10dcdcf1905e3c216dd9d7f0c7df8 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 18:20:39 +0200 Subject: [PATCH 07/13] Tezlink/Node: remove dependency of tezlink_service_impl --- etherlink/bin_node/lib_dev/rpc_server.ml | 3 +- .../bin_node/lib_dev/tezlink_services_impl.ml | 19 +--------- etherlink/bin_node/lib_dev/tezos_services.ml | 17 ++++++++- etherlink/bin_node/lib_dev/tezos_services.mli | 36 ++----------------- 4 files changed, 20 insertions(+), 55 deletions(-) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index 483cc013e384..d1d97d29c453 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -168,8 +168,7 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) match rpc_server_family with | Rpc_types.Single_chain_node_rpc_server L2_types.Michelson -> let backend, _ = ctxt in - Tezos_services.register_tezlink_services - (Tezlink_services_impl.michelson_services_methods backend) + Tezos_services.register_tezlink_services backend | Single_chain_node_rpc_server L2_types.EVM | Multichain_sequencer_rpc_server -> Evm_directory.empty config.experimental_features.rpc_server diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index 24d8d7fff852..add6c3f081f6 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -5,8 +5,6 @@ (* *) (*****************************************************************************) -open Tezos_services - let current_level (module Backend : Services_backend_sig.S) chain block ~offset = let open Lwt_result_syntax in @@ -97,19 +95,4 @@ let constants chain block = Error_monad.pp_print_trace err in - return - Tezlink_constants.{fixed; parametric = Tezlink_constants.mainnet} - -let michelson_services_methods backend = - { - current_level = current_level backend; - version = - (fun () -> - (* TODO: #7857 need proper implementation *) - Lwt_result_syntax.return Tezlink_version.mock); - protocols = (fun () -> Lwt_result_syntax.return Tezlink_protocols.current); - balance = - (fun _ _ _ -> - Lwt_result_syntax.return @@ Ethereum_types.quantity_of_z Z.one); - constants; - } + return Tezlink_constants.{fixed; parametric = Tezlink_constants.mainnet} diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 9a6c126276ad..d2dc91e94051 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -250,6 +250,20 @@ type tezos_services_implementation = { constants : chain -> block -> Tezlink_constants.t tzresult Lwt.t; } +let michelson_services_methods backend = + { + current_level = Tezlink_services_impl.current_level backend; + version = + (fun () -> + (* TODO: #7857 need proper implementation *) + Lwt_result_syntax.return Tezlink_version.mock); + protocols = (fun () -> Lwt_result_syntax.return Tezlink_protocols.current); + balance = + (fun _ _ _ -> + Lwt_result_syntax.return @@ Ethereum_types.quantity_of_z Z.one); + constants = Tezlink_services_impl.constants; + } + (** Builds the directory registering services under `/chains/
/blocks//...`. *) let build_block_dir impl = let dir : tezlink_rpc_context Tezos_rpc.Directory.t = @@ -291,7 +305,8 @@ let build_dir impl = let tezlink_root = Tezos_rpc.Path.(open_root / "tezlink") (* module entrypoint *) -let register_tezlink_services impl = +let register_tezlink_services backend = + let impl = michelson_services_methods backend in let directory = build_dir impl in let directory = Tezos_rpc.Directory.register_describe_directory_service diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index f06d402df2e1..a4de087a97ee 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -5,38 +5,6 @@ (* *) (*****************************************************************************) -module Imported_protocol = Tezos_protocol_021_PsQuebec.Protocol -module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters -module Alpha_context = Imported_protocol.Alpha_context - -module Tezlink_protocols : sig - type protocols - - val current : protocols -end - -module Tezlink_version : sig - type version - - val mock : version -end - -type block = Tezos_shell_services.Block_services.block - -type chain = Tezos_shell_services.Chain_services.chain - -type contract = Imported_protocol.Alpha_context.Contract.t - -(** Container for the implementations necessary to answer tezos RPC requests. *) -type tezos_services_implementation = { - current_level : - chain -> block -> offset:int32 -> Tezos_types.level tzresult Lwt.t; - version : unit -> Tezlink_version.version tzresult Lwt.t; - protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; - balance : - chain -> block -> contract -> Ethereum_types.quantity tzresult Lwt.t; - constants : chain -> block -> Tezlink_constants.t tzresult Lwt.t; -} - (* THIS IS THE ENTRYPOINT *) -val register_tezlink_services : tezos_services_implementation -> Evm_directory.t +val register_tezlink_services : + (module Services_backend_sig.S) -> Evm_directory.t -- GitLab From cc5655a2ae391e711ca70433591b1e2993a8fd2d Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Tue, 8 Apr 2025 18:29:44 +0200 Subject: [PATCH 08/13] Tezlink/Node: remove implementation record --- etherlink/bin_node/lib_dev/tezos_services.ml | 56 ++++++++------------ 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index d2dc91e94051..89bb35d1aeaa 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -231,41 +231,23 @@ module Imported_services = struct import_service Constants_services.all end -type block = Tezos_shell_services.Block_services.block - -type chain = Tezos_shell_services.Chain_services.chain - let block_directory_path = Tezos_rpc.Path.subst2 @@ Tezos_rpc.Path.prefix Tezos_shell_services.Chain_services.path Tezos_shell_services.Block_services.path -type tezos_services_implementation = { - current_level : chain -> block -> offset:int32 -> level tzresult Lwt.t; - version : unit -> Tezlink_version.version tzresult Lwt.t; - protocols : unit -> Tezlink_protocols.protocols tzresult Lwt.t; - balance : - chain -> block -> contract -> Ethereum_types.quantity tzresult Lwt.t; - constants : chain -> block -> Tezlink_constants.t tzresult Lwt.t; -} +let protocols () = Lwt_result_syntax.return Tezlink_protocols.current -let michelson_services_methods backend = - { - current_level = Tezlink_services_impl.current_level backend; - version = - (fun () -> - (* TODO: #7857 need proper implementation *) - Lwt_result_syntax.return Tezlink_version.mock); - protocols = (fun () -> Lwt_result_syntax.return Tezlink_protocols.current); - balance = - (fun _ _ _ -> - Lwt_result_syntax.return @@ Ethereum_types.quantity_of_z Z.one); - constants = Tezlink_services_impl.constants; - } +let balance _ _ _ = + Lwt_result_syntax.return @@ Ethereum_types.quantity_of_z Z.one + +let version () = + (* TODO: #7857 need proper implementation *) + Lwt_result_syntax.return Tezlink_version.mock (** Builds the directory registering services under `/chains/
/blocks//...`. *) -let build_block_dir impl = +let build_block_dir backend = let dir : tezlink_rpc_context Tezos_rpc.Directory.t = Tezos_rpc.Directory.empty in @@ -273,23 +255,28 @@ let build_block_dir impl = |> register_with_conversion ~service:Imported_services.current_level ~impl:(fun {block; chain} query () -> - impl.current_level chain block ~offset:query.offset) + Tezlink_services_impl.current_level + backend + chain + block + ~offset:query.offset) ~convert_output:Protocol_types.Level.convert |> register ~service:Imported_services.protocols ~impl:(fun _ _ () -> - impl.protocols ()) + protocols ()) |> register_with_conversion ~service:Imported_services.balance ~impl:(fun ({block; chain}, contract) _ _ -> - impl.balance chain block contract) + balance chain block contract) ~convert_output:Protocol_types.Tez.convert |> register_with_conversion ~service:Imported_services.constants - ~impl:(fun {block; chain} () () -> impl.constants chain block) + ~impl:(fun {block; chain} () () -> + Tezlink_services_impl.constants chain block) ~convert_output:Tezlink_constants.convert (** Builds the root director. *) -let build_dir impl = - let helper_dir = build_block_dir impl in +let build_dir backend = + let helper_dir = build_block_dir backend in let root_directory = Tezos_rpc.Directory.prefix block_directory_path @@ -300,14 +287,13 @@ let build_dir impl = Tezos_rpc.Directory.register root_directory Imported_services.version - (fun () () () -> impl.version ()) + (fun () () () -> version ()) let tezlink_root = Tezos_rpc.Path.(open_root / "tezlink") (* module entrypoint *) let register_tezlink_services backend = - let impl = michelson_services_methods backend in - let directory = build_dir impl in + let directory = build_dir backend in let directory = Tezos_rpc.Directory.register_describe_directory_service directory -- GitLab From eb51021cdf8c495d129028eb48918c250a7695fb Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Mon, 14 Apr 2025 18:07:46 +0200 Subject: [PATCH 09/13] Tezlink/Node: introduce Tezlink_backend --- etherlink/bin_node/lib_dev/rpc_server.ml | 5 +- .../bin_node/lib_dev/services_backend_sig.ml | 8 + .../bin_node/lib_dev/tezlink_backend_sig.ml | 17 ++ .../bin_node/lib_dev/tezlink_services_impl.ml | 177 ++++++++++-------- etherlink/bin_node/lib_dev/tezos_services.ml | 11 +- etherlink/bin_node/lib_dev/tezos_services.mli | 2 +- 6 files changed, 127 insertions(+), 93 deletions(-) create mode 100644 etherlink/bin_node/lib_dev/tezlink_backend_sig.ml diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index d1d97d29c453..238513a3c33f 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -167,8 +167,9 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) let register_tezos_services = match rpc_server_family with | Rpc_types.Single_chain_node_rpc_server L2_types.Michelson -> - let backend, _ = ctxt in - Tezos_services.register_tezlink_services backend + let (module Backend : Services_backend_sig.S), _ = ctxt in + Tezos_services.register_tezlink_services + (module Backend.Tezlink_backend) | Single_chain_node_rpc_server L2_types.EVM | Multichain_sequencer_rpc_server -> Evm_directory.empty config.experimental_features.rpc_server diff --git a/etherlink/bin_node/lib_dev/services_backend_sig.ml b/etherlink/bin_node/lib_dev/services_backend_sig.ml index f99833856940..4bcb1718dc47 100644 --- a/etherlink/bin_node/lib_dev/services_backend_sig.ml +++ b/etherlink/bin_node/lib_dev/services_backend_sig.ml @@ -40,6 +40,8 @@ module type S = sig module Block_storage : Block_storage_sig.S + module Tezlink_backend : Tezlink_backend_sig.S + (** [balance address block_param] returns the [address]'s balance at block [block_param]. *) val balance : @@ -177,6 +179,12 @@ module Make (Backend : Backend) (Executor : Evm_execution.S) : S = struct include Publisher.Make (Backend.TxEncoder) (Backend.Publisher) include Simulator.Make (Backend.SimulatorBackend) + module Tezlink_backend = Tezlink_services_impl.Make (struct + include Backend.Reader + + let block_param_to_block_number = Backend.block_param_to_block_number + end) + let block_param_to_block_number = Backend.block_param_to_block_number include Tracer_sig.Make (Executor) (Block_storage) (Backend.Tracer) diff --git a/etherlink/bin_node/lib_dev/tezlink_backend_sig.ml b/etherlink/bin_node/lib_dev/tezlink_backend_sig.ml new file mode 100644 index 000000000000..3d25fd3bf5f2 --- /dev/null +++ b/etherlink/bin_node/lib_dev/tezlink_backend_sig.ml @@ -0,0 +1,17 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2025 Nomadic Labs *) +(* *) +(*****************************************************************************) + +module type S = sig + val current_level : + [> `Main] -> + [> `Head of 'a] -> + offset:int32 -> + Tezos_types.level tzresult Lwt.t + + val constants : + [> `Main] -> [> `Head of 'a] -> Tezlink_constants.t tzresult Lwt.t +end diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index add6c3f081f6..bd205cb45077 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -5,94 +5,107 @@ (* *) (*****************************************************************************) -let current_level (module Backend : Services_backend_sig.S) chain block ~offset - = - let open Lwt_result_syntax in - let* offset = - (* Tezos l1 requires non-negative offset #7845 *) - if offset >= 0l then return offset - else failwith "The specified level offset should be positive." - in +module type Backend = sig + include Durable_storage.READER - (* 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 + val block_param_to_block_number : + Ethereum_types.Block_parameter.extended -> + Ethereum_types.quantity tzresult Lwt.t +end - (* 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 +module Make (Backend : Backend) : Tezlink_backend_sig.S = struct + let current_level chain block ~offset = + let open Lwt_result_syntax in + let* offset = + (* Tezos l1 requires non-negative offset #7845 *) + if offset >= 0l then return offset + else failwith "The specified level offset should be positive." + in - let* (Qty current_block_number) = - Backend.block_param_to_block_number (Block_parameter Latest) - 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 - let current_block_number = Z.to_int32 current_block_number 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 constants = Tezlink_constants.mainnet in - let level = Int32.add current_block_number offset in - return - Tezos_types. - { - level; - cycle = Int32.div level constants.blocks_per_cycle; - cycle_position = Int32.rem level constants.blocks_per_cycle; - } + let* (Qty current_block_number) = + Backend.block_param_to_block_number (Block_parameter Latest) + in -let constants chain block = - 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 + let current_block_number = Z.to_int32 current_block_number 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 constants = Tezlink_constants.mainnet in + let level = Int32.add current_block_number offset in + return + Tezos_types. + { + level; + cycle = Int32.div level constants.blocks_per_cycle; + cycle_position = Int32.rem level constants.blocks_per_cycle; + } - let fixed_values = - Tezlink_constants. - ( ( proof_of_work_nonce_size, - nonce_length, - max_anon_ops_per_block, - max_operation_data_length, - max_proposals_per_delegate, - max_micheline_node_count, - max_micheline_bytes_limit, - max_allowed_global_constant_depth, - cache_layout_size, - michelson_maximum_type_size ), - ( max_slashing_period, - sc_max_wrapped_proof_binary_size, - sc_rollup_message_size_limit, - sc_rollup_max_number_of_messages_per_level ) ) - in + let constants chain block = + 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 - let* fixed = - match Tezlink_constants.values_to_fixed fixed_values with - | Ok fixed -> return fixed - | Error err -> - failwith - "Failed to get fixed constants: %a" - Error_monad.pp_print_trace - err - in - return Tezlink_constants.{fixed; parametric = Tezlink_constants.mainnet} + (* 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 fixed_values = + Tezlink_constants. + ( ( proof_of_work_nonce_size, + nonce_length, + max_anon_ops_per_block, + max_operation_data_length, + max_proposals_per_delegate, + max_micheline_node_count, + max_micheline_bytes_limit, + max_allowed_global_constant_depth, + cache_layout_size, + michelson_maximum_type_size ), + ( max_slashing_period, + sc_max_wrapped_proof_binary_size, + sc_rollup_message_size_limit, + sc_rollup_max_number_of_messages_per_level ) ) + in + + let* fixed = + match Tezlink_constants.values_to_fixed fixed_values with + | Ok fixed -> return fixed + | Error err -> + failwith + "Failed to get fixed constants: %a" + Error_monad.pp_print_trace + err + in + return Tezlink_constants.{fixed; parametric = Tezlink_constants.mainnet} +end diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index 89bb35d1aeaa..fe3d2ab7b722 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -247,7 +247,7 @@ let version () = Lwt_result_syntax.return Tezlink_version.mock (** Builds the directory registering services under `/chains/
/blocks//...`. *) -let build_block_dir backend = +let build_block_dir (module Backend : Tezlink_backend_sig.S) = let dir : tezlink_rpc_context Tezos_rpc.Directory.t = Tezos_rpc.Directory.empty in @@ -255,11 +255,7 @@ let build_block_dir backend = |> register_with_conversion ~service:Imported_services.current_level ~impl:(fun {block; chain} query () -> - Tezlink_services_impl.current_level - backend - chain - block - ~offset:query.offset) + Backend.current_level chain block ~offset:query.offset) ~convert_output:Protocol_types.Level.convert |> register ~service:Imported_services.protocols ~impl:(fun _ _ () -> protocols ()) @@ -270,8 +266,7 @@ let build_block_dir backend = ~convert_output:Protocol_types.Tez.convert |> register_with_conversion ~service:Imported_services.constants - ~impl:(fun {block; chain} () () -> - Tezlink_services_impl.constants chain block) + ~impl:(fun {block; chain} () () -> Backend.constants chain block) ~convert_output:Tezlink_constants.convert (** Builds the root director. *) diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index a4de087a97ee..35d451312c0f 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -7,4 +7,4 @@ (* THIS IS THE ENTRYPOINT *) val register_tezlink_services : - (module Services_backend_sig.S) -> Evm_directory.t + (module Tezlink_backend_sig.S) -> Evm_directory.t -- GitLab From bba82ed4beea6bcf4b9ae92418421de033376b79 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Mon, 14 Apr 2025 18:15:03 +0200 Subject: [PATCH 10/13] Tezlink/Node: remove dependency between Tezos_service and Evm_directory --- etherlink/bin_node/lib_dev/rpc_server.ml | 5 +++-- etherlink/bin_node/lib_dev/tezos_services.ml | 2 +- etherlink/bin_node/lib_dev/tezos_services.mli | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/etherlink/bin_node/lib_dev/rpc_server.ml b/etherlink/bin_node/lib_dev/rpc_server.ml index 238513a3c33f..b7e2606226d6 100644 --- a/etherlink/bin_node/lib_dev/rpc_server.ml +++ b/etherlink/bin_node/lib_dev/rpc_server.ml @@ -168,8 +168,9 @@ let start_public_server ~(rpc_server_family : Rpc_types.rpc_server_family) match rpc_server_family with | Rpc_types.Single_chain_node_rpc_server L2_types.Michelson -> let (module Backend : Services_backend_sig.S), _ = ctxt in - Tezos_services.register_tezlink_services - (module Backend.Tezlink_backend) + Evm_directory.init_from_resto_directory + @@ Tezos_services.register_tezlink_services + (module Backend.Tezlink_backend) | Single_chain_node_rpc_server L2_types.EVM | Multichain_sequencer_rpc_server -> Evm_directory.empty config.experimental_features.rpc_server diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index fe3d2ab7b722..7f8ad776c998 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -295,4 +295,4 @@ let register_tezlink_services backend = Tezos_rpc.Service.description_service in let tezlink_directory = Tezos_rpc.Directory.prefix tezlink_root directory in - Evm_directory.init_from_resto_directory tezlink_directory + tezlink_directory diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index 35d451312c0f..abf7bb537174 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -7,4 +7,4 @@ (* THIS IS THE ENTRYPOINT *) val register_tezlink_services : - (module Tezlink_backend_sig.S) -> Evm_directory.t + (module Tezlink_backend_sig.S) -> unit Tezos_rpc.Directory.t -- GitLab From b097772e74965da04857ece19c23279ac437634d Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Mon, 14 Apr 2025 18:17:06 +0200 Subject: [PATCH 11/13] Tezlink/Node: move tezlink modules to tezlink lib --- etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_backend_sig.ml | 0 etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_constants.ml | 0 etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_imports.ml | 0 etherlink/bin_node/lib_dev/{ => tezlink}/tezos_services.ml | 0 etherlink/bin_node/lib_dev/{ => tezlink}/tezos_services.mli | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_backend_sig.ml (100%) rename etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_constants.ml (100%) rename etherlink/bin_node/lib_dev/{ => tezlink}/tezlink_imports.ml (100%) rename etherlink/bin_node/lib_dev/{ => tezlink}/tezos_services.ml (100%) rename etherlink/bin_node/lib_dev/{ => tezlink}/tezos_services.mli (100%) diff --git a/etherlink/bin_node/lib_dev/tezlink_backend_sig.ml b/etherlink/bin_node/lib_dev/tezlink/tezlink_backend_sig.ml similarity index 100% rename from etherlink/bin_node/lib_dev/tezlink_backend_sig.ml rename to etherlink/bin_node/lib_dev/tezlink/tezlink_backend_sig.ml diff --git a/etherlink/bin_node/lib_dev/tezlink_constants.ml b/etherlink/bin_node/lib_dev/tezlink/tezlink_constants.ml similarity index 100% rename from etherlink/bin_node/lib_dev/tezlink_constants.ml rename to etherlink/bin_node/lib_dev/tezlink/tezlink_constants.ml diff --git a/etherlink/bin_node/lib_dev/tezlink_imports.ml b/etherlink/bin_node/lib_dev/tezlink/tezlink_imports.ml similarity index 100% rename from etherlink/bin_node/lib_dev/tezlink_imports.ml rename to etherlink/bin_node/lib_dev/tezlink/tezlink_imports.ml diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezlink/tezos_services.ml similarity index 100% rename from etherlink/bin_node/lib_dev/tezos_services.ml rename to etherlink/bin_node/lib_dev/tezlink/tezos_services.ml diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezlink/tezos_services.mli similarity index 100% rename from etherlink/bin_node/lib_dev/tezos_services.mli rename to etherlink/bin_node/lib_dev/tezlink/tezos_services.mli -- GitLab From 1b8d953a2094b0da88124699dd23b3ddc596ad5b Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Mon, 14 Apr 2025 18:21:50 +0200 Subject: [PATCH 12/13] Tezlink/Node: add dependencies to lib_dev/tezlink --- etherlink/bin_node/lib_dev/tezlink/dune | 6 +++++- manifest/product_etherlink.ml | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/etherlink/bin_node/lib_dev/tezlink/dune b/etherlink/bin_node/lib_dev/tezlink/dune index 200c00f192a7..bdf25c46a7f4 100644 --- a/etherlink/bin_node/lib_dev/tezlink/dune +++ b/etherlink/bin_node/lib_dev/tezlink/dune @@ -6,9 +6,13 @@ (public_name octez-evm-node-libs.evm_node_lib_dev_tezlink) (instrumentation (backend bisect_ppx)) (libraries + octez-evm-node-libs.evm_node_lib_dev_encoding octez-protocol-021-PsQuebec-libs.plugin tezos-protocol-021-PsQuebec.parameters - octez-libs.base) + octez-libs.base + octez-shell-libs.shell-services + octez-libs.version) (flags (:standard) + -open Evm_node_lib_dev_encoding -open Tezos_base.TzPervasives)) diff --git a/manifest/product_etherlink.ml b/manifest/product_etherlink.ml index 130a369b30cc..300a265ee36f 100644 --- a/manifest/product_etherlink.ml +++ b/manifest/product_etherlink.ml @@ -245,9 +245,12 @@ let evm_node_lib_dev_tezlink = ~synopsis:"Tezlink dependencies for the EVM node" ~deps: [ + evm_node_lib_dev_encoding |> open_; tezlink_protocol_plugin; tezlink_protocol_parameters; octez_base |> open_ ~m:"TzPervasives"; + octez_shell_services; + octez_version; ] let evm_node_config = -- GitLab From c452ca8bb8da0639463d1e8e4b1da24a35267d78 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Mon, 14 Apr 2025 18:39:27 +0200 Subject: [PATCH 13/13] Etherlink/Node: remove unnecessary dependencies --- etherlink/bin_node/lib_dev/dune | 4 +--- manifest/product_etherlink.ml | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/etherlink/bin_node/lib_dev/dune b/etherlink/bin_node/lib_dev/dune index d027c1e0d87a..ad08e5d9dcfd 100644 --- a/etherlink/bin_node/lib_dev/dune +++ b/etherlink/bin_node/lib_dev/dune @@ -37,9 +37,7 @@ tezos-dal-node-services octez-evm-node-libs.evm_node_supported_installers octez-evm-node-libs.evm_node_wasm_runtime - octez-performance-metrics - octez-libs.version - octez-shell-libs.shell-services) + octez-performance-metrics) (flags (:standard) -open Tezos_base.TzPervasives diff --git a/manifest/product_etherlink.ml b/manifest/product_etherlink.ml index 300a265ee36f..ed5a79d0ea26 100644 --- a/manifest/product_etherlink.ml +++ b/manifest/product_etherlink.ml @@ -310,8 +310,6 @@ let evm_node_lib_dev = supported_installers; wasm_runtime; performance_metrics; - octez_version; - octez_shell_services; ] let evm_node_lib_dev_client = -- GitLab