From fd289068298d0dad84975cea08cf73339ef3a5a6 Mon Sep 17 00:00:00 2001 From: Guillaume Genestier Date: Wed, 26 Nov 2025 14:58:32 +0100 Subject: [PATCH 1/3] Tezt/Lib_tezos: Add the ability to use --produce-regularly in tezt --- tezt/lib_tezos/dal_node.ml | 30 ++++++++++++++++++++++++++++-- tezt/lib_tezos/dal_node.mli | 10 ++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tezt/lib_tezos/dal_node.ml b/tezt/lib_tezos/dal_node.ml index 9c2bd1c54d97..46da47d604a1 100644 --- a/tezt/lib_tezos/dal_node.ml +++ b/tezt/lib_tezos/dal_node.ml @@ -23,6 +23,12 @@ (* *) (*****************************************************************************) +type publish_slots_regularly = { + frequency : int; + slot_index : int; + secret_key : Account.secret_key; +} + module Parameters = struct type persistent_state = { data_dir : string; @@ -35,6 +41,7 @@ module Parameters = struct l1_node_endpoint : Endpoint.t; disable_shard_validation : bool; disable_amplification : bool; + publish_slots_regularly : publish_slots_regularly option; ignore_pkhs : string list option; mutable pending_ready : unit option Lwt.u list; runner : Runner.t option; @@ -58,6 +65,9 @@ let disable_shard_validation_environment_variable = let ignore_topics_environment_variable = "TEZOS_IGNORE_TOPICS_I_KNOW_WHAT_I_AM_DOING" +let allow_regular_publication_environment_variable = + "TEZOS_DAL_PUBLISH_REGULARLY_I_KNOW_WHAT_I_AM_DOING" + let check_error ?exit_code ?msg dal_node = match dal_node.status with | Not_running -> @@ -335,7 +345,8 @@ let handle_event dal_node {name; value = _; timestamp = _} = let create_from_endpoint ?runner ?path ?name ?color ?data_dir ?event_pipe ?(rpc_host = Constant.default_host) ?rpc_port ?listen_addr ?public_addr ?metrics_addr ?(disable_shard_validation = false) - ?(disable_amplification = false) ?ignore_pkhs ~l1_node_endpoint () = + ?(disable_amplification = false) ?ignore_pkhs ?publish_slots_regularly + ~l1_node_endpoint () = let name = match name with None -> fresh_name () | Some name -> name in let data_dir = match data_dir with None -> Temp.dir name | Some dir -> dir @@ -381,6 +392,7 @@ let create_from_endpoint ?runner ?path ?name ?color ?data_dir ?event_pipe ignore_pkhs; l1_node_endpoint; runner; + publish_slots_regularly; } in on_event dal_node (handle_event dal_node) ; @@ -390,7 +402,7 @@ let create_from_endpoint ?runner ?path ?name ?color ?data_dir ?event_pipe let create ?runner ?path ?name ?color ?data_dir ?event_pipe ?(rpc_host = Constant.default_host) ?rpc_port ?listen_addr ?public_addr ?metrics_addr ?disable_shard_validation ?disable_amplification ?ignore_pkhs - ~node () = + ?publish_slots_regularly ~node () = let l1_node_endpoint = Node.as_rpc_endpoint ~local:(Node.runner node = runner) node in @@ -409,6 +421,7 @@ let create ?runner ?path ?name ?color ?data_dir ?event_pipe ?disable_shard_validation ?disable_amplification ?ignore_pkhs + ?publish_slots_regularly ~l1_node_endpoint () @@ -441,6 +454,19 @@ let make_arguments node = ~none:[] ~some:(fun pkhs -> "--ignore-topics" :: [String.concat "," pkhs]) node.persistent_state.ignore_pkhs + @ Option.fold + ~none:[] + ~some:(fun {frequency; slot_index; secret_key} -> + match secret_key with + | Unencrypted secret_key -> + [ + "--publish-slots-regularly"; + Format.sprintf "%d-%d-%s" frequency slot_index secret_key; + ] + | _ -> + failwith + "Cannot publish slots regularly without unencrypted secret key") + node.persistent_state.publish_slots_regularly let do_runlike_command ?env ?(event_level = `Info) node arguments = if node.status <> Not_running then diff --git a/tezt/lib_tezos/dal_node.mli b/tezt/lib_tezos/dal_node.mli index 301d5f9d7cf2..d5dcabe1f621 100644 --- a/tezt/lib_tezos/dal_node.mli +++ b/tezt/lib_tezos/dal_node.mli @@ -38,6 +38,14 @@ val disable_shard_validation_environment_variable : string val ignore_topics_environment_variable : string +val allow_regular_publication_environment_variable : string + +type publish_slots_regularly = { + frequency : int; + slot_index : int; + secret_key : Account.secret_key; +} + (** Creates a DAL node *) val create : ?runner:Runner.t -> @@ -54,6 +62,7 @@ val create : ?disable_shard_validation:bool -> ?disable_amplification:bool -> ?ignore_pkhs:string list -> + ?publish_slots_regularly:publish_slots_regularly -> node:Node.t -> unit -> t @@ -73,6 +82,7 @@ val create_from_endpoint : ?disable_shard_validation:bool -> ?disable_amplification:bool -> ?ignore_pkhs:string list -> + ?publish_slots_regularly:publish_slots_regularly -> l1_node_endpoint:Endpoint.t -> unit -> t -- GitLab From c6eecfcf1ab97b6d3fbc045b3ab27123d0371846 Mon Sep 17 00:00:00 2001 From: Guillaume Genestier Date: Wed, 26 Nov 2025 14:58:32 +0100 Subject: [PATCH 2/3] Tezt_cloud: Add the produce_regularly in DAL node helpers --- tezt/tests/cloud/dal_node_helpers.ml | 19 ++++++++++++++++--- tezt/tests/cloud/dal_node_helpers.mli | 1 + tezt/tests/cloud/tezos.ml | 24 +++++++++++++++++++----- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/tezt/tests/cloud/dal_node_helpers.ml b/tezt/tests/cloud/dal_node_helpers.ml index a4e4267e0d58..35034ba3259a 100644 --- a/tezt/tests/cloud/dal_node_helpers.ml +++ b/tezt/tests/cloud/dal_node_helpers.ml @@ -120,8 +120,8 @@ let init_producer_accounts ~client ~producer_key ~dal_node_producers = let init_producer cloud ~data_dir ~simulate_network ~external_rpc ~network ~snapshot ~memtrace ~ppx_profiling_verbosity ~ppx_profiling_backends ~ignore_pkhs ~disable_shard_validation ~disable_amplification - ~node_p2p_endpoint ~dal_node_p2p_endpoint teztale account i slot_index agent - = + ~node_p2p_endpoint ~dal_node_p2p_endpoint ?publish_slots_regularly teztale + account i slot_index agent = let name = name_of_daemon (Producer_l1_node i) in let () = toplog "Initializing the DAL producer %s" name in let data_dir = data_dir |> Option.map (fun data_dir -> data_dir // name) in @@ -165,10 +165,22 @@ let init_producer cloud ~data_dir ~simulate_network ~external_rpc ~network ~disable_shard_validation ~disable_amplification ?ignore_pkhs + ?publish_slots_regularly: + (Option.map + (fun frequency -> + Dal_node. + {frequency; slot_index; secret_key = account.Account.secret_key}) + publish_slots_regularly) cloud agent in - let () = toplog "Init producer %s: init DAL node config" name in + let () = + toplog + "Init producer %s: init DAL node config (produce slots regularly set to \ + %b)" + name + (Option.is_some publish_slots_regularly) + in let* () = Dal_node.init_config ~expected_pow:(Network.expected_pow network) @@ -210,6 +222,7 @@ let init_producer cloud ~data_dir ~simulate_network ~external_rpc ~network ~event_level:`Notice ~disable_shard_validation ?ignore_pkhs + ~allow_publication_regularly:(Option.is_some publish_slots_regularly) ~ppx_profiling_verbosity ~ppx_profiling_backends dal_node diff --git a/tezt/tests/cloud/dal_node_helpers.mli b/tezt/tests/cloud/dal_node_helpers.mli index 5cad9042d6d0..92333913faa8 100644 --- a/tezt/tests/cloud/dal_node_helpers.mli +++ b/tezt/tests/cloud/dal_node_helpers.mli @@ -73,6 +73,7 @@ val init_producer : disable_amplification:bool -> node_p2p_endpoint:string -> dal_node_p2p_endpoint:string option -> + ?publish_slots_regularly:int -> Tezos.Teztale.t option -> Account.key -> int -> diff --git a/tezt/tests/cloud/tezos.ml b/tezt/tests/cloud/tezos.ml index 88c2309c69b2..7ebfc34f300c 100644 --- a/tezt/tests/cloud/tezos.ml +++ b/tezt/tests/cloud/tezos.ml @@ -31,6 +31,13 @@ module Env = struct "yes" env + let allow_publication_regularly_env enable env = + may_add + enable + Dal_node.allow_regular_publication_environment_variable + "yes" + env + let ignore_topics_env ignore_pkhs env = match ignore_pkhs with | Some (_ :: _) -> add Dal_node.ignore_topics_environment_variable "yes" env @@ -70,13 +77,15 @@ module Env = struct env |> add "PROFILING" verbosity |> add "PROFILING_BACKENDS" backends let initialize_env ~memtrace ~memtrace_output_filename - ~disable_shard_validation ~prometheus ~otel_endpoint ~service_name - ~ignore_pkhs ~(ppx_profiling_verbosity : string option) + ~disable_shard_validation ~allow_publication_regularly ~prometheus + ~otel_endpoint ~service_name ~ignore_pkhs + ~(ppx_profiling_verbosity : string option) ~(ppx_profiling_backends : string list) = empty |> memtrace_env memtrace memtrace_output_filename |> otel_env otel_endpoint service_name |> disable_shard_validation_env disable_shard_validation + |> allow_publication_regularly_env allow_publication_regularly |> ignore_topics_env ignore_pkhs |> ppx_profiler_env ?prometheus @@ -518,7 +527,7 @@ module Dal_node = struct let create_from_endpoint ?(group = "DAL") ?net_port ?(path = Uses.path Constant.octez_dal_node) ~name ?rpc_port ?disable_shard_validation ?disable_amplification ?ignore_pkhs - ~l1_node_endpoint cloud agent = + ?publish_slots_regularly ~l1_node_endpoint cloud agent = let* path = Agent.copy agent ~source:path in let binary_name = Filename.basename path in let* () = @@ -554,6 +563,7 @@ module Dal_node = struct ?disable_shard_validation ?disable_amplification ?ignore_pkhs + ?publish_slots_regularly ~l1_node_endpoint () in @@ -639,7 +649,8 @@ module Dal_node = struct Lwt.return node let create ?net_port ?path ~name ?disable_shard_validation - ?disable_amplification ?ignore_pkhs ~node cloud agent = + ?disable_amplification ?ignore_pkhs ?publish_slots_regularly ~node cloud + agent = let l1_node_endpoint = Node.as_rpc_endpoint ~local:(Node.runner node = Agent.runner agent) node in @@ -650,13 +661,15 @@ module Dal_node = struct ?disable_shard_validation ?disable_amplification ?ignore_pkhs + ?publish_slots_regularly ~l1_node_endpoint cloud agent let run ?prometheus ?otel ?(memtrace = false) ?wait_ready ?event_level ?(disable_shard_validation = false) ?ignore_pkhs - ~ppx_profiling_verbosity ~ppx_profiling_backends dal_node = + ?(allow_publication_regularly = false) ~ppx_profiling_verbosity + ~ppx_profiling_backends dal_node = let service_name = name dal_node in let memtrace_output_filename = Format.asprintf "%s/%s-trace.ctf" Path.tmp_dir service_name @@ -666,6 +679,7 @@ module Dal_node = struct ~memtrace ~memtrace_output_filename ~disable_shard_validation + ~allow_publication_regularly ~prometheus ~otel_endpoint:otel ~service_name -- GitLab From 644c741666ac4ce88c3f7cf8c4892e91b85a6ad4 Mon Sep 17 00:00:00 2001 From: Guillaume Genestier Date: Wed, 26 Nov 2025 14:58:33 +0100 Subject: [PATCH 3/3] Tezt_cloud/DAL: Use produce_regularly to produce from the DAL node instead of relying on the orchestrator --- tezt/tests/cloud/dal.ml | 8 ++++++++ tezt/tests/cloud/scenarios_cli.ml | 11 +++++++++++ tezt/tests/cloud/scenarios_configuration.ml | 20 ++++++++++++++++---- tezt/tests/cloud/scenarios_configuration.mli | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/tezt/tests/cloud/dal.ml b/tezt/tests/cloud/dal.ml index 8975e51e5445..4f1ee91e57dc 100644 --- a/tezt/tests/cloud/dal.ml +++ b/tezt/tests/cloud/dal.ml @@ -20,6 +20,7 @@ type configuration = { bakers : string list; (* unencrypted secret keys *) stake_machine_type : string list; dal_node_producers : int list; (* slot indices *) + publish_slots_regularly : bool; observer_slot_indices : int list; observers_multi_slot_indices : int list list; archivers_slot_indices : int list list; @@ -954,6 +955,10 @@ let init ~(configuration : configuration) etherlink_configuration cloud ~disable_amplification:configuration.disable_amplification ~node_p2p_endpoint:bootstrap.node_p2p_endpoint ~dal_node_p2p_endpoint:bootstrap.dal_node_p2p_endpoint + ?publish_slots_regularly: + (if configuration.publish_slots_regularly then + Some configuration.producers_delay + else None) teztale account i @@ -1245,6 +1250,7 @@ let rec loop t level = if Dal_node_helpers.producers_not_ready ~producers:t.producers then ( toplog "Producers not ready for level %d" level ; Lwt.return_unit) + else if t.configuration.publish_slots_regularly then Lwt.return_unit else Seq.ints 0 |> Seq.take (List.length t.configuration.dal_node_producers) @@ -1349,6 +1355,7 @@ let register (module Cli : Scenarios_cli.Dal) = let number_of_slots = Cli.number_of_slots in let attestation_lag = Cli.attestation_lag in let traps_fraction = Cli.traps_fraction in + let publish_slots_regularly = Cli.publish_slots_regularly in let t = { with_dal; @@ -1389,6 +1396,7 @@ let register (module Cli : Scenarios_cli.Dal) = number_of_slots; attestation_lag; traps_fraction; + publish_slots_regularly; } in (t, etherlink) diff --git a/tezt/tests/cloud/scenarios_cli.ml b/tezt/tests/cloud/scenarios_cli.ml index abd1b8eecb4b..e74c042e1ab0 100644 --- a/tezt/tests/cloud/scenarios_cli.ml +++ b/tezt/tests/cloud/scenarios_cli.ml @@ -162,6 +162,8 @@ module type Dal = sig val config : Scenarios_configuration.DAL.t val traps_fraction : Q.t option + + val publish_slots_regularly : bool end module Dal () : Dal = struct @@ -785,6 +787,15 @@ module Dal () : Dal = struct () in Option.fold ~none:config.traps_fraction ~some:Option.some from_cli + + let publish_slots_regularly = + Clap.flag + ~section + ~set_long:"publish-slots-regularly" + ~description: + "Let the DAL node handle autonomously (i.e without orchestration) the \ + publication of slots at a regular frequency" + config.publish_slots_regularly end module type Layer1 = sig diff --git a/tezt/tests/cloud/scenarios_configuration.ml b/tezt/tests/cloud/scenarios_configuration.ml index fd10c850b5ef..a494d7616848 100644 --- a/tezt/tests/cloud/scenarios_configuration.ml +++ b/tezt/tests/cloud/scenarios_configuration.ml @@ -54,6 +54,7 @@ module DAL = struct number_of_slots : int option; attestation_lag : int option; traps_fraction : Q.t option; + publish_slots_regularly : bool; } let encoding = @@ -113,6 +114,7 @@ module DAL = struct number_of_slots; attestation_lag; traps_fraction; + publish_slots_regularly; } -> ( ( ( ( blocks_history, @@ -155,7 +157,11 @@ module DAL = struct ppx_profiling_backends, enable_network_health_monitoring ), tezlink ) ) ), - (slot_size, number_of_slots, attestation_lag, traps_fraction) )) + ( slot_size, + number_of_slots, + attestation_lag, + traps_fraction, + publish_slots_regularly ) )) (fun ( ( ( ( blocks_history, producer_key, fundraiser, @@ -196,7 +202,11 @@ module DAL = struct ppx_profiling_backends, enable_network_health_monitoring ), tezlink ) ) ), - (slot_size, number_of_slots, attestation_lag, traps_fraction) ) + ( slot_size, + number_of_slots, + attestation_lag, + traps_fraction, + publish_slots_regularly ) ) -> { blocks_history; @@ -246,6 +256,7 @@ module DAL = struct number_of_slots; attestation_lag; traps_fraction; + publish_slots_regularly; }) (merge_objs (merge_objs @@ -301,11 +312,12 @@ module DAL = struct (dft "ppx_profiling_backends" (list string) []) (opt "enable_network_health_monitoring" bool)) (obj1 (opt "tezlink" bool))))) - (obj4 + (obj5 (opt "slot_size" int31) (opt "number_of_slots" int31) (opt "attestation_lag" int31) - (opt "traps_fraction" q_encoding))) + (opt "traps_fraction" q_encoding) + (dft "publish_slots_regularly" bool false))) end module LAYER1 = struct diff --git a/tezt/tests/cloud/scenarios_configuration.mli b/tezt/tests/cloud/scenarios_configuration.mli index 4d42a7b4468b..61d56697d852 100644 --- a/tezt/tests/cloud/scenarios_configuration.mli +++ b/tezt/tests/cloud/scenarios_configuration.mli @@ -54,6 +54,7 @@ module DAL : sig number_of_slots : int option; attestation_lag : int option; traps_fraction : Q.t option; + publish_slots_regularly : bool; } val encoding : t Data_encoding.t -- GitLab