diff --git a/src/app/archive/cli/archive_cli.ml b/src/app/archive/cli/archive_cli.ml index d9835087e91..5ff9c6fa9f3 100644 --- a/src/app/archive/cli/archive_cli.ml +++ b/src/app/archive/cli/archive_cli.ml @@ -38,26 +38,38 @@ let command_run = "int Delete blocks that are more than n blocks lower than the \ maximum seen block." in - let runtime_config_opt = - Option.map runtime_config_file ~f:(fun file -> - Yojson.Safe.from_file file |> Runtime_config.of_yojson - |> Result.ok_or_failwith ) - in fun () -> let logger = Logger.create () in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let open Deferred.Let_syntax in + let%bind config = + Runtime_config.Json_loader.load_config_files ~logger + (Option.to_list runtime_config_file) + |> Deferred.Or_error.ok_exn + in + let constants = Runtime_config.Constants.load_constants' config in + let%bind precomputed_values_opt = + match runtime_config_file with + | None -> + return None + | Some _ -> + Deferred.Or_error.( + Genesis_ledger_helper.Config_loader.init_from_config_file ~logger + ~constants config + >>| fun (a, _) -> Option.some a) + |> Deferred.Or_error.ok_exn in Stdout_log.setup log_json log_level ; [%log info] "Starting archive process; built with commit $commit" ~metadata:[ ("commit", `String Mina_version.commit_id) ] ; Archive_lib.Processor.setup_server ~metrics_server_port ~logger - ~genesis_constants ~constraint_constants + ~genesis_constants: + (Runtime_config.Constants.genesis_constants constants) + ~constraint_constants: + (Runtime_config.Constants.constraint_constants constants) ~postgres_address:postgres.value ~server_port: (Option.value server_port.value ~default:server_port.default) - ~delete_older_than ~runtime_config_opt ~missing_blocks_width ) + ~delete_older_than ~precomputed_values_opt ~missing_blocks_width ) let time_arg = (* Same timezone as Genesis_constants.genesis_state_timestamp. *) diff --git a/src/app/archive/lib/processor.ml b/src/app/archive/lib/processor.ml index e8452d413da..9396084b92b 100644 --- a/src/app/archive/lib/processor.ml +++ b/src/app/archive/lib/processor.ml @@ -4728,26 +4728,12 @@ let run pool reader ~genesis_constants ~constraint_constants ~logger Deferred.unit ) (* [add_genesis_accounts] is called when starting the archive process *) -let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option) - ~(genesis_constants : Genesis_constants.t) - ~(constraint_constants : Genesis_constants.Constraint_constants.t) pool = - match runtime_config_opt with +let add_genesis_accounts ~logger + ~(precomputed_values_opt : Precomputed_values.t option) pool = + match precomputed_values_opt with | None -> Deferred.unit - | Some runtime_config -> ( - let%bind precomputed_values = - match%map - Genesis_ledger_helper.init_from_config_file ~logger - ~proof_level:Genesis_constants.Compiled.proof_level - ~genesis_constants ~constraint_constants runtime_config - ~cli_proof_level:None - with - | Ok (precomputed_values, _) -> - precomputed_values - | Error err -> - failwithf "Could not get precomputed values, error: %s" - (Error.to_string_hum err) () - in + | Some precomputed_values -> ( let ledger = Precomputed_values.genesis_ledger precomputed_values |> Lazy.force in @@ -4767,7 +4753,8 @@ let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option) let%bind.Deferred.Result genesis_block_id = Block.add_if_doesn't_exist (module Conn) - ~constraint_constants genesis_block + ~constraint_constants:precomputed_values.constraint_constants + genesis_block in let%bind.Deferred.Result { ledger_hash; _ } = Block.load (module Conn) ~id:genesis_block_id @@ -4874,7 +4861,7 @@ let create_metrics_server ~logger ~metrics_server_port ~missing_blocks_width let setup_server ~(genesis_constants : Genesis_constants.t) ~(constraint_constants : Genesis_constants.Constraint_constants.t) ~metrics_server_port ~logger ~postgres_address ~server_port - ~delete_older_than ~runtime_config_opt ~missing_blocks_width = + ~delete_older_than ~precomputed_values_opt ~missing_blocks_width = let where_to_listen = Async.Tcp.Where_to_listen.bind_to All_addresses (On_port server_port) in @@ -4903,10 +4890,7 @@ let setup_server ~(genesis_constants : Genesis_constants.t) ~metadata:[ ("error", `String (Caqti_error.show e)) ] ; Deferred.unit | Ok pool -> - let%bind () = - add_genesis_accounts pool ~logger ~genesis_constants - ~constraint_constants ~runtime_config_opt - in + let%bind () = add_genesis_accounts pool ~logger ~precomputed_values_opt in run ~constraint_constants ~genesis_constants pool reader ~logger ~delete_older_than |> don't_wait_for ; diff --git a/src/app/batch_txn_tool/batch_txn_tool.ml b/src/app/batch_txn_tool/batch_txn_tool.ml index 79741438d56..9331c5a4207 100644 --- a/src/app/batch_txn_tool/batch_txn_tool.ml +++ b/src/app/batch_txn_tool/batch_txn_tool.ml @@ -154,11 +154,10 @@ let there_and_back_again ~num_txn_per_acct ~txns_per_block ~slot_time ~fill_rate ~origin_sender_secret_key_path ~(origin_sender_secret_key_pw_option : string option) ~returner_secret_key_path ~(returner_secret_key_pw_option : string option) - ~graphql_target_node_option ~minimum_user_command_fee () = + ~graphql_target_node_option ~minimum_user_command_fee ~logger () = let open Deferred.Let_syntax in (* define the rate limiting function *) let open Logger in - let logger = Logger.create () in let limit_level = let slot_limit = Float.( @@ -310,8 +309,6 @@ let there_and_back_again ~num_txn_per_acct ~txns_per_block ~slot_time ~fill_rate return () let output_there_and_back_cmds = - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let compile_config = Mina_compile_config.Compiled.t in let open Command.Let_syntax in Command.async ~summary: @@ -390,23 +387,32 @@ let output_there_and_back_cmds = transactions, if this is not present then we use the env var \ MINA_PRIVKEY_PASS" (optional string) + and config_file = Cli_lib.Flag.config_files and graphql_target_node_option = flag "--graphql-target-node" ~aliases:[ "graphql-target-node" ] ~doc: "URL The graphql node to send graphl commands to. must be in \ format `:`. default is `127.0.0.1:3085`" (optional string) - and minimum_user_command_fee = - let default = compile_config.default_transaction_fee in - Cli_lib.Flag.fee_common - ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee - ~default_transaction_fee:default - in - there_and_back_again ~num_txn_per_acct ~txns_per_block ~txn_fee_option - ~slot_time ~fill_rate ~rate_limit ~rate_limit_level ~rate_limit_interval - ~origin_sender_secret_key_path ~origin_sender_secret_key_pw_option - ~returner_secret_key_path ~returner_secret_key_pw_option - ~graphql_target_node_option ~minimum_user_command_fee ) + and minimum_user_command_fee_opt = Cli_lib.Flag.fee_common in + fun () -> + let open Deferred.Let_syntax in + let logger = Logger.create () in + let%bind minimum_user_command_fee = + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Option.value + ~default: + (Runtime_config.Constants.genesis_constants conf) + .minimum_user_command_fee minimum_user_command_fee_opt + in + there_and_back_again ~num_txn_per_acct ~txns_per_block ~txn_fee_option + ~slot_time ~fill_rate ~rate_limit ~rate_limit_level + ~rate_limit_interval ~origin_sender_secret_key_path + ~origin_sender_secret_key_pw_option ~returner_secret_key_path + ~returner_secret_key_pw_option ~graphql_target_node_option + ~minimum_user_command_fee ~logger () ) let () = Command.run diff --git a/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml b/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml index ae9424b3ca2..8c27f0f78bc 100644 --- a/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml +++ b/src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml @@ -49,51 +49,7 @@ let plugin_flag = times" else Command.Param.return [] -let load_config_files ~logger ~genesis_constants ~constraint_constants ~conf_dir - ~genesis_dir ~cli_proof_level ~proof_level (config_files : string list) = - let open Deferred.Or_error.Let_syntax in - let genesis_dir = Option.value ~default:(conf_dir ^/ "genesis") genesis_dir in - let%bind config = - Runtime_config.Json_loader.load_config_files ~conf_dir ~logger config_files - in - match%bind.Deferred - Genesis_ledger_helper.init_from_config_file ~cli_proof_level ~genesis_dir - ~logger ~genesis_constants ~constraint_constants ~proof_level config - with - | Ok a -> - return a - | Error err -> - let ( json_config - , `Accounts_omitted - ( `Genesis genesis_accounts_omitted - , `Staking staking_accounts_omitted - , `Next next_accounts_omitted ) ) = - Runtime_config.to_yojson_without_accounts config - in - let append_accounts_omitted s = - Option.value_map - ~f:(fun i -> List.cons (s ^ "_accounts_omitted", `Int i)) - ~default:Fn.id - in - let metadata = - append_accounts_omitted "genesis" genesis_accounts_omitted - @@ append_accounts_omitted "staking" staking_accounts_omitted - @@ append_accounts_omitted "next" next_accounts_omitted [] - @ [ ("config", json_config) - ; ( "name" - , `String - (Option.value ~default:"not provided" - (let%bind.Option ledger = config.ledger in - Option.first_some ledger.name ledger.hash ) ) ) - ; ("error", Error_json.error_to_yojson err) - ] - in - [%log info] - "Initializing with runtime configuration. Ledger source: $name" - ~metadata ; - Error.raise err - -let setup_daemon logger ~itn_features ~default_snark_worker_fee = +let setup_daemon logger ~itn_features = let open Command.Let_syntax in let open Cli_lib.Arg_type in let receiver_key_warning = Cli_lib.Default.receiver_key_warning in @@ -262,8 +218,7 @@ let setup_daemon logger ~itn_features ~default_snark_worker_fee = ~doc: (sprintf "FEE Amount a worker wants to get compensated for generating a \ - snark proof (default: %d)" - (Currency.Fee.to_nanomina_int default_snark_worker_fee) ) + snark proof" ) (optional txn_fee) and work_reassignment_wait = flag "--work-reassignment-wait" @@ -686,22 +641,15 @@ let setup_daemon logger ~itn_features ~default_snark_worker_fee = in let pids = Child_processes.Termination.create_pid_table () in let mina_initialization_deferred () = - let genesis_constants = - Genesis_constants.Compiled.genesis_constants - in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let compile_config = Mina_compile_config.Compiled.t in let%bind precomputed_values, config = - load_config_files ~logger ~conf_dir ~genesis_dir - ~proof_level:Genesis_constants.Compiled.proof_level config_files - ~genesis_constants ~constraint_constants ~cli_proof_level + Genesis_ledger_helper.Config_loader.load_config_files ~logger + ~conf_dir ?genesis_dir ?cli_proof_level ~itn_features config_files |> Deferred.Or_error.ok_exn in - - constraint_constants.block_window_duration_ms |> Float.of_int - |> Time.Span.of_ms |> Mina_metrics.initialize_all ; + let constraint_constants = precomputed_values.consensus_constants in + let compile_config = precomputed_values.compile_config in + constraint_constants.block_window_duration_ms |> Block_time.Span.to_ms + |> Float.of_int64 |> Time.Span.of_ms |> Mina_metrics.initialize_all ; let module DC = Runtime_config.Daemon in (* The explicit typing here is necessary to prevent type inference from specializing according @@ -1377,12 +1325,9 @@ Pass one of -peer, -peer-list-file, -seed, -peer-list-url.|} ; let () = Mina_plugins.init_plugins ~logger mina plugins in return mina ) -let daemon logger = - let compile_config = Mina_compile_config.Compiled.t in +let daemon logger ~itn_features = Command.async ~summary:"Mina daemon" - (Command.Param.map - (setup_daemon logger ~itn_features:compile_config.itn_features - ~default_snark_worker_fee:compile_config.default_snark_worker_fee ) + (Command.Param.map (setup_daemon logger ~itn_features) ~f:(fun setup_daemon () -> (* Immediately disable updating the time offset. *) Block_time.Controller.disable_setting_offset () ; @@ -1391,7 +1336,7 @@ let daemon logger = [%log info] "Daemon ready. Clients can now connect" ; Async.never () ) ) -let replay_blocks logger = +let replay_blocks ~itn_features logger = let replay_flag = let open Command.Param in flag "--blocks-filename" ~aliases:[ "-blocks-filename" ] (required string) @@ -1402,11 +1347,9 @@ let replay_blocks logger = flag "--format" ~aliases:[ "-format" ] (optional string) ~doc:"json|sexp The format to read lines of the file in (default: json)" in - let compile_config = Mina_compile_config.Compiled.t in Command.async ~summary:"Start mina daemon with blocks replayed from a file" (Command.Param.map3 replay_flag read_kind - (setup_daemon logger ~itn_features:compile_config.itn_features - ~default_snark_worker_fee:compile_config.default_snark_worker_fee ) + (setup_daemon logger ~itn_features) ~f:(fun blocks_filename read_kind setup_daemon () -> (* Enable updating the time offset. *) Block_time.Controller.enable_setting_offset () ; @@ -1598,34 +1541,38 @@ let snark_hashes = let json = Cli_lib.Flag.json in fun () -> if json then Core.printf "[]\n%!"] -let internal_commands logger = +let internal_commands ~itn_features logger = [ ( Snark_worker.Intf.command_name - , Snark_worker.command ~proof_level:Genesis_constants.Compiled.proof_level - ~constraint_constants:Genesis_constants.Compiled.constraint_constants - ~commit_id:Mina_version.commit_id ) + , Snark_worker.command ~commit_id:Mina_version.commit_id ) ; ("snark-hashes", snark_hashes) ; ( "run-prover" , Command.async ~summary:"Run prover on a sexp provided on a single line of stdin" - (Command.Param.return (fun () -> - let logger = Logger.create () in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Compiled.proof_level in - Parallel.init_master () ; - match%bind Reader.read_sexp (Lazy.force Reader.stdin) with - | `Ok sexp -> - let%bind conf_dir = Unix.mkdtemp "/tmp/mina-prover" in - [%log info] "Prover state being logged to %s" conf_dir ; - let%bind prover = - Prover.create ~commit_id:Mina_version.commit_id ~logger - ~proof_level ~constraint_constants - ~pids:(Pid.Table.create ()) ~conf_dir () - in - Prover.prove_from_input_sexp prover sexp >>| ignore - | `Eof -> - failwith "early EOF while reading sexp" ) ) ) + (let open Command.Let_syntax in + let%map_open config_file = Cli_lib.Flag.config_files in + fun () -> + let logger = Logger.create () in + let open Deferred.Let_syntax in + let%bind constraint_constants, proof_level = + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants. + (constraint_constants conf, proof_level conf) + in + Parallel.init_master () ; + match%bind Reader.read_sexp (Lazy.force Reader.stdin) with + | `Ok sexp -> + let%bind conf_dir = Unix.mkdtemp "/tmp/mina-prover" in + [%log info] "Prover state being logged to %s" conf_dir ; + let%bind prover = + Prover.create ~commit_id:Mina_version.commit_id ~logger + ~proof_level ~constraint_constants ~pids:(Pid.Table.create ()) + ~conf_dir () + in + Prover.prove_from_input_sexp prover sexp >>| ignore + | `Eof -> + failwith "early EOF while reading sexp") ) ; ( "run-snark-worker-single" , Command.async ~summary:"Run snark-worker on a sexp provided on a single line of stdin" @@ -1633,14 +1580,18 @@ let internal_commands logger = let%map_open filename = flag "--file" (required string) ~doc:"File containing the s-expression of the snark work to execute" - in + and config_file = Cli_lib.Flag.config_files in + fun () -> let open Deferred.Let_syntax in let logger = Logger.create () in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let%bind constraint_constants, proof_level = + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants. + (constraint_constants conf, proof_level conf) in - let proof_level = Genesis_constants.Compiled.proof_level in Parallel.init_master () ; match%bind Reader.with_file filename ~f:(fun reader -> @@ -1687,14 +1638,17 @@ let internal_commands logger = and limit = flag "--limit" ~aliases:[ "-limit" ] (optional int) ~doc:"limit the number of proofs taken from the file" - in + and config_file = Cli_lib.Flag.config_files in fun () -> let open Async in let logger = Logger.create () in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let%bind constraint_constants, proof_level = + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants. + (constraint_constants conf, proof_level conf) in - let proof_level = Genesis_constants.Compiled.proof_level in Parallel.init_master () ; let%bind conf_dir = Unix.mkdtemp "/tmp/mina-verifier" in let mode = @@ -1830,18 +1784,12 @@ let internal_commands logger = () ) ; Deferred.return ()) ) ; ("dump-type-shapes", dump_type_shapes) - ; ("replay-blocks", replay_blocks logger) + ; ("replay-blocks", replay_blocks ~itn_features logger) ; ("audit-type-shapes", audit_type_shapes) ; ( "test-genesis-block-generation" , Command.async ~summary:"Generate a genesis proof" (let open Command.Let_syntax in - let%map_open config_files = - flag "--config-file" ~aliases:[ "config-file" ] - ~doc: - "PATH path to a configuration file (overrides MINA_CONFIG_FILE, \ - default: /daemon.json). Pass multiple times to \ - override fields from earlier config files" - (listed string) + let%map_open config_file = Cli_lib.Flag.config_files and conf_dir = Cli_lib.Flag.conf_dir and genesis_dir = flag "--genesis-ledger-dir" ~aliases:[ "genesis-ledger-dir" ] @@ -1855,17 +1803,10 @@ let internal_commands logger = Parallel.init_master () ; let logger = Logger.create () in let conf_dir = Mina_lib.Conf_dir.compute_conf_dir conf_dir in - let genesis_constants = - Genesis_constants.Compiled.genesis_constants - in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Proof_level.Full in let%bind precomputed_values, _ = - load_config_files ~logger ~conf_dir ~genesis_dir ~genesis_constants - ~constraint_constants ~proof_level config_files - ~cli_proof_level:None + Genesis_ledger_helper.Config_loader.load_config_files ~logger + ~conf_dir ?genesis_dir ~cli_proof_level:Full ~itn_features + config_file |> Deferred.Or_error.ok_exn in let pids = Child_processes.Termination.create_pid_table () in @@ -1874,7 +1815,7 @@ let internal_commands logger = realistic test. *) Prover.create ~commit_id:Mina_version.commit_id ~logger ~pids - ~conf_dir ~proof_level + ~conf_dir ~proof_level:precomputed_values.proof_level ~constraint_constants:precomputed_values.constraint_constants () in match%bind @@ -1894,13 +1835,14 @@ let internal_commands logger = let mina_commands logger ~itn_features = [ ("accounts", Client.accounts) - ; ("daemon", daemon logger) + ; ("daemon", daemon ~itn_features logger) ; ("client", Client.client) ; ("advanced", Client.advanced ~itn_features) ; ("ledger", Client.ledger) ; ("libp2p", Client.libp2p) ; ( "internal" - , Command.group ~summary:"Internal commands" (internal_commands logger) ) + , Command.group ~summary:"Internal commands" + (internal_commands ~itn_features logger) ) ; (Parallel.worker_command_name, Parallel.worker_command) ; ("transaction-snark-profiler", Transaction_snark_profiler.command) ] @@ -1938,11 +1880,10 @@ let () = | [| _mina_exe; version |] when is_version_cmd version -> Mina_version.print_version () | _ -> - let compile_config = Mina_compile_config.Compiled.t in + let itn_features = Mina_compile_config.Compiled.t.itn_features in Command.run (Command.group ~summary:"Mina" ~preserve_subcommand_order:() - (mina_commands logger ~itn_features:compile_config.itn_features) ) - ) ; + (mina_commands logger ~itn_features) ) ) ; Core.exit 0 let linkme = () diff --git a/src/app/cli/src/init/client.ml b/src/app/cli/src/init/client.ml index 409413d0f00..1c426b8a7dc 100644 --- a/src/app/cli/src/init/client.ml +++ b/src/app/cli/src/init/client.ml @@ -4,6 +4,10 @@ open Signature_lib open Mina_base open Mina_transaction +(* TODO consider a better way of setting a default transaction fee than + a fixed compile-time value *) +let default_transaction_fee = Currency.Fee.of_nanomina_int_exn 250000000 + module Client = Graphql_lib.Client.Make (struct let preprocess_variables_string = Fn.id @@ -513,14 +517,8 @@ let send_payment_graphql = flag "--amount" ~aliases:[ "amount" ] ~doc:"VALUE Payment amount you want to send" (required txn_amount) in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let compile_config = Mina_compile_config.Compiled.t in let args = - Args.zip3 - (Cli_lib.Flag.signed_command_common - ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee - ~default_transaction_fee:compile_config.default_transaction_fee ) - receiver_flag amount_flag + Args.zip3 Cli_lib.Flag.signed_command_common receiver_flag amount_flag in Command.async ~summary:"Send payment to an address" (Cli_lib.Background_daemon.graphql_init args @@ -528,6 +526,8 @@ let send_payment_graphql = graphql_endpoint ({ Cli_lib.Flag.sender; fee; nonce; memo }, receiver, amount) -> + let open Deferred.Let_syntax in + let fee = Option.value ~default:default_transaction_fee fee in let%map response = let input = Mina_graphql.Types.Input.SendPaymentInput.make_input ~to_:receiver @@ -548,21 +548,15 @@ let delegate_stake_graphql = ~doc:"PUBLICKEY Public key to which you want to delegate your stake" (required public_key_compressed) in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let compile_config = Mina_compile_config.Compiled.t in - let args = - Args.zip2 - (Cli_lib.Flag.signed_command_common - ~minimum_user_command_fee:genesis_constants.minimum_user_command_fee - ~default_transaction_fee:compile_config.default_transaction_fee ) - receiver_flag - in + let args = Args.zip2 Cli_lib.Flag.signed_command_common receiver_flag in Command.async ~summary:"Delegate your stake to another public key" (Cli_lib.Background_daemon.graphql_init args ~f:(fun graphql_endpoint ({ Cli_lib.Flag.sender; fee; nonce; memo }, receiver) -> + let open Deferred.Let_syntax in + let fee = Option.value ~default:default_transaction_fee fee in let%map response = Graphql_client.query_exn Graphql_queries.Send_delegation.( @@ -818,10 +812,16 @@ let hash_ledger = flag "--ledger-file" ~doc:"LEDGER-FILE File containing an exported ledger" (required string)) + and config_file = Cli_lib.Flag.config_files and plaintext = Cli_lib.Flag.plaintext in fun () -> - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let open Deferred.Let_syntax in + let%bind constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants.constraint_constants conf in let process_accounts accounts = let packed_ledger = @@ -922,22 +922,28 @@ let currency_in_ledger = ignore (exit 1 : 'a Deferred.t) ) let constraint_system_digests = + let open Command.Let_syntax in Command.async ~summary:"Print MD5 digest of each SNARK constraint" - (Command.Param.return (fun () -> - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Compiled.proof_level in - let all = - Transaction_snark.constraint_system_digests ~constraint_constants () - @ Blockchain_snark.Blockchain_snark_state.constraint_system_digests - ~proof_level ~constraint_constants () - in - let all = - List.sort ~compare:(fun (k1, _) (k2, _) -> String.compare k1 k2) all + (let%map_open config_file = Cli_lib.Flag.config_files in + fun () -> + let open Deferred.Let_syntax in + let%bind constraint_constants, proof_level = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file in - List.iter all ~f:(fun (k, v) -> printf "%s\t%s\n" k (Md5.to_hex v)) ; - Deferred.unit ) ) + Runtime_config.Constants.(constraint_constants conf, proof_level conf) + in + let all = + Transaction_snark.constraint_system_digests ~constraint_constants () + @ Blockchain_snark.Blockchain_snark_state.constraint_system_digests + ~proof_level ~constraint_constants () + in + let all = + List.sort ~compare:(fun (k1, _) (k2, _) -> String.compare k1 k2) all + in + List.iter all ~f:(fun (k, v) -> printf "%s\t%s\n" k (Md5.to_hex v)) ; + Deferred.unit ) let snark_job_list = let open Deferred.Let_syntax in @@ -1791,90 +1797,82 @@ let add_peers_graphql = } ) ) ) ) let compile_time_constants = - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = Genesis_constants.Compiled.constraint_constants in - let proof_level = Genesis_constants.Compiled.proof_level in + let open Command.Let_syntax in Command.async ~summary:"Print a JSON map of the compile-time consensus parameters" - (Command.Param.return (fun () -> + (let%map_open config_file = Cli_lib.Flag.config_files in + fun () -> + let home = Core.Sys.home_directory () in + let conf_dir = home ^/ Cli_lib.Default.conf_dir_name in + let genesis_dir = let home = Core.Sys.home_directory () in - let conf_dir = home ^/ Cli_lib.Default.conf_dir_name in - let genesis_dir = - let home = Core.Sys.home_directory () in - home ^/ Cli_lib.Default.conf_dir_name - in - let config_file = - match Sys.getenv "MINA_CONFIG_FILE" with - | Some config_file -> - config_file - | None -> - conf_dir ^/ "daemon.json" - in - let open Async in + home ^/ Cli_lib.Default.conf_dir_name + in + let open Deferred.Let_syntax in + let%map ({ consensus_constants; _ } as precomputed_values), _ = + (* This is kind of ugly because we are allowing for supplying a runtime_config value directly, rather than force what is read from the environment *) + (* TODO: See if we can initialize consensus_constants without also initializing the ledger *) let logger = Logger.create () in - let%map ({ consensus_constants; _ } as precomputed_values), _ = - let%bind runtime_config = - let%map config_file = - Runtime_config.Json_loader.load_config_files ~conf_dir ~logger - [ config_file ] - >>| Or_error.ok - in - let default = - Runtime_config.of_json_layout - { Runtime_config.Json_layout.default with - ledger = - Some - { Runtime_config.Json_layout.Ledger.default with - accounts = Some [] - } - } - |> Result.ok_or_failwith - in - Option.value ~default config_file - in - Genesis_ledger_helper.init_from_config_file ~genesis_constants - ~constraint_constants ~logger:(Logger.null ()) ~proof_level - ~cli_proof_level:None ~genesis_dir runtime_config - >>| Or_error.ok_exn + let%bind m_conf = + Runtime_config.Json_loader.load_config_files ~conf_dir ~logger + config_file + >>| Or_error.ok in - let all_constants = - `Assoc - [ ( "genesis_state_timestamp" - , `String - ( Block_time.to_time_exn - consensus_constants.genesis_state_timestamp - |> Core.Time.to_string_iso8601_basic ~zone:Core.Time.Zone.utc - ) ) - ; ("k", `Int (Unsigned.UInt32.to_int consensus_constants.k)) - ; ( "coinbase" - , `String - (Currency.Amount.to_mina_string - precomputed_values.constraint_constants.coinbase_amount ) - ) - ; ( "block_window_duration_ms" - , `Int - precomputed_values.constraint_constants - .block_window_duration_ms ) - ; ("delta", `Int (Unsigned.UInt32.to_int consensus_constants.delta)) - ; ( "sub_windows_per_window" - , `Int - (Unsigned.UInt32.to_int - consensus_constants.sub_windows_per_window ) ) - ; ( "slots_per_sub_window" - , `Int - (Unsigned.UInt32.to_int - consensus_constants.slots_per_sub_window ) ) - ; ( "slots_per_window" - , `Int - (Unsigned.UInt32.to_int consensus_constants.slots_per_window) - ) - ; ( "slots_per_epoch" - , `Int - (Unsigned.UInt32.to_int consensus_constants.slots_per_epoch) - ) - ] + let default = + Runtime_config.of_json_layout + { Runtime_config.Json_layout.default with + ledger = + Some + { Runtime_config.Json_layout.Ledger.default with + accounts = Some [] + } + } + |> Result.ok_or_failwith in - Core_kernel.printf "%s\n%!" (Yojson.Safe.to_string all_constants) ) ) + let runtime_config = Option.value ~default m_conf in + let constants = + Runtime_config.Constants.load_constants' runtime_config + in + Genesis_ledger_helper.Config_loader.init_from_config_file ~genesis_dir + ~logger ~constants runtime_config + |> Deferred.Or_error.ok_exn + in + let all_constants = + `Assoc + [ ( "genesis_state_timestamp" + , `String + ( Block_time.to_time_exn + consensus_constants.genesis_state_timestamp + |> Core.Time.to_string_iso8601_basic ~zone:Core.Time.Zone.utc + ) ) + ; ("k", `Int (Unsigned.UInt32.to_int consensus_constants.k)) + ; ( "coinbase" + , `String + (Currency.Amount.to_mina_string + precomputed_values.constraint_constants.coinbase_amount ) ) + ; ( "block_window_duration_ms" + , `Int + precomputed_values.constraint_constants + .block_window_duration_ms ) + ; ("delta", `Int (Unsigned.UInt32.to_int consensus_constants.delta)) + ; ( "sub_windows_per_window" + , `Int + (Unsigned.UInt32.to_int + consensus_constants.sub_windows_per_window ) ) + ; ( "slots_per_sub_window" + , `Int + (Unsigned.UInt32.to_int + consensus_constants.slots_per_sub_window ) ) + ; ( "slots_per_window" + , `Int + (Unsigned.UInt32.to_int consensus_constants.slots_per_window) + ) + ; ( "slots_per_epoch" + , `Int (Unsigned.UInt32.to_int consensus_constants.slots_per_epoch) + ) + ] + in + Core_kernel.printf "%s\n%!" (Yojson.Safe.to_string all_constants) ) let node_status = let open Command.Param in @@ -2318,26 +2316,31 @@ let test_ledger_application = flag "--has-second-partition" ~doc:"Assume there is a second partition (scan state)" no_arg and tracing = flag "--tracing" ~doc:"Wrap test into tracing" no_arg + and config_file = Cli_lib.Flag.config_files and no_masks = flag "--no-masks" ~doc:"Do not create masks" no_arg in Cli_lib.Exceptions.handle_nicely @@ fun () -> + let open Deferred.Let_syntax in + let%bind genesis_constants, constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants. + (genesis_constants conf, constraint_constants conf) + in let first_partition_slots = Option.value ~default:128 first_partition_slots in let num_txs_per_round = Option.value ~default:3 num_txs_per_round in let rounds = Option.value ~default:580 rounds in let max_depth = Option.value ~default:290 max_depth in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in Test_ledger_application.test ~privkey_path ~ledger_path ?prev_block_path ~first_partition_slots ~no_new_stack ~has_second_partition ~num_txs_per_round ~rounds ~no_masks ~max_depth ~tracing num_txs ~constraint_constants ~genesis_constants ) let itn_create_accounts = - let compile_config = Mina_compile_config.Compiled.t in Command.async ~summary:"Fund new accounts for incentivized testnet" (let open Command.Param in let privkey_path = Cli_lib.Flag.privkey_read_path in @@ -2348,10 +2351,7 @@ let itn_create_accounts = flag "--num-accounts" ~doc:"NN Number of new accounts" (required int) in let fee = - flag "--fee" - ~doc: - (sprintf "NN Fee in nanomina paid to create an account (minimum: %s)" - (Currency.Fee.to_string compile_config.minimum_user_command_fee) ) + flag "--fee" ~doc:"NN Fee in nanomina paid to create an account" (required int) in let amount = @@ -2359,13 +2359,28 @@ let itn_create_accounts = ~doc:"NN Amount in nanomina to be divided among new accounts" (required int) in - let args = Args.zip5 privkey_path key_prefix num_accounts fee amount in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let config_file = Cli_lib.Flag.config_files in + let args = + Args.zip6 privkey_path key_prefix num_accounts fee amount config_file in Cli_lib.Background_daemon.rpc_init args - ~f:(Itn.create_accounts ~genesis_constants ~constraint_constants)) + ~f:(fun + port + (privkey_path, key_prefix, num_accounts, fee, amount, config_file) + -> + let open Deferred.Let_syntax in + let%bind genesis_constants, constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants. + (genesis_constants conf, constraint_constants conf) + in + let args' = (privkey_path, key_prefix, num_accounts, fee, amount) in + let genesis_constants = genesis_constants in + let constraint_constants = constraint_constants in + Itn.create_accounts ~genesis_constants ~constraint_constants port args' )) module Visualization = struct let create_command (type rpc_response) ~name ~f diff --git a/src/app/delegation_verify/delegation_verify.ml b/src/app/delegation_verify/delegation_verify.ml index f160d4c1234..ac643b1db67 100644 --- a/src/app/delegation_verify/delegation_verify.ml +++ b/src/app/delegation_verify/delegation_verify.ml @@ -13,9 +13,7 @@ let get_filenames = let verify_snark_work ~verify_transaction_snarks ~proof ~message = verify_transaction_snarks [ (proof, message) ] -let config_flag = - let open Command.Param in - flag "--config-file" ~doc:"FILE config file" (optional string) +let config_flag = Cli_lib.Flag.config_files let keyspace_flag = let open Command.Param in @@ -44,31 +42,15 @@ let timestamp = let open Command.Param in anon ("timestamp" %: string) -let instantiate_verify_functions ~logger ~genesis_constants - ~constraint_constants ~proof_level ~cli_proof_level = function - | None -> - Deferred.return - (Verifier.verify_functions ~constraint_constants ~proof_level ()) - | Some config_file -> - let%bind.Deferred precomputed_values = - let%bind.Deferred.Or_error config = - Runtime_config.Json_loader.load_config_files ~logger [ config_file ] - in - Genesis_ledger_helper.init_from_config_file ~logger ~proof_level - ~constraint_constants ~genesis_constants config ~cli_proof_level - in - let%map.Deferred precomputed_values = - match precomputed_values with - | Ok (precomputed_values, _) -> - Deferred.return precomputed_values - | Error _ -> - Output.display_error "fail to read config file" ; - exit 4 - in - let constraint_constants = - Precomputed_values.constraint_constants precomputed_values - in - Verifier.verify_functions ~constraint_constants ~proof_level:Full () +let instantiate_verify_functions ~logger config_file = + let open Deferred.Let_syntax in + let%map constants = + Runtime_config.Constants.load_constants ~logger config_file + in + let constraint_constants = + Runtime_config.Constants.constraint_constants constants + in + Verifier.verify_functions ~constraint_constants ~proof_level:Full () module Make_verifier (Source : Submission.Data_source) = struct let verify_transaction_snarks = Source.verify_transaction_snarks @@ -139,7 +121,7 @@ module Make_verifier (Source : Submission.Data_source) = struct |> Deferred.Or_error.all_unit end -let filesystem_command = +let filesystem_command ~logger = Command.async ~summary:"Verify submissions and block read from the filesystem" Command.Let_syntax.( let%map_open block_dir = block_dir_flag @@ -147,16 +129,10 @@ let filesystem_command = and no_checks = no_checks_flag and config_file = config_flag in fun () -> - let logger = Logger.create () in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file ~genesis_constants - ~constraint_constants ~proof_level ~cli_proof_level:None + instantiate_verify_functions ~logger config_file in + let submission_paths = get_filenames inputs in let module V = Make_verifier (struct include Submission.Filesystem @@ -175,7 +151,7 @@ let filesystem_command = Output.display_error @@ Error.to_string_hum e ; exit 1) -let cassandra_command = +let cassandra_command ~logger = Command.async ~summary:"Verify submissions and block read from Cassandra" Command.Let_syntax.( let%map_open cqlsh = cassandra_executable_flag @@ -186,15 +162,8 @@ let cassandra_command = and period_end = timestamp in fun () -> let open Deferred.Let_syntax in - let logger = Logger.create () in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file ~genesis_constants - ~constraint_constants ~proof_level ~cli_proof_level:None + instantiate_verify_functions ~logger config_file in let module V = Make_verifier (struct include Submission.Cassandra @@ -217,22 +186,15 @@ let cassandra_command = Output.display_error @@ Error.to_string_hum e ; exit 1) -let stdin_command = +let stdin_command ~logger = Command.async ~summary:"Verify submissions and blocks read from standard input" Command.Let_syntax.( let%map_open config_file = config_flag and no_checks = no_checks_flag in fun () -> let open Deferred.Let_syntax in - let logger = Logger.create () in - let genesis_constants = Genesis_constants.Compiled.genesis_constants in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in - let proof_level = Genesis_constants.Compiled.proof_level in let%bind.Deferred verify_blockchain_snarks, verify_transaction_snarks = - instantiate_verify_functions ~logger config_file ~genesis_constants - ~constraint_constants ~proof_level ~cli_proof_level:None + instantiate_verify_functions ~logger config_file in let module V = Make_verifier (struct include Submission.Stdin @@ -248,12 +210,14 @@ let stdin_command = Output.display_error @@ Error.to_string_hum e ; exit 1) -let command = +let command ~logger = Command.group ~summary:"A tool for verifying JSON payload submitted by the uptime service" - [ ("fs", filesystem_command) - ; ("cassandra", cassandra_command) - ; ("stdin", stdin_command) + [ ("fs", filesystem_command ~logger) + ; ("cassandra", cassandra_command ~logger) + ; ("stdin", stdin_command ~logger) ] -let () = Async.Command.run command +let () = + let logger = Logger.create () in + Async.Command.run @@ command ~logger diff --git a/src/config/dev.mlh b/src/config/dev.mlh index e7f0323fb70..85914d9c89a 100644 --- a/src/config/dev.mlh +++ b/src/config/dev.mlh @@ -51,7 +51,6 @@ (*BEGIN src/config/amount_defaults/standard.mlh*) -[%%define default_transaction_fee "5"] [%%define default_snark_worker_fee "1"] [%%define minimum_user_command_fee "2"] (*END src/config/amount_defaults/standard.mlh*) diff --git a/src/config/devnet.mlh b/src/config/devnet.mlh index a15553663e1..d3e0dbe3aa7 100644 --- a/src/config/devnet.mlh +++ b/src/config/devnet.mlh @@ -37,7 +37,6 @@ (*BEGIN src/config/amount_defaults/realistic.mlh*) -[%%define default_transaction_fee "0.25"] [%%define default_snark_worker_fee "0.1"] [%%define minimum_user_command_fee "0.001"] (*END src/config/amount_defaults/realistic.mlh*) diff --git a/src/config/lightnet.mlh b/src/config/lightnet.mlh index 87a58d5969c..a1fdf739640 100644 --- a/src/config/lightnet.mlh +++ b/src/config/lightnet.mlh @@ -37,7 +37,6 @@ (*BEGIN src/config/amount_defaults/realistic.mlh*) -[%%define default_transaction_fee "0.25"] [%%define default_snark_worker_fee "0.1"] [%%define minimum_user_command_fee "0.001"] (*END src/config/amount_defaults/realistic.mlh*) diff --git a/src/config/mainnet.mlh b/src/config/mainnet.mlh index d92617178b8..777cdb5ec6e 100644 --- a/src/config/mainnet.mlh +++ b/src/config/mainnet.mlh @@ -37,7 +37,6 @@ (*BEGIN src/config/amount_defaults/realistic.mlh*) -[%%define default_transaction_fee "0.25"] [%%define default_snark_worker_fee "0.1"] [%%define minimum_user_command_fee "0.001"] (*END src/config/amount_defaults/realistic.mlh*) diff --git a/src/lib/cli_lib/commands.ml b/src/lib/cli_lib/commands.ml index 375a130d6e7..4467e4cb915 100644 --- a/src/lib/cli_lib/commands.ml +++ b/src/lib/cli_lib/commands.ml @@ -230,16 +230,20 @@ module Vrf = struct flag "--total-stake" ~doc:"AMOUNT The total balance of all accounts in the epoch ledger" (optional int) - in + and config_file = Flag.config_files in Exceptions.handle_nicely @@ fun () -> let env = Secrets.Keypair.env in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let open Deferred.Let_syntax in + let%bind constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants.constraint_constants conf in if Option.is_some (Sys.getenv env) then eprintf "Using password from environment variable %s\n" env ; - let open Deferred.Let_syntax in (* TODO-someday: constraint constants from config file. *) let%bind () = let password = @@ -297,17 +301,21 @@ module Vrf = struct \"epochSeed\": _, \"delegatorIndex\": _} JSON message objects read on \ stdin" (let open Command.Let_syntax in - let%map_open privkey_path = Flag.privkey_read_path in + let%map_open privkey_path = Flag.privkey_read_path + and config_file = Flag.config_files in Exceptions.handle_nicely @@ fun () -> - let constraint_constants = - Genesis_constants.Compiled.constraint_constants - in let env = Secrets.Keypair.env in if Option.is_some (Sys.getenv env) then eprintf "Using password from environment variable %s\n" env ; let open Deferred.Let_syntax in - (* TODO-someday: constraint constants from config file. *) + let%bind constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants.constraint_constants conf + in let%bind () = let password = lazy @@ -362,13 +370,18 @@ module Vrf = struct totalStake: 1000000000}. The threshold is not checked against a \ ledger; this should be done manually to confirm whether threshold_met \ in the output corresponds to an actual won block." - ( Command.Param.return @@ Exceptions.handle_nicely + (let open Command.Let_syntax in + let%map_open config_file = Flag.config_files in + Exceptions.handle_nicely @@ fun () -> let open Deferred.Let_syntax in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let%bind constraint_constants = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~logger config_file + in + Runtime_config.Constants.constraint_constants conf in - (* TODO-someday: constraint constants from config file. *) let lexbuf = Lexing.from_channel In_channel.stdin in let lexer = Yojson.init_lexer () in let%bind () = @@ -399,7 +412,7 @@ module Vrf = struct (Error_json.error_to_yojson err) ) ; `Repeat () ) in - exit 0 ) + exit 0) let command_group = Command.group ~summary:"Commands for vrf evaluations" diff --git a/src/lib/cli_lib/flag.ml b/src/lib/cli_lib/flag.ml index c96200feb9e..64b279757d6 100644 --- a/src/lib/cli_lib/flag.ml +++ b/src/lib/cli_lib/flag.ml @@ -33,6 +33,15 @@ let conf_dir = flag "--config-directory" ~aliases:[ "config-directory" ] ~doc:"DIR Configuration directory" (optional string) +let config_files = + let open Command.Param in + flag "--config-file" ~aliases:[ "config-file" ] + ~doc: + "PATH path to a configuration file (overrides MINA_CONFIG_FILE, default: \ + /daemon.json). Pass multiple times to override fields from \ + earlier config files" + (listed string) + module Doc_builder = struct type 'value t = { type_name : string @@ -343,32 +352,24 @@ end type signed_command_common = { sender : Signature_lib.Public_key.Compressed.t - ; fee : Currency.Fee.t + ; fee : Currency.Fee.t option ; nonce : Mina_base.Account.Nonce.t option ; memo : string option } -let fee_common ~default_transaction_fee ~minimum_user_command_fee : - Currency.Fee.t Command.Param.t = +let fee_common : Currency.Fee.t option Command.Param.t = Command.Param.flag "--fee" ~aliases:[ "fee" ] - ~doc: - (Printf.sprintf - "FEE Amount you are willing to pay to process the transaction \ - (default: %s) (minimum: %s)" - (Currency.Fee.to_mina_string default_transaction_fee) - (Currency.Fee.to_mina_string minimum_user_command_fee) ) - (Command.Param.optional_with_default default_transaction_fee - Arg_type.txn_fee ) - -let signed_command_common ~default_transaction_fee ~minimum_user_command_fee : - signed_command_common Command.Param.t = + ~doc:"FEE Amount you are willing to pay to process the transaction" + (Command.Param.optional Arg_type.txn_fee) + +let signed_command_common : signed_command_common Command.Param.t = let open Command.Let_syntax in let open Arg_type in let%map_open sender = flag "--sender" ~aliases:[ "sender" ] (required public_key_compressed) ~doc:"PUBLICKEY Public key from which you want to send the transaction" - and fee = fee_common ~default_transaction_fee ~minimum_user_command_fee + and fee = fee_common and nonce = flag "--nonce" ~aliases:[ "nonce" ] ~doc: @@ -401,15 +402,10 @@ module Signed_command = struct flag "--amount" ~aliases:[ "amount" ] ~doc:"VALUE Payment amount you want to send" (required txn_amount) - let fee ~default_transaction_fee ~minimum_user_command_fee = + let fee = let open Command.Param in flag "--fee" ~aliases:[ "fee" ] - ~doc: - (Printf.sprintf - "FEE Amount you are willing to pay to process the transaction \ - (default: %s) (minimum: %s)" - (Currency.Fee.to_mina_string default_transaction_fee) - (Currency.Fee.to_mina_string minimum_user_command_fee) ) + ~doc:"FEE Amount you are willing to pay to process the transaction" (optional txn_fee) let valid_until = diff --git a/src/lib/cli_lib/flag.mli b/src/lib/cli_lib/flag.mli index 69ff38f86f3..dda9c630ce5 100644 --- a/src/lib/cli_lib/flag.mli +++ b/src/lib/cli_lib/flag.mli @@ -12,6 +12,8 @@ val privkey_read_path : string Command.Param.t val conf_dir : string option Command.Param.t +val config_files : string list Command.Param.t + module Types : sig type 'a with_name = { name : string; value : 'a } @@ -81,20 +83,14 @@ end type signed_command_common = { sender : Signature_lib.Public_key.Compressed.t - ; fee : Currency.Fee.t + ; fee : Currency.Fee.t option ; nonce : Mina_base.Account.Nonce.t option ; memo : string option } -val fee_common : - default_transaction_fee:Currency.Fee.t - -> minimum_user_command_fee:Currency.Fee.t - -> Currency.Fee.t Command.Param.t +val fee_common : Currency.Fee.t option Command.Param.t -val signed_command_common : - default_transaction_fee:Currency.Fee.t - -> minimum_user_command_fee:Currency.Fee.t - -> signed_command_common Command.Param.t +val signed_command_common : signed_command_common Command.Param.t module Signed_command : sig val hd_index : Mina_numbers.Hd_index.t Command.Param.t @@ -103,10 +99,7 @@ module Signed_command : sig val amount : Currency.Amount.t Command.Param.t - val fee : - default_transaction_fee:Currency.Fee.t - -> minimum_user_command_fee:Currency.Fee.t - -> Currency.Fee.t option Command.Param.t + val fee : Currency.Fee.t option Command.Param.t val valid_until : Mina_numbers.Global_slot_since_genesis.t option Command.Param.t diff --git a/src/lib/crypto/snarky_tests/dune b/src/lib/crypto/snarky_tests/dune index a9710cf679b..5fbfe8499c7 100644 --- a/src/lib/crypto/snarky_tests/dune +++ b/src/lib/crypto/snarky_tests/dune @@ -68,4 +68,5 @@ blockchain_snark transaction_snark genesis_constants + mina_runtime_config core)) diff --git a/src/lib/crypto/snarky_tests/snarky_tests.ml b/src/lib/crypto/snarky_tests/snarky_tests.ml index 51db1241b6d..68297f8468f 100644 --- a/src/lib/crypto/snarky_tests/snarky_tests.ml +++ b/src/lib/crypto/snarky_tests/snarky_tests.ml @@ -604,14 +604,12 @@ module Protocol_circuits = struct (* Full because we want to be sure nothing changes *) let proof_level = Genesis_constants.Proof_level.Full - let constraint_constants = Genesis_constants.Compiled.constraint_constants - let print_hash print expected digest : unit = if print then ( Format.printf "expected:\n%s\n" expected ; Format.printf "obtained:\n%s\n" digest ) - let blockchain () : unit = + let blockchain ~constraint_constants () : unit = let expected = "36786c300e37c2a2f1341ad6374aa113" in let digest = Blockchain_snark.Blockchain_snark_state.constraint_system_digests @@ -626,7 +624,7 @@ module Protocol_circuits = struct assert digests_match ; () - let transaction () : unit = + let transaction ~constraint_constants () : unit = let expected1 = "b8879f677f622a1d86648030701f43e1" in let expected2 = "740db2397b0b01806a48f061a2e2b063" in let digest = @@ -651,9 +649,9 @@ module Protocol_circuits = struct assert check ; () - let tests = - [ ("test blockchain circuit", `Quick, blockchain) - ; ("test transaction circuit", `Quick, transaction) + let tests ~constraint_constants = + [ ("test blockchain circuit", `Quick, blockchain ~constraint_constants) + ; ("test transaction circuit", `Quick, transaction ~constraint_constants) ] end @@ -666,16 +664,25 @@ let api_tests = ] let () = + Async.Thread_safe.block_on_async_exn + @@ fun () -> let range_checks = List.map ~f:QCheck_alcotest.to_alcotest [ RangeCircuits.test_range_gates ] in + let logger = Logger.create () in + let%map.Async.Deferred constraint_constants = + let%map.Async.Deferred config = + Runtime_config.Constants.load_constants ~logger [] + in + Runtime_config.Constants.constraint_constants config + in Alcotest.run "Simple snarky tests" [ ("outside of circuit tests before", outside_circuit_tests) ; ("API tests", api_tests) ; ("circuit tests", circuit_tests) ; ("As_prover tests", As_prover_circuits.as_prover_tests) ; ("range checks", range_checks) - ; ("protocol circuits", Protocol_circuits.tests) + ; ("protocol circuits", Protocol_circuits.tests ~constraint_constants) ; ("improper calls", Improper_calls.tests) (* We run the pure functions before and after other tests, because we've had bugs in the past where it would only work after the global state was initialized by an API function diff --git a/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml b/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml index b669fd3bc65..e3c4b62cbb3 100644 --- a/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml +++ b/src/lib/genesis_ledger_helper/genesis_ledger_helper.ml @@ -666,7 +666,7 @@ module Genesis_proof = struct return None let generate_inputs ~runtime_config ~proof_level ~ledger ~genesis_epoch_data - ~constraint_constants ~blockchain_proof_system_id + ~constraint_constants ~blockchain_proof_system_id ~compile_config ~(genesis_constants : Genesis_constants.t) = let consensus_constants = Consensus.Constants.create ~constraint_constants @@ -682,6 +682,7 @@ module Genesis_proof = struct { Genesis_proof.Inputs.runtime_config ; constraint_constants ; proof_level + ; compile_config ; blockchain_proof_system_id ; genesis_ledger = ledger ; genesis_epoch_data @@ -708,6 +709,7 @@ module Genesis_proof = struct ; consensus_constants = inputs.consensus_constants ; constraint_constants = inputs.constraint_constants ; genesis_body_reference = inputs.genesis_body_reference + ; compile_config = inputs.compile_config } | _ -> Deferred.return (Genesis_proof.create_values_no_proof inputs) @@ -759,109 +761,138 @@ let print_config ~logger (config : Runtime_config.t) = [%log info] "Initializing with runtime configuration. Ledger name: $name" ~metadata -let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger - ~cli_proof_level ~(genesis_constants : Genesis_constants.t) - ~(constraint_constants : Genesis_constants.Constraint_constants.t) - ~proof_level:compiled_proof_level ?overwrite_version - (config : Runtime_config.t) = - print_config ~logger config ; - let open Deferred.Or_error.Let_syntax in - let proof_level = - List.find_map_exn ~f:Fn.id - [ cli_proof_level - ; Option.Let_syntax.( - let%bind proof = config.proof in - match%map proof.level with - | Full -> - Genesis_constants.Proof_level.Full - | Check -> - Check - | No_check -> - No_check) - ; Some compiled_proof_level - ] - in - let constraint_constants, blockchain_proof_system_id = - match config.proof with - | None -> - [%log info] "Using the compiled constraint constants" ; - (constraint_constants, Some (Pickles.Verification_key.Id.dummy ())) - | Some config -> - [%log info] "Using the constraint constants from the configuration file" ; - let blockchain_proof_system_id = - (* We pass [None] here, which will force the constraint systems to be - set up and their hashes evaluated before we can calculate the - genesis proof's filename. - This adds no overhead if we are generating a genesis proof, since - we will do these evaluations anyway to load the blockchain proving - key. Otherwise, this will in a slight slowdown. - *) - None +module type Config_loader_intf = sig + val load_config_files : + ?overwrite_version:Mina_numbers.Txn_version.t + -> ?genesis_dir:string + -> ?itn_features:bool + -> ?cli_proof_level:Genesis_constants.Proof_level.t + -> ?conf_dir:string + -> logger:Logger.t + -> string list + -> (Precomputed_values.t * Runtime_config.t) Deferred.Or_error.t + + (* Mostly loads genesis ledger and epoch data *) + val init_from_config_file : + ?overwrite_version:Mina_numbers.Txn_version.t + -> ?genesis_dir:string + -> logger:Logger.t + -> constants:Runtime_config.Constants.constants + -> Runtime_config.t + -> (Precomputed_values.t * Runtime_config.t) Deferred.Or_error.t +end + +module Config_loader : Config_loader_intf = struct + let inputs_from_config_file ?(genesis_dir = Cache_dir.autogen_path) ~logger + ~(constants : Runtime_config.Constants.constants) ?overwrite_version + (config : Runtime_config.t) = + print_config ~logger config ; + let open Deferred.Or_error.Let_syntax in + let constraint_constants = + Runtime_config.Constants.constraint_constants constants + in + let proof_level = Runtime_config.Constants.proof_level constants in + let compile_config = Runtime_config.Constants.compile_config constants in + let genesis_constants = + Runtime_config.Constants.genesis_constants constants + in + let%bind genesis_ledger, ledger_config, ledger_file = + match config.ledger with + | Some ledger -> + Ledger.load ~proof_level ~genesis_dir ~logger ~constraint_constants + ?overwrite_version ledger + | None -> + [%log fatal] "No ledger was provided in the runtime configuration" ; + Deferred.Or_error.errorf + "No ledger was provided in the runtime configuration" + in + [%log info] "Loaded genesis ledger from $ledger_file" + ~metadata:[ ("ledger_file", `String ledger_file) ] ; + let%bind genesis_epoch_data, genesis_epoch_data_config = + Epoch_data.load ~proof_level ~genesis_dir ~logger ~constraint_constants + config.epoch_data + in + let config = + { config with + ledger = Option.map config.ledger ~f:(fun _ -> ledger_config) + ; epoch_data = genesis_epoch_data_config + } + in + let%map genesis_constants = + Deferred.return + @@ make_genesis_constants ~logger ~default:genesis_constants config + in + let proof_inputs = + Genesis_proof.generate_inputs ~runtime_config:config ~proof_level + ~ledger:genesis_ledger ~constraint_constants ~genesis_constants + ~compile_config ~blockchain_proof_system_id:None ~genesis_epoch_data + in + (proof_inputs, config) + + let init_from_config_file ?overwrite_version ?genesis_dir ~logger + ~(constants : Runtime_config.Constants.constants) + (config : Runtime_config.t) : + (Precomputed_values.t * Runtime_config.t) Deferred.Or_error.t = + let open Deferred.Or_error.Let_syntax in + let%map inputs, config = + inputs_from_config_file ?genesis_dir ~constants ~logger ?overwrite_version + config + in + let values = Genesis_proof.create_values_no_proof inputs in + (values, config) + + let load_config_files ?overwrite_version ?genesis_dir ?(itn_features = false) + ?cli_proof_level ?conf_dir ~logger (config_files : string list) = + let open Deferred.Or_error.Let_syntax in + let genesis_dir = + let%map.Option conf_dir = conf_dir in + Option.value ~default:(conf_dir ^/ "genesis") genesis_dir + in + let%bind.Deferred constants = + Runtime_config.Constants.load_constants ?conf_dir ?cli_proof_level + ~itn_features ~logger config_files + in + let%bind config = + Runtime_config.Json_loader.load_config_files ?conf_dir ~logger + config_files + in + match%bind.Deferred + init_from_config_file ?overwrite_version ?genesis_dir ~logger ~constants + config + with + | Ok a -> + return a + | Error err -> + let ( json_config + , `Accounts_omitted + ( `Genesis genesis_accounts_omitted + , `Staking staking_accounts_omitted + , `Next next_accounts_omitted ) ) = + Runtime_config.to_yojson_without_accounts config in - ( make_constraint_constants ~default:constraint_constants config - , blockchain_proof_system_id ) - in - let%bind () = - match (proof_level, compiled_proof_level) with - | _, Full | (Check | No_check), _ -> - return () - | Full, ((Check | No_check) as compiled) -> - let str = Genesis_constants.Proof_level.to_string in - [%log fatal] - "Proof level $proof_level is not compatible with compile-time proof \ - level $compiled_proof_level" - ~metadata: - [ ("proof_level", `String (str proof_level)) - ; ("compiled_proof_level", `String (str compiled)) - ] ; - Deferred.Or_error.errorf - "Proof level %s is not compatible with compile-time proof level %s" - (str proof_level) (str compiled) - in - let%bind genesis_ledger, ledger_config, ledger_file = - match config.ledger with - | Some ledger -> - Ledger.load ~proof_level ~genesis_dir ~logger ~constraint_constants - ?overwrite_version ledger - | None -> - [%log fatal] "No ledger was provided in the runtime configuration" ; - Deferred.Or_error.errorf - "No ledger was provided in the runtime configuration" - in - [%log info] "Loaded genesis ledger from $ledger_file" - ~metadata:[ ("ledger_file", `String ledger_file) ] ; - let%bind genesis_epoch_data, genesis_epoch_data_config = - Epoch_data.load ~proof_level ~genesis_dir ~logger ~constraint_constants - config.epoch_data - in - let config = - { config with - ledger = Option.map config.ledger ~f:(fun _ -> ledger_config) - ; epoch_data = genesis_epoch_data_config - } - in - let%map genesis_constants = - Deferred.return - @@ make_genesis_constants ~logger ~default:genesis_constants config - in - let proof_inputs = - Genesis_proof.generate_inputs ~runtime_config:config ~proof_level - ~ledger:genesis_ledger ~constraint_constants ~genesis_constants - ~blockchain_proof_system_id ~genesis_epoch_data - in - (proof_inputs, config) - -let init_from_config_file ?genesis_dir ~cli_proof_level ~genesis_constants - ~constraint_constants ~logger ~proof_level ?overwrite_version - (config : Runtime_config.t) : - (Precomputed_values.t * Runtime_config.t) Deferred.Or_error.t = - let open Deferred.Or_error.Let_syntax in - let%map inputs, config = - inputs_from_config_file ?genesis_dir ~cli_proof_level ~genesis_constants - ~constraint_constants ~logger ~proof_level ?overwrite_version config - in - let values = Genesis_proof.create_values_no_proof inputs in - (values, config) + let append_accounts_omitted s = + Option.value_map + ~f:(fun i -> List.cons (s ^ "_accounts_omitted", `Int i)) + ~default:Fn.id + in + let metadata = + append_accounts_omitted "genesis" genesis_accounts_omitted + @@ append_accounts_omitted "staking" staking_accounts_omitted + @@ append_accounts_omitted "next" next_accounts_omitted [] + @ [ ("config", json_config) + ; ( "name" + , `String + (Option.value ~default:"not provided" + (let%bind.Option ledger = config.ledger in + Option.first_some ledger.name ledger.hash ) ) ) + ; ("error", Error_json.error_to_yojson err) + ] + in + [%log info] + "Initializing with runtime configuration. Ledger source: $name" + ~metadata ; + Error.raise err +end let%test_module "Account config test" = ( module struct diff --git a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml index 6ca2c3465b5..7f886539d1d 100644 --- a/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml +++ b/src/lib/genesis_ledger_helper/lib/genesis_ledger_helper_lib.ml @@ -425,25 +425,10 @@ let make_constraint_constants in let transaction_capacity_log_2 = match config.transaction_capacity with - | Some (Log_2 i) -> - i - | Some (Txns_per_second_x10 tps_goal_x10) -> - let max_coinbases = 2 in - let max_user_commands_per_block = - (* block_window_duration is in milliseconds, so divide by 1000 divide - by 10 again because we have tps * 10 - *) - tps_goal_x10 * block_window_duration_ms / (1000 * 10) - in - (* Log of the capacity of transactions per transition. - - 1 will only work if we don't have prover fees. - - 2 will work with prover fees, but not if we want a transaction - included in every block. - - At least 3 ensures a transaction per block and the staged-ledger - unit tests pass. - *) - 1 - + Core_kernel.Int.ceil_log2 (max_user_commands_per_block + max_coinbases) + | Some transaction_capacity -> + Runtime_config.Proof_keys.Transaction_capacity + .to_transaction_capacity_log_2 ~block_window_duration_ms + ~transaction_capacity | None -> default.transaction_capacity_log_2 in diff --git a/src/lib/genesis_proof/genesis_proof.ml b/src/lib/genesis_proof/genesis_proof.ml index 9d3c74d6a18..db2aabbeccb 100644 --- a/src/lib/genesis_proof/genesis_proof.ml +++ b/src/lib/genesis_proof/genesis_proof.ml @@ -8,6 +8,7 @@ module Inputs = struct ; constraint_constants : Genesis_constants.Constraint_constants.t ; proof_level : Genesis_constants.Proof_level.t ; genesis_constants : Genesis_constants.t + ; compile_config : Mina_compile_config.t ; genesis_ledger : Genesis_ledger.Packed.t ; genesis_epoch_data : Consensus.Genesis_epoch_data.t ; genesis_body_reference : Consensus.Body_reference.t @@ -85,6 +86,7 @@ module T = struct ; constraint_constants : Genesis_constants.Constraint_constants.t ; genesis_constants : Genesis_constants.t ; proof_level : Genesis_constants.Proof_level.t + ; compile_config : Mina_compile_config.t ; genesis_ledger : Genesis_ledger.Packed.t ; genesis_epoch_data : Consensus.Genesis_epoch_data.t ; genesis_body_reference : Consensus.Body_reference.t @@ -223,6 +225,7 @@ let create_values_no_proof (t : Inputs.t) = ; constraint_constants = t.constraint_constants ; proof_level = t.proof_level ; genesis_constants = t.genesis_constants + ; compile_config = t.compile_config ; genesis_ledger = t.genesis_ledger ; genesis_epoch_data = t.genesis_epoch_data ; genesis_body_reference = t.genesis_body_reference @@ -240,6 +243,7 @@ let to_inputs (t : t) : Inputs.t = ; constraint_constants = t.constraint_constants ; proof_level = t.proof_level ; genesis_constants = t.genesis_constants + ; compile_config = t.compile_config ; genesis_ledger = t.genesis_ledger ; genesis_epoch_data = t.genesis_epoch_data ; genesis_body_reference = t.genesis_body_reference diff --git a/src/lib/mina_compile_config/mina_compile_config.ml b/src/lib/mina_compile_config/mina_compile_config.ml index 067bc5b7bac..a7ff3499203 100644 --- a/src/lib/mina_compile_config/mina_compile_config.ml +++ b/src/lib/mina_compile_config/mina_compile_config.ml @@ -9,7 +9,6 @@ open Core_kernel module Inputs = struct type t = { curve_size : int - ; default_transaction_fee_string : string ; default_snark_worker_fee_string : string ; minimum_user_command_fee_string : string ; itn_features : bool @@ -35,7 +34,6 @@ end type t = { curve_size : int - ; default_transaction_fee : Currency.Fee.t ; default_snark_worker_fee : Currency.Fee.t ; minimum_user_command_fee : Currency.Fee.t ; itn_features : bool @@ -59,8 +57,6 @@ type t = let make (inputs : Inputs.t) = { curve_size = inputs.curve_size - ; default_transaction_fee = - Currency.Fee.of_mina_string_exn inputs.default_transaction_fee_string ; default_snark_worker_fee = Currency.Fee.of_mina_string_exn inputs.default_snark_worker_fee_string ; minimum_user_command_fee = @@ -93,8 +89,6 @@ let make (inputs : Inputs.t) = let to_yojson t = `Assoc [ ("curve_size", `Int t.curve_size) - ; ( "default_transaction_fee" - , Currency.Fee.to_yojson t.default_transaction_fee ) ; ( "default_snark_worker_fee" , Currency.Fee.to_yojson t.default_snark_worker_fee ) ; ( "minimum_user_command_fee" @@ -132,7 +126,6 @@ module Compiled = struct let t : t = let (inputs : Inputs.t) = { curve_size = Node_config.curve_size - ; default_transaction_fee_string = Node_config.default_transaction_fee ; default_snark_worker_fee_string = Node_config.default_snark_worker_fee ; minimum_user_command_fee_string = Node_config.minimum_user_command_fee ; itn_features = Node_config.itn_features @@ -163,8 +156,6 @@ module For_unit_tests = struct let t : t = let inputs : Inputs.t = { curve_size = Node_config_for_unit_tests.curve_size - ; default_transaction_fee_string = - Node_config_for_unit_tests.default_transaction_fee ; default_snark_worker_fee_string = Node_config_for_unit_tests.default_snark_worker_fee ; minimum_user_command_fee_string = diff --git a/src/lib/mina_lib/tests/tests.ml b/src/lib/mina_lib/tests/tests.ml index b3a36d5a2a4..c6925b30ed5 100644 --- a/src/lib/mina_lib/tests/tests.ml +++ b/src/lib/mina_lib/tests/tests.ml @@ -36,11 +36,6 @@ let%test_module "Epoch ledger sync tests" = let dir_prefix = "sync_test_data" - let genesis_constants = Genesis_constants.For_unit_tests.t - - let constraint_constants = - Genesis_constants.For_unit_tests.Constraint_constants.t - let make_dirname s = let open Core in let uuid = Uuid_unix.create () |> Uuid.to_string in @@ -51,7 +46,9 @@ let%test_module "Epoch ledger sync tests" = let runtime_config : Runtime_config.t = { daemon = None ; genesis = None - ; proof = None + ; proof = + Some + { Runtime_config.Proof_keys.default with level = Some No_check } ; ledger = Some { base = Named "test" @@ -66,10 +63,11 @@ let%test_module "Epoch ledger sync tests" = } in match%map - Genesis_ledger_helper.init_from_config_file + Genesis_ledger_helper.Config_loader.init_from_config_file ~genesis_dir:(make_dirname "genesis_dir") - ~constraint_constants ~genesis_constants ~logger - ~proof_level:No_check runtime_config ~cli_proof_level:None + ~constants: + (Runtime_config.Constants.magic_for_unit_tests runtime_config) + ~logger runtime_config with | Ok (precomputed_values, _) -> precomputed_values diff --git a/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml index 95c880e9142..10a94970b87 100644 --- a/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml +++ b/src/lib/node_config/for_unit_tests/node_config_for_unit_tests.ml @@ -39,8 +39,6 @@ let (pool_max_size : int) = (3000 : int) let (account_creation_fee_int : string) = ("0.001" : string) -let (default_transaction_fee : string) = ("5" : string) - let (default_snark_worker_fee : string) = ("1" : string) let (minimum_user_command_fee : string) = ("2" : string) diff --git a/src/lib/node_config/intf/node_config_intf.mli b/src/lib/node_config/intf/node_config_intf.mli index 3d2960cc380..4267978e96f 100644 --- a/src/lib/node_config/intf/node_config_intf.mli +++ b/src/lib/node_config/intf/node_config_intf.mli @@ -66,8 +66,6 @@ module type S = sig val account_creation_fee_int : string - val default_transaction_fee : string - val default_snark_worker_fee : string val minimum_user_command_fee : string diff --git a/src/lib/node_config/node_config.ml b/src/lib/node_config/node_config.ml index 78485f82a17..53e2198a3ff 100644 --- a/src/lib/node_config/node_config.ml +++ b/src/lib/node_config/node_config.ml @@ -51,8 +51,6 @@ let scan_state_transaction_capacity_log_2 = [%%inject "account_creation_fee_int", account_creation_fee_int] -[%%inject "default_transaction_fee", default_transaction_fee] - [%%inject "default_snark_worker_fee", default_snark_worker_fee] [%%inject "minimum_user_command_fee", minimum_user_command_fee] diff --git a/src/lib/precomputed_values/precomputed_values.ml b/src/lib/precomputed_values/precomputed_values.ml index fd97c4ec317..c5d03d0020e 100644 --- a/src/lib/precomputed_values/precomputed_values.ml +++ b/src/lib/precomputed_values/precomputed_values.ml @@ -43,4 +43,5 @@ let for_unit_tests = ; protocol_state_with_hashes ; constraint_system_digests = hashes ; proof_data = None + ; compile_config = Mina_compile_config.For_unit_tests.t }) diff --git a/src/lib/runtime_config/runtime_config.ml b/src/lib/runtime_config/runtime_config.ml index 27cddee86de..a31d67ad622 100644 --- a/src/lib/runtime_config/runtime_config.ml +++ b/src/lib/runtime_config/runtime_config.ml @@ -1031,6 +1031,30 @@ module Proof_keys = struct let small : t = Log_2 2 let medium : t = Log_2 3 + + let to_transaction_capacity_log_2 ~block_window_duration_ms + ~transaction_capacity = + match transaction_capacity with + | Log_2 i -> + i + | Txns_per_second_x10 tps_goal_x10 -> + let max_coinbases = 2 in + let max_user_commands_per_block = + (* block_window_duration is in milliseconds, so divide by 1000 divide + by 10 again because we have tps * 10 + *) + tps_goal_x10 * block_window_duration_ms / (1000 * 10) + in + (* Log of the capacity of transactions per transition. + - 1 will only work if we don't have prover fees. + - 2 will work with prover fees, but not if we want a transaction + included in every block. + - At least 3 ensures a transaction per block and the staged-ledger + unit tests pass. + *) + 1 + + Core_kernel.Int.ceil_log2 + (max_user_commands_per_block + max_coinbases) end type t = @@ -1062,6 +1086,19 @@ module Proof_keys = struct ; fork } + let default = + { level = None + ; sub_windows_per_window = None + ; ledger_depth = None + ; work_delay = None + ; block_window_duration_ms = None + ; transaction_capacity = None + ; coinbase_amount = None + ; supercharged_coinbase_factor = None + ; account_creation_fee = None + ; fork = None + } + let to_json_layout { level ; sub_windows_per_window @@ -1733,3 +1770,244 @@ module Json_loader : Json_loader_intf = struct ] ; failwithf "Could not parse configuration file: %s" err () ) end + +module type Constants_intf = sig + type constants + + val load_constants : + ?conf_dir:string + -> ?commit_id_short:string + -> ?itn_features:bool + -> ?cli_proof_level:Genesis_constants.Proof_level.t + -> logger:Logger.t + -> string list + -> constants Deferred.t + + val load_constants' : + ?itn_features:bool + -> ?cli_proof_level:Genesis_constants.Proof_level.t + -> t + -> constants + + val genesis_constants : constants -> Genesis_constants.t + + val constraint_constants : + constants -> Genesis_constants.Constraint_constants.t + + val proof_level : constants -> Genesis_constants.Proof_level.t + + val compile_config : constants -> Mina_compile_config.t + + val magic_for_unit_tests : t -> constants +end + +module Constants : Constants_intf = struct + type constants = + { genesis_constants : Genesis_constants.t + ; constraint_constants : Genesis_constants.Constraint_constants.t + ; proof_level : Genesis_constants.Proof_level.t + ; compile_config : Mina_compile_config.t + } + + let genesis_constants t = t.genesis_constants + + let constraint_constants t = t.constraint_constants + + let proof_level t = t.proof_level + + let compile_config t = t.compile_config + + let combine (a : constants) (b : t) : constants = + let genesis_constants = + { Genesis_constants.protocol = + { k = + Option.value ~default:a.genesis_constants.protocol.k + Option.(b.genesis >>= fun g -> g.k) + ; delta = + Option.value ~default:a.genesis_constants.protocol.delta + Option.(b.genesis >>= fun g -> g.delta) + ; slots_per_epoch = + Option.value ~default:a.genesis_constants.protocol.slots_per_epoch + Option.(b.genesis >>= fun g -> g.slots_per_epoch) + ; slots_per_sub_window = + Option.value + ~default:a.genesis_constants.protocol.slots_per_sub_window + Option.(b.genesis >>= fun g -> g.slots_per_sub_window) + ; grace_period_slots = + Option.value + ~default:a.genesis_constants.protocol.grace_period_slots + Option.(b.genesis >>= fun g -> g.grace_period_slots) + ; genesis_state_timestamp = + Option.value + ~default:a.genesis_constants.protocol.genesis_state_timestamp + Option.( + b.genesis + >>= fun g -> + g.genesis_state_timestamp + >>| Genesis_constants.genesis_timestamp_of_string + >>| Genesis_constants.of_time) + } + ; txpool_max_size = + Option.value ~default:a.genesis_constants.txpool_max_size + Option.(b.daemon >>= fun d -> d.txpool_max_size) + ; num_accounts = + Option.first_some + Option.(b.ledger >>= fun l -> l.num_accounts) + a.genesis_constants.num_accounts + ; zkapp_proof_update_cost = + Option.value ~default:a.genesis_constants.zkapp_proof_update_cost + Option.(b.daemon >>= fun d -> d.zkapp_proof_update_cost) + ; zkapp_signed_single_update_cost = + Option.value + ~default:a.genesis_constants.zkapp_signed_single_update_cost + Option.(b.daemon >>= fun d -> d.zkapp_signed_single_update_cost) + ; zkapp_signed_pair_update_cost = + Option.value + ~default:a.genesis_constants.zkapp_signed_pair_update_cost + Option.(b.daemon >>= fun d -> d.zkapp_signed_pair_update_cost) + ; zkapp_transaction_cost_limit = + Option.value ~default:a.genesis_constants.zkapp_transaction_cost_limit + Option.(b.daemon >>= fun d -> d.zkapp_transaction_cost_limit) + ; max_event_elements = + Option.value ~default:a.genesis_constants.max_event_elements + Option.(b.daemon >>= fun d -> d.max_event_elements) + ; max_action_elements = + Option.value ~default:a.genesis_constants.max_action_elements + Option.(b.daemon >>= fun d -> d.max_action_elements) + ; zkapp_cmd_limit_hardcap = + Option.value ~default:a.genesis_constants.zkapp_cmd_limit_hardcap + Option.(b.daemon >>= fun d -> d.zkapp_cmd_limit_hardcap) + ; minimum_user_command_fee = + Option.value ~default:a.genesis_constants.minimum_user_command_fee + Option.(b.daemon >>= fun d -> d.minimum_user_command_fee) + } + in + let constraint_constants = + let fork = + let a = a.constraint_constants.fork in + let b = + let%map.Option f = Option.(b.proof >>= fun x -> x.fork) in + { Genesis_constants.Fork_constants.state_hash = + Mina_base.State_hash.of_base58_check_exn f.state_hash + ; blockchain_length = Mina_numbers.Length.of_int f.blockchain_length + ; global_slot_since_genesis = + Mina_numbers.Global_slot_since_genesis.of_int + f.global_slot_since_genesis + } + in + Option.first_some b a + in + let block_window_duration_ms = + Option.value ~default:a.constraint_constants.block_window_duration_ms + Option.(b.proof >>= fun p -> p.block_window_duration_ms) + in + { a.constraint_constants with + sub_windows_per_window = + Option.value ~default:a.constraint_constants.sub_windows_per_window + Option.(b.proof >>= fun p -> p.sub_windows_per_window) + ; ledger_depth = + Option.value ~default:a.constraint_constants.ledger_depth + Option.(b.proof >>= fun p -> p.ledger_depth) + ; work_delay = + Option.value ~default:a.constraint_constants.work_delay + Option.(b.proof >>= fun p -> p.work_delay) + ; block_window_duration_ms + ; transaction_capacity_log_2 = + Option.value + ~default:a.constraint_constants.transaction_capacity_log_2 + Option.( + b.proof + >>= fun p -> + p.transaction_capacity + >>| fun transaction_capacity -> + Proof_keys.Transaction_capacity.to_transaction_capacity_log_2 + ~block_window_duration_ms ~transaction_capacity) + ; coinbase_amount = + Option.value ~default:a.constraint_constants.coinbase_amount + Option.(b.proof >>= fun p -> p.coinbase_amount) + ; supercharged_coinbase_factor = + Option.value + ~default:a.constraint_constants.supercharged_coinbase_factor + Option.(b.proof >>= fun p -> p.supercharged_coinbase_factor) + ; account_creation_fee = + Option.value ~default:a.constraint_constants.account_creation_fee + Option.(b.proof >>= fun p -> p.account_creation_fee) + ; fork + } + in + let proof_level = + let coerce_proof_level = function + | Proof_keys.Level.Full -> + Genesis_constants.Proof_level.Full + | Check -> + Genesis_constants.Proof_level.Check + | No_check -> + Genesis_constants.Proof_level.No_check + in + Option.value ~default:a.proof_level + Option.(b.proof >>= fun p -> p.level >>| coerce_proof_level) + in + let compile_config = + { a.compile_config with + block_window_duration = + constraint_constants.block_window_duration_ms |> Float.of_int + |> Time.Span.of_ms + ; zkapp_proof_update_cost = genesis_constants.zkapp_proof_update_cost + ; zkapp_signed_single_update_cost = + genesis_constants.zkapp_signed_single_update_cost + ; zkapp_signed_pair_update_cost = + genesis_constants.zkapp_signed_pair_update_cost + ; zkapp_transaction_cost_limit = + genesis_constants.zkapp_transaction_cost_limit + ; max_event_elements = genesis_constants.max_event_elements + ; max_action_elements = genesis_constants.max_action_elements + ; zkapp_cmd_limit_hardcap = genesis_constants.zkapp_cmd_limit_hardcap + ; minimum_user_command_fee = genesis_constants.minimum_user_command_fee + ; network_id = + Option.value ~default:a.compile_config.network_id + Option.(b.daemon >>= fun d -> d.network_id) + } + in + { genesis_constants; constraint_constants; proof_level; compile_config } + + let load_constants' ?itn_features ?cli_proof_level runtime_config = + let compile_constants = + { genesis_constants = Genesis_constants.Compiled.genesis_constants + ; constraint_constants = Genesis_constants.Compiled.constraint_constants + ; proof_level = Genesis_constants.Compiled.proof_level + ; compile_config = Mina_compile_config.Compiled.t + } + in + let cs = combine compile_constants runtime_config in + { cs with + proof_level = Option.value ~default:cs.proof_level cli_proof_level + ; compile_config = + { cs.compile_config with + itn_features = + Option.value ~default:cs.compile_config.itn_features itn_features + } + } + + (* Use this function if you don't need/want the ledger configuration *) + let load_constants ?conf_dir ?commit_id_short ?itn_features ?cli_proof_level + ~logger config_files = + Deferred.Or_error.ok_exn + @@ + let open Deferred.Or_error.Let_syntax in + let%map runtime_config = + Json_loader.load_config_files ?conf_dir ?commit_id_short ~logger + config_files + in + load_constants' ?itn_features ?cli_proof_level runtime_config + + let magic_for_unit_tests t = + let compile_constants = + { genesis_constants = Genesis_constants.For_unit_tests.t + ; constraint_constants = + Genesis_constants.For_unit_tests.Constraint_constants.t + ; proof_level = Genesis_constants.For_unit_tests.Proof_level.t + ; compile_config = Mina_compile_config.For_unit_tests.t + } + in + combine compile_constants t +end diff --git a/src/lib/snark_worker/functor.ml b/src/lib/snark_worker/functor.ml index a62453e2877..1dfa6f06dc6 100644 --- a/src/lib/snark_worker/functor.ml +++ b/src/lib/snark_worker/functor.ml @@ -340,8 +340,7 @@ module Make (Inputs : Intf.Inputs_intf) : in go () - let command_from_rpcs ~commit_id ~proof_level:default_proof_level - ~constraint_constants + let command_from_rpcs ~commit_id (module Rpcs_versioned : Intf.Rpcs_versioned_S with type Work.ledger_proof = Inputs.Ledger_proof.t ) = Command.async ~summary:"Snark worker" @@ -350,7 +349,7 @@ module Make (Inputs : Intf.Inputs_intf) : flag "--daemon-address" ~aliases:[ "daemon-address" ] (required (Arg_type.create Host_and_port.of_string)) ~doc:"HOST-AND-PORT address daemon is listening on" - and proof_level = + and cli_proof_level = flag "--proof-level" ~aliases:[ "proof-level" ] (optional (Arg_type.create Genesis_constants.Proof_level.of_string)) ~doc:"full|check|none" @@ -360,13 +359,19 @@ module Make (Inputs : Intf.Inputs_intf) : (optional bool) ~doc: "true|false Shutdown when disconnected from daemon (default:true)" + and config_file = Cli_lib.Flag.config_files and conf_dir = Cli_lib.Flag.conf_dir in fun () -> let logger = Logger.create () ~metadata:[ ("process", `String "Snark Worker") ] in - let proof_level = - Option.value ~default:default_proof_level proof_level + let%bind.Deferred constraint_constants, proof_level = + let%map.Deferred config = + Runtime_config.Constants.load_constants ?conf_dir ?cli_proof_level + ~logger config_file + in + Runtime_config.Constants. + (constraint_constants config, proof_level config) in Option.value_map ~default:() conf_dir ~f:(fun conf_dir -> let logrotate_max_size = 1024 * 10 in diff --git a/src/lib/snark_worker/intf.ml b/src/lib/snark_worker/intf.ml index 9173d066d9c..2a9d93bb03c 100644 --- a/src/lib/snark_worker/intf.ml +++ b/src/lib/snark_worker/intf.ml @@ -154,8 +154,6 @@ module type S0 = sig val command_from_rpcs : commit_id:string - -> proof_level:Genesis_constants.Proof_level.t - -> constraint_constants:Genesis_constants.Constraint_constants.t -> (module Rpcs_versioned_S with type Work.ledger_proof = ledger_proof) -> Command.t @@ -173,9 +171,5 @@ module type S = sig module Rpcs_versioned : Rpcs_versioned_S with type Work.ledger_proof = ledger_proof - val command : - commit_id:string - -> proof_level:Genesis_constants.Proof_level.t - -> constraint_constants:Genesis_constants.Constraint_constants.t - -> Command.t + val command : commit_id:string -> Command.t end diff --git a/src/lib/snark_worker/standalone/run_snark_worker.ml b/src/lib/snark_worker/standalone/run_snark_worker.ml index cc243c1ab33..929f51b7b8d 100644 --- a/src/lib/snark_worker/standalone/run_snark_worker.ml +++ b/src/lib/snark_worker/standalone/run_snark_worker.ml @@ -8,7 +8,8 @@ let command = (let%map_open spec = flag "--spec-sexp" ~doc:"" (required (sexp_conv Prod.single_spec_of_sexp)) - and proof_level = + and config_file = Cli_lib.Flag.config_files + and cli_proof_level = flag "--proof-level" ~doc:"" (optional_with_default Genesis_constants.Proof_level.Full (Command.Arg_type.of_alist_exn @@ -19,8 +20,14 @@ let command = in fun () -> let open Async in - let constraint_constants = - Genesis_constants.Compiled.constraint_constants + let open Deferred.Let_syntax in + let%bind constraint_constants, proof_level = + let logger = Logger.create () in + let%map conf = + Runtime_config.Constants.load_constants ~cli_proof_level ~logger + config_file + in + Runtime_config.Constants.(constraint_constants conf, proof_level conf) in let%bind worker_state = Prod.Worker_state.create ~constraint_constants ~proof_level ()