diff --git a/docs/doc_gen/node_helpers.ml b/docs/doc_gen/node_helpers.ml index ad9916fdde9431a46088e38ee7d62a0c1f4c7378..94e1fc9f22778b4c57ee74058e853e21bd57d4c2 100644 --- a/docs/doc_gen/node_helpers.ml +++ b/docs/doc_gen/node_helpers.ml @@ -56,6 +56,7 @@ let with_node f = target = None; disable_mempool = true; enable_testchain = false; + dal = Tezos_crypto_dal.Cryptobox.Config.default; } in let* node = diff --git a/src/bin_dal_node/daemon.ml b/src/bin_dal_node/daemon.ml index 2b9ce41049ccde413ae831153cd611a3b65989a6..dfe8cd142c1edd8554487c56834927b463fe5ba2 100644 --- a/src/bin_dal_node/daemon.ml +++ b/src/bin_dal_node/daemon.ml @@ -57,16 +57,13 @@ let init_cryptobox unsafe_srs cctxt (module Plugin : Dal_plugin.T) = let open Cryptobox in let open Lwt_result_syntax in let* parameters = Plugin.get_constants cctxt#chain cctxt#block cctxt in - let* initialisation_parameters = - if unsafe_srs then - return - @@ Cryptobox.Internal_for_tests.initialisation_parameters_from_slot_size - ~slot_size:parameters.slot_size - else - let*? g1_path, g2_path = Tezos_base.Dal_srs.find_trusted_setup_files () in - Cryptobox.initialisation_parameters_from_files ~g1_path ~g2_path + let srs_size = if unsafe_srs then Some parameters.slot_size else None in + let* () = + let find_srs_files () = Tezos_base.Dal_srs.find_trusted_setup_files () in + Cryptobox.Config.init_dal + ~find_srs_files + Cryptobox.Config.{activated = true; srs_size} in - let*? () = Cryptobox.load_parameters initialisation_parameters in match Cryptobox.make parameters with | Ok cryptobox -> return cryptobox | Error (`Fail msg) -> fail [Cryptobox_initialisation_failed msg] diff --git a/src/bin_node/node_replay_command.ml b/src/bin_node/node_replay_command.ml index 2fe4c2c1657c21f04384e2d2344706cfb1ca05e9..05c9ac7dde6793eb55a79d8d2ed0e67aea6eba0d 100644 --- a/src/bin_node/node_replay_command.ml +++ b/src/bin_node/node_replay_command.ml @@ -396,6 +396,7 @@ let replay ~singleprocess ~strict (config : Config_file.t) blocks = protocol_root; process_path = Sys.executable_name; sandbox_parameters = None; + dal_config = Tezos_crypto_dal.Cryptobox.Config.default; }) in let commit_genesis = diff --git a/src/bin_node/node_run_command.ml b/src/bin_node/node_run_command.ml index 6b1ef98e884e46e85cdcb0810042e413ebdf411f..87d83891dbc62b66fbf8b52f08b87f5f39b728bd 100644 --- a/src/bin_node/node_run_command.ml +++ b/src/bin_node/node_run_command.ml @@ -335,6 +335,7 @@ let init_node ?sandbox ?target ~identity ~singleprocess target; enable_testchain = config.p2p.enable_testchain; disable_mempool = config.p2p.disable_mempool; + dal = config.dal; } in let* () = @@ -499,8 +500,6 @@ let init_zcash () = "Failed to initialize Zcash parameters: %s" (Printexc.to_string exn)) -let init_dal dal_config = Config_file.init_dal dal_config - let run ?verbosity ?sandbox ?target ?(cli_warnings = []) ?ignore_testchain_warning ~singleprocess ~force_history_mode_switch (config : Config_file.t) = @@ -536,7 +535,10 @@ let run ?verbosity ?sandbox ?target ?(cli_warnings = []) Tezos_version.Current_git_info.abbreviated_commit_hash ) in let*! () = init_zcash () in - let* () = init_dal config.dal in + let* () = + let find_srs_files () = Tezos_base.Dal_srs.find_trusted_setup_files () in + Tezos_crypto_dal.Cryptobox.Config.init_dal ~find_srs_files config.dal + in let*! node = init_node ?sandbox diff --git a/src/lib_crypto_dal/cryptobox.ml b/src/lib_crypto_dal/cryptobox.ml index ce90d4e0b247368ee427f5ecc57adc8983c63a57..4867f9ec4053c054c9f680f7a49acc2bc8422880 100644 --- a/src/lib_crypto_dal/cryptobox.ml +++ b/src/lib_crypto_dal/cryptobox.ml @@ -947,3 +947,32 @@ module Internal_for_tests = struct let load_parameters parameters = initialisation_parameters := Some parameters end + +module Config = struct + type t = {activated : bool; srs_size : int option} + + let encoding : t Data_encoding.t = + let open Data_encoding in + conv + (fun {activated; srs_size} -> (activated, srs_size)) + (fun (activated, srs_size) -> {activated; srs_size}) + (obj2 (req "activated" bool) (req "srs_size" (option int31))) + + let default = {activated = false; srs_size = None} + + let init_dal ~find_srs_files dal_config = + let open Lwt_result_syntax in + if dal_config.activated then + let* initialisation_parameters = + match dal_config.srs_size with + | None -> + let*? g1_path, g2_path = find_srs_files () in + initialisation_parameters_from_files ~g1_path ~g2_path + | Some slot_size -> + return + (Internal_for_tests.initialisation_parameters_from_slot_size + ~slot_size) + in + Lwt.return (load_parameters initialisation_parameters) + else return_unit +end diff --git a/src/lib_crypto_dal/cryptobox.mli b/src/lib_crypto_dal/cryptobox.mli index e2ae8e07d55016d3ecfc7497b0d32db3eebbed9a..2e893a1d3d3ecead983a26c92af4e175b35c6d7f 100644 --- a/src/lib_crypto_dal/cryptobox.mli +++ b/src/lib_crypto_dal/cryptobox.mli @@ -83,24 +83,10 @@ include (** The primitives exposed in this modules require some preprocessing. This preprocessing generates data from an unknown - secret. For the security of those primtives, it is important that + secret. For the security of those primitives, it is important that the secret is unknown. *) type initialisation_parameters -(** [initialisation_parameters_from_files ~g1_path ~g2_path] allows to - load initialisation_parameters from files [g1_path] and - [g2_path]. It is important that every time those primitives are - used, they are used with the very same initialisation - parameters. To ensure this property, an integrity check is run. - - This function can take several seconds to run. *) -val initialisation_parameters_from_files : - g1_path:string -> - g2_path:string -> - initialisation_parameters Error_monad.tzresult Lwt.t - -val load_parameters : initialisation_parameters -> unit Error_monad.tzresult - module Commitment : sig include COMMITMENT with type t = commitment @@ -227,3 +213,44 @@ module Internal_for_tests : sig run using the same binary. *) val load_parameters : initialisation_parameters -> unit end + +(* TODO: https://gitlab.com/tezos/tezos/-/issues/4380 + + This configuration module is currently used by each process that + needs to initialize DAL. Given that in the default case [init_dal] + may take several seconds, it would be better to call this function + only once. *) + +(** node parameters for the DAL. *) +module Config : sig + type t = { + activated : bool; + (** [true] if the DAL is activated ([false] by default). This may have + an impact on the loading time of the node. *) + srs_size : int option; + (** If [None] (the default), the srs is read from the srs + files. This is the value expected for production. For testing + purposes, we may want to compute the srs instead but this is + unsafe. In that case, a size must be specified. *) + } + + val encoding : t Data_encoding.t + + (** The default configuration is [{activated = false; srs_size = None}]. *) + val default : t + + (** [init_dal find_trusted_setup_files config] initializes the DAL + according to the dal configuration [config]. + + When [config.srs_size = None], [init_dal] loads + [initialisation_parameters] from the files at the paths provided + by [find_trusted_setup_files ()]. It is important that every time + the primitives above are used, they are used with the very same + initialization parameters. (To ensure this property, an integrity + check is run.) In this case, [init_dal] can take several seconds + to run. *) + val init_dal : + find_srs_files:(unit -> (string * string) Error_monad.tzresult) -> + t -> + unit Error_monad.tzresult Lwt.t +end diff --git a/src/lib_dal_node/test/test_lib_dal_node.ml b/src/lib_dal_node/test/test_lib_dal_node.ml index 1d235cea887f47a693c5c97ea92cff0cff616f79..2a9ac05e8bb13ba92f7b54790d93561749624229 100644 --- a/src/lib_dal_node/test/test_lib_dal_node.ml +++ b/src/lib_dal_node/test/test_lib_dal_node.ml @@ -39,11 +39,7 @@ let make_cb () = Cryptobox.Internal_for_tests.initialisation_parameters_from_slot_size ~slot_size:parameters.slot_size in - let () = - match Cryptobox.load_parameters initialisation_parameters with - | Ok () -> () - | Error _ -> assert false - in + Cryptobox.Internal_for_tests.load_parameters initialisation_parameters ; match Cryptobox.make parameters with | Ok cryptobox -> (cryptobox, parameters) | Error (`Fail str) -> Stdlib.failwith ("DAL INIT ERROR: " ^ str) diff --git a/src/lib_node_config/config_file.ml b/src/lib_node_config/config_file.ml index 9083617553292511ae430b0919a5d28585ce6c85..528eae7885a0b4927e2da4ec6a67d2845b6b31ea 100644 --- a/src/lib_node_config/config_file.ml +++ b/src/lib_node_config/config_file.ml @@ -380,15 +380,6 @@ let sugared_blockchain_network_encoding : blockchain_network Data_encoding.t = (fun x -> x); ]) -type dal = {activated : bool; srs_size : int option} - -let dal_encoding : dal Data_encoding.t = - let open Data_encoding in - conv - (fun {activated; srs_size} -> (activated, srs_size)) - (fun (activated, srs_size) -> {activated; srs_size}) - (obj2 (req "activated" bool) (req "srs_size" (option int31))) - type t = { data_dir : string; disable_config_validation : bool; @@ -399,7 +390,7 @@ type t = { shell : Shell_limits.limits; blockchain_network : blockchain_network; metrics_addr : string list; - dal : dal; + dal : Tezos_crypto_dal.Cryptobox.Config.t; } and p2p = { @@ -452,8 +443,6 @@ let default_rpc = let default_disable_config_validation = false -let default_dal : dal = {activated = false; srs_size = None} - let default_config = { data_dir = default_data_dir; @@ -465,7 +454,7 @@ let default_config = blockchain_network = blockchain_network_mainnet; disable_config_validation = default_disable_config_validation; metrics_addr = []; - dal = default_dal; + dal = Tezos_crypto_dal.Cryptobox.Config.default; } let p2p = @@ -770,8 +759,8 @@ let encoding = ~description: "USE FOR TESTING PURPOSE ONLY. Configuration for the \ data-availibility layer" - dal_encoding - default_dal)) + Tezos_crypto_dal.Cryptobox.Config.encoding + Tezos_crypto_dal.Cryptobox.Config.default)) (* Abstract version of [Json_encoding.Cannot_destruct]: first argument is the string representation of the path, second argument is the error message @@ -1134,22 +1123,3 @@ let bootstrap_peers config = Option.value ~default:config.blockchain_network.default_bootstrap_peers config.p2p.bootstrap_peers - -let init_dal dal_config = - let open Lwt_result_syntax in - if dal_config.activated then - let open Tezos_crypto_dal.Cryptobox in - let* initialisation_parameters = - match dal_config.srs_size with - | None -> - let*? g1_path, g2_path = - Tezos_base.Dal_srs.find_trusted_setup_files () - in - initialisation_parameters_from_files ~g1_path ~g2_path - | Some slot_size -> - return - (Internal_for_tests.initialisation_parameters_from_slot_size - ~slot_size) - in - Lwt.return (load_parameters initialisation_parameters) - else return_unit diff --git a/src/lib_node_config/config_file.mli b/src/lib_node_config/config_file.mli index 2324db7569f6999a76454f138b42f5d16da8a1d9..bbf1c91cc1243f2b024b9c79c506edf17152dc6d 100644 --- a/src/lib_node_config/config_file.mli +++ b/src/lib_node_config/config_file.mli @@ -26,18 +26,6 @@ type chain_name = Distributed_db_version.Name.t -(** node parameters for the DAL. *) -type dal = { - activated : bool; - (** [true] if the DAL is activated ([false] by default). This may have - an impact on the loading time of the node. *) - srs_size : int option; - (** If [None] (the default), the srs is read from the srs files. This - is the value expected for production. For testing purposes, we may - want to compute the srs instead but this is unsafe. In that case, a - size must be specified. *) -} - type blockchain_network = { alias : string option; (** as given to [--network], only for built-in networks *) @@ -68,7 +56,7 @@ type t = { shell : Shell_limits.limits; blockchain_network : blockchain_network; metrics_addr : string list; - dal : dal; + dal : Tezos_crypto_dal.Cryptobox.Config.t; } and p2p = { @@ -193,6 +181,3 @@ val encoding : t Data_encoding.t (** Return [p2p.bootstrap_peers] if not [None], [network.default_bootstrap_peers] otherwise. *) val bootstrap_peers : t -> string list - -(** [init_dal dal] initialises the DAL according to the dal configuration [dal]. *) -val init_dal : dal -> unit tzresult Lwt.t diff --git a/src/lib_shell/block_validator_process.ml b/src/lib_shell/block_validator_process.ml index d8760910dab62963283e237ff470f3687fbea875..57c9ac6f934f15e7b2bf87585c4a82fa771d6c73 100644 --- a/src/lib_shell/block_validator_process.ml +++ b/src/lib_shell/block_validator_process.ml @@ -41,6 +41,7 @@ type validator_kind = protocol_root : string; process_path : string; sandbox_parameters : Data_encoding.json option; + dal_config : Tezos_crypto_dal.Cryptobox.Config.t; } -> validator_kind @@ -556,6 +557,7 @@ module External_validator_process = struct mutable validator_process : process_status; lock : Lwt_mutex.t; sandbox_parameters : Data_encoding.json option; + dal_config : Tezos_crypto_dal.Cryptobox.Config.t; } (* The shutdown_timeout is used when closing the block validator @@ -649,6 +651,7 @@ module External_validator_process = struct user_activated_upgrades = vp.user_activated_upgrades; user_activated_protocol_overrides = vp.user_activated_protocol_overrides; operation_metadata_size_limit = vp.operation_metadata_size_limit; + dal_config = vp.dal_config; } in vp.validator_process <- @@ -759,7 +762,7 @@ module External_validator_process = struct _; } : validator_environment) ~genesis ~data_dir ~readonly ~context_root - ~protocol_root ~process_path ~sandbox_parameters = + ~protocol_root ~process_path ~sandbox_parameters ~dal_config = let open Lwt_result_syntax in let*! () = Events.(emit init ()) in let validator = @@ -776,6 +779,7 @@ module External_validator_process = struct validator_process = Uninitialized; lock = Lwt_mutex.create (); sandbox_parameters; + dal_config; } in let* () = @@ -955,6 +959,7 @@ let init validator_environment validator_kind = protocol_root; process_path; sandbox_parameters; + dal_config; } -> let* (validator : 'b) = External_validator_process.init @@ -966,6 +971,7 @@ let init validator_environment validator_kind = ~protocol_root ~process_path ~sandbox_parameters + ~dal_config in let validator_process : (module S with type t = 'b) = (module External_validator_process) diff --git a/src/lib_shell/block_validator_process.mli b/src/lib_shell/block_validator_process.mli index 20c40a11f6414c2d91e536377e604314686611e5..7365d826f49cb79588ade6521d6c0554f57c1199 100644 --- a/src/lib_shell/block_validator_process.mli +++ b/src/lib_shell/block_validator_process.mli @@ -53,6 +53,7 @@ type validator_kind = protocol_root : string; process_path : string; sandbox_parameters : Data_encoding.json option; + dal_config : Tezos_crypto_dal.Cryptobox.Config.t; } -> validator_kind diff --git a/src/lib_shell/node.ml b/src/lib_shell/node.ml index bbf19b426580eab10bb447be84afbdc797591de6..47fd7afdb32fe206e4e0ac5c09c2acdf46f74474 100644 --- a/src/lib_shell/node.ml +++ b/src/lib_shell/node.ml @@ -135,6 +135,7 @@ type config = { target : (Tezos_crypto.Block_hash.t * int32) option; disable_mempool : bool; enable_testchain : bool; + dal : Tezos_crypto_dal.Cryptobox.Config.t; } (* These protocols are linked with the node and @@ -212,6 +213,7 @@ let create ?(sandboxed = false) ?sandbox_parameters ~singleprocess target; disable_mempool; enable_testchain; + dal; } peer_validator_limits block_validator_limits prevalidator_limits chain_validator_limits history_mode = let open Lwt_result_syntax in @@ -265,6 +267,7 @@ let create ?(sandboxed = false) ?sandbox_parameters ~singleprocess protocol_root; process_path = Sys.executable_name; sandbox_parameters; + dal_config = dal; }) in let commit_genesis ~chain_id = diff --git a/src/lib_shell/node.mli b/src/lib_shell/node.mli index ea3116a862e33595cbaf8c1b2aa2afca3dd343c3..c89c8e468b20e91d2bdc17aba0e04a25924730f3 100644 --- a/src/lib_shell/node.mli +++ b/src/lib_shell/node.mli @@ -47,6 +47,7 @@ type config = { (** If [true], all non-empty mempools will be ignored. *) enable_testchain : bool; (** If [false], testchain related messages will be ignored. *) + dal : Tezos_crypto_dal.Cryptobox.Config.t; } val create : diff --git a/src/lib_shell/test/test_node.ml b/src/lib_shell/test/test_node.ml index 8e0ab73aba0532d6b3eca61cb2444558c67a13a4..3f42b77d68ffd37fdffa776a7bfd7e0a53d3ee21 100644 --- a/src/lib_shell/test/test_node.ml +++ b/src/lib_shell/test/test_node.ml @@ -58,6 +58,7 @@ let init_config (* (f : 'a -> unit -> unit Lwt.t) *) f test_dir switch () : target = None; disable_mempool = false; enable_testchain = true; + dal = Tezos_crypto_dal.Cryptobox.Config.default; } in f sandbox_parameters config switch () diff --git a/src/lib_validation/external_validation.ml b/src/lib_validation/external_validation.ml index d531d05bfef1d738993946d2e1834da9cfb11c6d..c91cbf814f66199e24e70461a27cea8ad6c80863 100644 --- a/src/lib_validation/external_validation.ml +++ b/src/lib_validation/external_validation.ml @@ -32,6 +32,7 @@ type parameters = { user_activated_upgrades : User_activated.upgrades; user_activated_protocol_overrides : User_activated.protocol_overrides; operation_metadata_size_limit : Shell_limits.operation_metadata_size_limit; + dal_config : Tezos_crypto_dal.Cryptobox.Config.t; } type request = @@ -139,6 +140,7 @@ let parameters_encoding = user_activated_protocol_overrides; operation_metadata_size_limit; sandbox_parameters; + dal_config; } -> ( context_root, protocol_root, @@ -146,14 +148,16 @@ let parameters_encoding = user_activated_upgrades, user_activated_protocol_overrides, operation_metadata_size_limit, - sandbox_parameters )) + sandbox_parameters, + dal_config )) (fun ( context_root, protocol_root, genesis, user_activated_upgrades, user_activated_protocol_overrides, operation_metadata_size_limit, - sandbox_parameters ) -> + sandbox_parameters, + dal_config ) -> { context_root; protocol_root; @@ -162,8 +166,9 @@ let parameters_encoding = user_activated_protocol_overrides; operation_metadata_size_limit; sandbox_parameters; + dal_config; }) - (obj7 + (obj8 (req "context_root" string) (req "protocol_root" string) (req "genesis" Genesis.encoding) @@ -174,7 +179,8 @@ let parameters_encoding = (req "operation_metadata_size_limit" Shell_limits.operation_metadata_size_limit_encoding) - (opt "sandbox_parameters" json)) + (opt "sandbox_parameters" json) + (req "dal_config" Tezos_crypto_dal.Cryptobox.Config.encoding)) let case_validate tag = let open Data_encoding in diff --git a/src/lib_validation/external_validation.mli b/src/lib_validation/external_validation.mli index 982219d38c3a8ac04925a5f967a8d788b5633701..849fb9908aa5d5bcf22eb46b82d199b75dc3cfa5 100644 --- a/src/lib_validation/external_validation.mli +++ b/src/lib_validation/external_validation.mli @@ -32,6 +32,7 @@ type parameters = { user_activated_upgrades : User_activated.upgrades; user_activated_protocol_overrides : User_activated.protocol_overrides; operation_metadata_size_limit : Shell_limits.operation_metadata_size_limit; + dal_config : Tezos_crypto_dal.Cryptobox.Config.t; } type request = diff --git a/src/lib_validation/external_validator.ml b/src/lib_validation/external_validator.ml index c7bdd5e64943e2653b93e1587531ce19ef4075a0..84c5c8f4f973a3f06d742f3cc9beadeb7ab053f3 100644 --- a/src/lib_validation/external_validator.ml +++ b/src/lib_validation/external_validator.ml @@ -171,23 +171,28 @@ let handshake input output = (inconsistent_handshake "bad magic") let init ~readonly input = - let open Lwt_syntax in - let* () = Events.(emit initialization_request ()) in - let* { - context_root; - protocol_root; - sandbox_parameters; - genesis; - user_activated_upgrades; - user_activated_protocol_overrides; - operation_metadata_size_limit; - } = + let open Lwt_result_syntax in + let*! () = Events.(emit initialization_request ()) in + let*! { + context_root; + protocol_root; + sandbox_parameters; + genesis; + user_activated_upgrades; + user_activated_protocol_overrides; + operation_metadata_size_limit; + dal_config; + } = External_validation.recv input External_validation.parameters_encoding in + let* () = + let find_srs_files () = Tezos_base.Dal_srs.find_trusted_setup_files () in + Tezos_crypto_dal.Cryptobox.Config.init_dal ~find_srs_files dal_config + in let sandbox_parameters = Option.map (fun p -> ("sandbox_parameter", p)) sandbox_parameters in - let* context_index = + let*! context_index = Context.init ~patch_context:(fun ctxt -> let open Lwt_result_syntax in @@ -199,7 +204,7 @@ let init ~readonly input = ~readonly context_root in - Lwt.return + return ( context_index, protocol_root, genesis, @@ -210,12 +215,12 @@ let init ~readonly input = let run ~readonly input output = let open Lwt_result_syntax in let* () = handshake input output in - let*! ( context_index, - protocol_root, - genesis, - user_activated_upgrades, - user_activated_protocol_overrides, - operation_metadata_size_limit ) = + let* ( context_index, + protocol_root, + genesis, + user_activated_upgrades, + user_activated_protocol_overrides, + operation_metadata_size_limit ) = init ~readonly input in let rec loop (cache : Tezos_protocol_environment.Context.block_cache option) diff --git a/tezt/tests/dal.ml b/tezt/tests/dal.ml index 5b5033854f3c772d0d6cac171006c113c90c3573..835523973002e89b333f5af4405017738330d19b 100644 --- a/tezt/tests/dal.ml +++ b/tezt/tests/dal.ml @@ -82,16 +82,7 @@ let setup_node ~parameter_file ~protocol = in let json = JSON.put ("dal", value) json in json) ; - let* () = - Node.run - node - [ - (* FIXME: https://gitlab.com/tezos/tezos/-/issues/4268 - - We use [Singleprocess] because the block validation does not yet load the SRS. *) - Singleprocess; - ] - in + let* () = Node.run node [] in let* () = Node.wait_for_ready node in let* client = Client.init ~endpoint:(Node node) () in let* () =