diff --git a/devtools/testnet_experiment_tools/dune b/devtools/testnet_experiment_tools/dune index da108e28e0a76b90197768aace209442cd7be7da..714dbc1d6b88d9d0285a5195ea373da3eca33339 100644 --- a/devtools/testnet_experiment_tools/dune +++ b/devtools/testnet_experiment_tools/dune @@ -7,6 +7,7 @@ tezt tezt-tezos octez-shell-libs.client-base-unix + octez-node-config octez-libs.base octez-libs.base.unix octez-libs.stdlib-unix diff --git a/devtools/testnet_experiment_tools/testnet_experiment_tools.ml b/devtools/testnet_experiment_tools/testnet_experiment_tools.ml index 1133bafdfbefd8e0a4b1c3975c57e78676cd193d..c70ac18f7aaa48bb89aef3bb2838e7195a85ef25 100644 --- a/devtools/testnet_experiment_tools/testnet_experiment_tools.ml +++ b/devtools/testnet_experiment_tools/testnet_experiment_tools.ml @@ -28,15 +28,18 @@ Invocation: dune exec devtools/testnet_experiment_tools/testnet_experiment_tools.exe Requirements: - GEN_KEYS_DIR - sets the directory to output generated keys. - Defaults to /tmp/ - BAKERS - sets the number of baker keys to generate. Defaults to 10. + OUTPUT_DIR - sets the directory to output generated outputs. + Defaults to /tmp/ + BAKERS - sets the number of baker keys to generate. + Defaults to 10. Description: This file contains scripts to generate config information towards bootstrapping an experimental test network. *) open Tezt open Tezt_tezos +open Tezos_crypto +module Node_config = Octez_node_config.Config_file let ensure_dir_exists dir = Lwt.catch @@ -59,16 +62,23 @@ let number_of_bakers = Sys.getenv_opt bakers |> Option.map int_of_string |> Option.value ~default:default_number_of_bakers -let default_gen_keys_dir = +let output_dir_name = "OUTPUT_DIR" + +let default_output_dir = let base_dir = Filename.temp_file ~temp_dir:"/tmp" "" "" in let _ = Lwt_unix.unlink base_dir in let _ = Lwt_unix.mkdir base_dir 0o700 in base_dir -let gen_keys_dir_name = "GEN_KEYS_DIR" +let output_dir = + Sys.getenv_opt output_dir_name |> Option.value ~default:default_output_dir + +let network_name_default = "TEZOS_EXPERIMENT_NET" -let gen_keys_dir = - Sys.getenv_opt gen_keys_dir_name |> Option.value ~default:default_gen_keys_dir +let network_name = + Sys.getenv_opt "NETWORK" |> Option.value ~default:network_name_default + +let genesis_prefix = "BLockGenesisGenesisGenesisGenesisGenesis" let generate_baker_accounts n client = let rec generate_baker_account i = @@ -82,19 +92,52 @@ let generate_baker_accounts n client = let* () = generate_baker_account (n - 1) in Lwt_io.printf "\n\n" +let rec genesis () = + let* time = Lwt_process.pread_line (Lwt_process.shell "date -u +%FT%TZ") in + let suffix = String.sub Digest.(to_hex (string time)) 0 5 in + match Base58.raw_decode (genesis_prefix ^ suffix ^ "crcCRC") with + | None -> genesis () + | Some p -> + let p = String.sub p 0 (String.length p - 4) in + let b58_block_hash = Base58.safe_encode p in + let block = + Tezos_crypto.Hashed.Block_hash.of_b58check_exn b58_block_hash + in + return (block, Tezos_base.Time.Protocol.of_notation_exn time) + +let save_config (Node_config.{data_dir; _} as configuration) = + let file = Filename.concat data_dir "config.json" in + let* () = + Lwt_io.printf + "Configuration for %s will be written in %s\n\n." + network_name + file + in + let* () = ensure_dir_exists data_dir in + let* res = + Lwt_utils_unix.with_atomic_open_out file @@ fun chan -> + let json = + Data_encoding.Json.construct Node_config.encoding configuration + in + let content = Data_encoding.Json.to_string json in + Lwt_utils_unix.write_string chan content + in + match res with + | Ok () -> Lwt.return_unit + | Error _e -> Test.fail "Cannot save configuration file" + (* These tests can be run locally to generate the data needed to run a stresstest. *) module Local = struct let format_baker_accounts () = - Format_baker_accounts.format_baker_accounts gen_keys_dir + Format_baker_accounts.format_baker_accounts output_dir let generate_baker_accounts n () = - let client_dir = gen_keys_dir in let* () = Lwt_io.printf "Keys will be saved in %s. You can change this by setting the \ - GEN_KEYS_DIR environment variable\n\n" - client_dir + OUTPUT_DIR environment variable\n\n" + output_dir in let* () = Lwt_io.printf @@ -102,12 +145,61 @@ module Local = struct the BAKERS environment variable.\n\n" number_of_bakers in - let client = Client.create ~base_dir:client_dir () in - let* () = ensure_dir_exists client_dir in + let client = Client.create ~base_dir:output_dir () in + let* () = ensure_dir_exists output_dir in let* () = generate_baker_accounts n client in Lwt.return_unit - let generate_network_configuration () = Test.fail "Not implemented" + let generate_network_configuration network_name data_dir () = + let protocol = + Tezos_crypto.Hashed.Protocol_hash.of_b58check_exn + "Ps9mPmXaRzmzk35gbAYNCAw6UXdE2qoABTHbN2oEEc1qM7CwT9P" + in + let* block, time = genesis () in + let genesis = Tezos_base.Genesis.{block; time; protocol} in + let chain_name = + Tezos_base.Distributed_db_version.Name.of_string network_name + in + let sandboxed_chain_name = + Tezos_base.Distributed_db_version.Name.of_string @@ network_name + ^ "_SANDBOXED" + in + let client = Client.create ~base_dir:output_dir () in + let baker_0 = baker_alias 0 in + let* {public_key = genesis_pubkey; _} = + Client.show_address ~alias:baker_0 client + in + let blockchain_network : Node_config.blockchain_network = + Node_config. + { + alias = None; + genesis; + chain_name; + sandboxed_chain_name; + old_chain_name = None; + incompatible_chain_name = None; + user_activated_upgrades = []; + user_activated_protocol_overrides = []; + default_bootstrap_peers = []; + dal_config = + { + activated = false; + use_mock_srs_for_testing = None; + bootstrap_peers = []; + }; + genesis_parameters = + Some + { + context_key = "sandbox_parameter"; + values = `O [("genesis_pubkey", `String genesis_pubkey)]; + }; + } + in + let node_configuration = + Node_config.{default_config with blockchain_network; data_dir} + in + let* () = save_config node_configuration in + Lwt.return_unit let generate_manager_operations () = Test.fail "Not implemented" end @@ -134,7 +226,7 @@ let () = ~__FILE__ ~title:"Generate Network Configuration" ~tags:["generate_network_configuration"] - Local.generate_network_configuration ; + (Local.generate_network_configuration network_name output_dir) ; register ~__FILE__ ~title:"Generate manager operations" diff --git a/manifest/main.ml b/manifest/main.ml index 18a406dba0d8a63b557e19b4a4acf89aa8cc9337..6f36a424afe24e10a37d6b2abba72f294205ca27 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -7315,6 +7315,7 @@ let _testnet_experiment_tools = tezt_lib |> open_ |> open_ ~m:"Base"; tezt_tezos; octez_client_base_unix |> open_; + octez_node_config; octez_base; octez_base_unix; octez_stdlib_unix |> open_;