From 24a450b957e6355e1655e4e5959c219d0d4c9a05 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Wed, 19 Mar 2025 17:12:09 +0100 Subject: [PATCH 1/4] Tezlink/Node: add version and shell service dependencie --- etherlink/bin_node/lib_dev/dune | 4 +++- manifest/product_etherlink.ml | 2 ++ manifest/product_octez.mli | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/etherlink/bin_node/lib_dev/dune b/etherlink/bin_node/lib_dev/dune index 7ee561a10155..a34006c2442a 100644 --- a/etherlink/bin_node/lib_dev/dune +++ b/etherlink/bin_node/lib_dev/dune @@ -38,7 +38,9 @@ octez-evm-node-libs.evm_node_wasm_runtime octez-performance-metrics octez-protocol-021-PsQuebec-libs.plugin - tezos-protocol-021-PsQuebec.parameters) + tezos-protocol-021-PsQuebec.parameters + octez-libs.version + octez-shell-libs.shell-services) (flags (:standard) -open Tezos_base.TzPervasives diff --git a/manifest/product_etherlink.ml b/manifest/product_etherlink.ml index 284781d82ad0..bdc60b13764d 100644 --- a/manifest/product_etherlink.ml +++ b/manifest/product_etherlink.ml @@ -295,6 +295,8 @@ let evm_node_lib_dev = performance_metrics; plugin; parameters; + octez_version; + octez_shell_services; ] let evm_node_lib_dev_client = diff --git a/manifest/product_octez.mli b/manifest/product_octez.mli index f06e1f7b2c8c..0191df52d8a9 100644 --- a/manifest/product_octez.mli +++ b/manifest/product_octez.mli @@ -83,6 +83,8 @@ val octez_stdlib_unix : Manifest.target val octez_test_helpers : Manifest.target +val octez_version : Manifest.target + val octez_version_value : Manifest.target val octez_workers : Manifest.target -- GitLab From 58f13608d8af3a63f1ce4a2db4b490d28b084026 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Thu, 20 Mar 2025 13:14:43 +0100 Subject: [PATCH 2/4] Tezlink/Node: add prefix to all tezlink rpc --- etherlink/bin_node/lib_dev/tezos_services.ml | 5 ++++- etherlink/tezt/tests/evm_sequencer.ml | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index b7b4a903b1d0..a6f1aa4b4bd9 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -195,7 +195,10 @@ let build_dir impl = (fun (((), chain), block) -> make_env chain block) helper_dir) +let tezlink_root = Tezos_rpc.Path.(open_root / "tezlink") + (* module entrypoint *) let register_tezlink_services impl = - let tezlink_directory = build_dir impl in + let directory = build_dir impl in + let tezlink_directory = Tezos_rpc.Directory.prefix tezlink_root directory in Evm_directory.init_from_resto_directory tezlink_directory diff --git a/etherlink/tezt/tests/evm_sequencer.ml b/etherlink/tezt/tests/evm_sequencer.ml index 646b2db2194d..dcd15015ebe4 100644 --- a/etherlink/tezt/tests/evm_sequencer.ml +++ b/etherlink/tezt/tests/evm_sequencer.ml @@ -569,7 +569,8 @@ let test_current_level = |> Option.value ~default:"" in let path = - "/chains/main/blocks/" ^ block ^ "/helpers/current_level" ^ offset_str + "/tezlink/chains/main/blocks/" ^ block ^ "/helpers/current_level" + ^ offset_str in let* res = Curl.get_raw ~args:["-v"] (Evm_node.endpoint sequencer ^ path) -- GitLab From 3070793cb106206f9b9452beff912a4921b7d13a Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Wed, 19 Mar 2025 17:12:56 +0100 Subject: [PATCH 3/4] Tezlink/node: register version service --- .../bin_node/lib_dev/tezlink_services_impl.ml | 8 +++- etherlink/bin_node/lib_dev/tezos_services.ml | 48 +++++++++++++++++-- etherlink/bin_node/lib_dev/tezos_services.mli | 7 +++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml index 34bece1d50bc..a9445116a647 100644 --- a/etherlink/bin_node/lib_dev/tezlink_services_impl.ml +++ b/etherlink/bin_node/lib_dev/tezlink_services_impl.ml @@ -46,4 +46,10 @@ let current_level (module Backend : Services_backend_sig.S) } let michelson_services_methods backend constants = - {current_level = current_level backend constants} + { + current_level = current_level backend constants; + version = + (fun () -> + (* TODO: #7857 need proper implementation *) + Lwt_result_syntax.return Tezlink_version.mock); + } diff --git a/etherlink/bin_node/lib_dev/tezos_services.ml b/etherlink/bin_node/lib_dev/tezos_services.ml index a6f1aa4b4bd9..cbb57181fae9 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.ml +++ b/etherlink/bin_node/lib_dev/tezos_services.ml @@ -141,6 +141,27 @@ let make_env (chain : Tezos_shell_services.Chain_services.chain) tezlink_rpc_context Lwt.t = Lwt.return {block; chain} +module Tezlink_version = struct + type version = Tezos_version.Octez_node_version.t = { + version : Tezos_version.Version.t; + network_version : Tezos_version.Network_version.t; + commit_info : commit_info option; + } + + and commit_info = Tezos_version.Octez_node_version.commit_info = { + commit_hash : string; + commit_date : string; + } + + let mock = + Tezos_version. + { + version = Tezos_version_parser.default; + network_version = Network_version.Internal_for_tests.mock (); + commit_info = Some {commit_hash = ""; commit_date = ""}; + } +end + (* This is where we import service declarations from the protocol. *) module Imported_services = struct module Protocol_plugin_services = Imported_protocol_plugin.RPC.S @@ -156,6 +177,16 @@ module Imported_services = struct Protocol_types.Level.t ) Tezos_rpc.Service.t = import_service Protocol_plugin_services.current_level + + let version : + ( [`GET], + unit, + unit, + unit, + unit, + Tezlink_version.version ) + Tezos_rpc.Service.t = + Tezos_shell_services.Version_services.S.version end type block = Tezos_shell_services.Block_services.block @@ -173,6 +204,7 @@ 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; + version : unit -> Tezlink_version.version tzresult Lwt.t; } (** Builds the directory registering services under `.../helpers`. *) @@ -189,11 +221,17 @@ let build_helper_dir impl = (** Builds the root director. *) let build_dir impl = let helper_dir = build_helper_dir impl in - Tezos_rpc.Directory.prefix - block_directory_path - (Tezos_rpc.Directory.map - (fun (((), chain), block) -> make_env chain block) - helper_dir) + let root_directory = + Tezos_rpc.Directory.prefix + block_directory_path + (Tezos_rpc.Directory.map + (fun (((), chain), block) -> make_env chain block) + helper_dir) + in + Tezos_rpc.Directory.register + root_directory + Imported_services.version + (fun () () () -> impl.version ()) let tezlink_root = Tezos_rpc.Path.(open_root / "tezlink") diff --git a/etherlink/bin_node/lib_dev/tezos_services.mli b/etherlink/bin_node/lib_dev/tezos_services.mli index e7f429fe709f..8942a6cf66ba 100644 --- a/etherlink/bin_node/lib_dev/tezos_services.mli +++ b/etherlink/bin_node/lib_dev/tezos_services.mli @@ -8,6 +8,12 @@ module Imported_protocol = Tezos_protocol_021_PsQuebec module Imported_protocol_parameters = Tezos_protocol_021_PsQuebec_parameters +module Tezlink_version : sig + type version + + val mock : version +end + type level = { level : int32; (** The level of the block relative to genesis. This @@ -33,6 +39,7 @@ type chain = Tezos_shell_services.Chain_services.chain (** Container for the implementations necessary to answer tezos RPC requests. *) type tezos_services_implementation = { current_level : chain -> block -> level_query -> level tzresult Lwt.t; + version : unit -> Tezlink_version.version tzresult Lwt.t; } (* THIS IS THE ENTRYPOINT *) -- GitLab From a8a888b6cc0579fd4d7912be8e8abe6ec2232487 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Cornilleau Date: Thu, 20 Mar 2025 17:43:33 +0100 Subject: [PATCH 4/4] Tezlink/tezt: test version rpc --- etherlink/tezt/tests/evm_sequencer.ml | 148 +++++++++++++++++++++++++- 1 file changed, 147 insertions(+), 1 deletion(-) diff --git a/etherlink/tezt/tests/evm_sequencer.ml b/etherlink/tezt/tests/evm_sequencer.ml index dcd15015ebe4..18880d11a3d6 100644 --- a/etherlink/tezt/tests/evm_sequencer.ml +++ b/etherlink/tezt/tests/evm_sequencer.ml @@ -629,6 +629,151 @@ let test_current_level = (* TODO: #7845 what should be result of offset goes past 0 ? *) unit +let test_tezlink_version = + let chain_family = "Michelson" in + Protocol.register_test + ~__FILE__ + ~title:"Test of the version rpc" + ~tags:["evm"; "tezlink"; "rpc"; "version"] + ~uses:(fun _protocol -> + [ + Constant.octez_evm_node; + Constant.octez_smart_rollup_node; + Constant.WASM.evm_kernel; + Constant.smart_rollup_installer; + ]) + @@ fun protocol -> + (* Setup: TODO: refactor once generic setup !17201 is merged *) + let* node, client = setup_l1 protocol in + + (* Random chain id, let's not take one that could have been set by default (1, 42, 1337) *) + let chain_id_1 = 2988 in + + (* Configuration files for the two l2 chains and for the rollup *) + let l2_config_1 = Temp.file "l2-chain-1-config.yaml" in + let rollup_config = Temp.file "rollup-chain-config.yaml" in + + (* Argument for the l2 chain, a bootstrap account and a new world_state_path *) + let world_state_path = "/test/chain/" in + let address = Eth_account.bootstrap_accounts.(0).address in + let*! () = + Evm_node.make_l2_kernel_installer_config + ~chain_id:chain_id_1 + ~chain_family + ~world_state_path + ~bootstrap_accounts:[address] + ~output:l2_config_1 + () + in + let*! () = + Evm_node.make_kernel_installer_config + (* No need for a real sequencer governance *) + ~sequencer_governance:"KT1" + ~l2_chain_ids:[chain_id_1] + ~output:rollup_config + (* we enable the multichain feature flag in the kernel *) + ~enable_multichain:true + () + in + + (* Setup the rollup (Origination and Start a rollup node) *) + let sc_rollup_node = + Sc_rollup_node.create + ~default_operator:Constant.bootstrap1.public_key_hash + Batcher + node + ~base_dir:(Client.base_dir client) + in + + let preimages_dir = Sc_rollup_node.data_dir sc_rollup_node // "wasm_2_0_0" in + let kernel = Constant.WASM.evm_kernel in + let* {output = kernel; _} = + prepare_installer_kernel_with_multiple_setup_file + ~output:(Temp.file "kernel.hex") + ~preimages_dir + ~configs:[rollup_config; l2_config_1] + (Uses.path kernel) + in + let* sc_rollup_address = + originate_sc_rollup + ~keys:[] + ~kind:"wasm_2_0_0" + ~boot_sector:("file:" ^ kernel) + ~parameters_ty:Test_helpers.evm_type + client + in + let* () = + Sc_rollup_node.run sc_rollup_node sc_rollup_address [Log_kernel_debug] + in + + (* Setup a sequencer with a private rpc port to verify the durable storage. *) + let sequencer = + Evm_node.Sequencer + { + initial_kernel = kernel; + preimage_dir = Some preimages_dir; + private_rpc_port = Some (Port.fresh ()); + time_between_blocks = Some Nothing; + sequencer = Constant.bootstrap1.alias; + genesis_timestamp = None; + max_blueprints_lag = None; + max_blueprints_ahead = None; + max_blueprints_catchup = None; + catchup_cooldown = None; + max_number_of_chunks = None; + wallet_dir = Some (Client.base_dir client); + tx_pool_timeout_limit = None; + tx_pool_addr_limit = None; + tx_pool_tx_per_addr_limit = None; + dal_slots = None; + } + in + let rpc_port = Port.fresh () in + (* we activate the experimental feature in the sequencer necessary to have the + tezlink rpc server + - l2 chains + - spawn rpc *) + let patch_config = + JSON.update "experimental_features" @@ fun json -> + JSON.( + put + ( "l2_chains", + JSON.annotate ~origin:"evm_node.config_patch" + @@ `A [`O [("chain_id", `String (string_of_int chain_id_1))]] ) + json) + |> JSON.( + put + ( "spawn_rpc", + JSON.annotate ~origin:"evm_node.config_patch" + @@ `O [("protected_port", `Float (float_of_int rpc_port))] )) + in + let* sequencer = + Evm_node.init + ~mode:sequencer + ~patch_config + ~spawn_rpc:rpc_port + (Sc_rollup_node.endpoint sc_rollup_node) + in + + (* end of setup *) + + (* call the version rpc and parse the result *) + let rpc_version () = + let path = "/tezlink/version" in + let* res = + Curl.get_raw ~args:["-v"] (Evm_node.endpoint sequencer ^ path) + |> Runnable.run + in + return @@ JSON.parse ~origin:"curl_version" res + in + + let* res = rpc_version () in + Check.( + JSON.(res |-> "version" |-> "major" |> as_int = 0) + int + ~error_msg:"Expected version %R but got %L") ; + unit + let test_make_l2_kernel_installer_config chain_family = Protocol.register_test ~__FILE__ @@ -12344,4 +12489,5 @@ let () = test_withdrawal_events [Alpha] ; test_fa_deposit_and_withdrawals_events [Alpha] ; test_current_level protocols ; - test_block_producer_validation [Alpha] + test_block_producer_validation [Alpha] ; + test_tezlink_version protocols -- GitLab