Skip to content

Commit 42ec1eb

Browse files
authored
Merge pull request #18106 from MinaProtocol/lyh/vesting-param-update
Apply vesting params update to runtime genesis ledger and root
2 parents a7c3cc0 + 40eecca commit 42ec1eb

File tree

21 files changed

+400
-320
lines changed

21 files changed

+400
-320
lines changed

changes/18106.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
runtime-genesis-ledger: added a new cli flag `--hardfork-slot`. It is the scheduled hardfork slot since last hardfork at which vesting parameter update should happen. User must also pass in a companion `--prefork-genesis-config` specifying the prefork genesis config's file path, used to provide the fork slot of the last fork. If they're both absent, no update will be applied for vesting parameters.
2+
3+
daemon: now when `--hardfork-handling` is set to `migrate-exit` we will enforce `slot_chain_end` & `hard_fork_genesis_slot_delta` being set in config, and the vesting parameter update would be applied when converting ledger into hardfork format.
4+

src/app/archive/lib/processor.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4637,9 +4637,9 @@ let add_genesis_accounts ~logger ~(runtime_config_opt : Runtime_config.t option)
46374637
Genesis_ledger_helper.init_from_config_file ~logger
46384638
~proof_level:Genesis_constants.Compiled.proof_level
46394639
~genesis_constants ~constraint_constants runtime_config
4640-
~cli_proof_level:None ~genesis_backing_type:Stable_db
4640+
~cli_proof_level:None ~ledger_backing:Stable_db
46414641
with
4642-
| Ok (precomputed_values, _) ->
4642+
| Ok precomputed_values ->
46434643
precomputed_values
46444644
| Error err ->
46454645
failwithf "Could not get precomputed values, error: %s"

src/app/cli/src/cli_entrypoint/mina_cli_entrypoint.ml

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,37 @@ let plugin_flag =
4949
times"
5050
else Command.Param.return []
5151

52+
let make_ledger_backing ~constraint_constants ~runtime_config ~hardfork_handling
53+
=
54+
let current_genesis_global_slot =
55+
let%map.Option { global_slot_since_genesis = current_genesis_global_slot
56+
; _
57+
} =
58+
constraint_constants.Genesis_constants.Constraint_constants.fork
59+
in
60+
current_genesis_global_slot
61+
in
62+
let hardfork_slot =
63+
let%map.Option hardfork_slot_since_last_hf =
64+
Runtime_config.scheduled_hard_fork_genesis_slot runtime_config
65+
in
66+
Mina_numbers.Global_slot_since_hard_fork.to_global_slot_since_genesis
67+
~current_genesis_global_slot hardfork_slot_since_last_hf
68+
in
69+
70+
match (hardfork_handling, hardfork_slot) with
71+
| Cli_lib.Arg_type.Hardfork_handling.Migrate_exit, Some hardfork_slot ->
72+
Mina_ledger.Root.Config.Converting_db hardfork_slot
73+
| Migrate_exit, _ ->
74+
failwith
75+
"No hardfork slot provided for Migrate_exit mode, \
76+
`daemon.{slot_chain_end,hard_fork_genesis_slot_delta}` need to be \
77+
configured for using this HF mode."
78+
| Keep_running, _ ->
79+
Stable_db
80+
5281
let load_config_files ~logger ~genesis_constants ~constraint_constants ~conf_dir
53-
~genesis_dir ~cli_proof_level ~proof_level ~genesis_backing_type
54-
config_files =
82+
~genesis_dir ~cli_proof_level ~proof_level ~hardfork_handling config_files =
5583
let%bind config_jsons =
5684
let config_files_paths =
5785
List.map config_files ~f:(fun (config_file, _) -> `String config_file)
@@ -98,19 +126,23 @@ let load_config_files ~logger ~genesis_constants ~constraint_constants ~conf_dir
98126
] ;
99127
failwithf "Could not parse configuration file: %s" err () )
100128
in
129+
let ledger_backing =
130+
make_ledger_backing ~constraint_constants ~runtime_config:config
131+
~hardfork_handling
132+
in
101133
let chain_state_locations =
102134
Init.Chain_state_locations.of_config ~conf_dir config
103135
in
104136
let genesis_dir =
105137
Option.value ~default:chain_state_locations.genesis genesis_dir
106138
in
107-
let%bind precomputed_values =
139+
let%map precomputed_values =
108140
match%map
109141
Genesis_ledger_helper.init_from_config_file ~cli_proof_level ~genesis_dir
110142
~logger ~genesis_constants ~constraint_constants ~proof_level
111-
~genesis_backing_type config
143+
~ledger_backing config
112144
with
113-
| Ok (precomputed_values, _) ->
145+
| Ok precomputed_values ->
114146
precomputed_values
115147
| Error err ->
116148
let ( json_config
@@ -143,7 +175,11 @@ let load_config_files ~logger ~genesis_constants ~constraint_constants ~conf_dir
143175
~metadata ;
144176
Error.raise err
145177
in
146-
return (precomputed_values, config_jsons, config, chain_state_locations)
178+
( precomputed_values
179+
, config_jsons
180+
, config
181+
, chain_state_locations
182+
, ledger_backing )
147183

148184
let setup_daemon logger ~itn_features ~default_snark_worker_fee =
149185
let open Command.Let_syntax in
@@ -807,17 +843,15 @@ let setup_daemon logger ~itn_features ~default_snark_worker_fee =
807843
Genesis_constants.Compiled.constraint_constants
808844
in
809845
let compile_config = Mina_compile_config.Compiled.t in
810-
let ledger_backing_type =
811-
Mina_lib.Config.ledger_backing ~hardfork_handling
812-
in
813846
let%bind ( precomputed_values
814847
, config_jsons
815848
, config
816-
, chain_state_locations ) =
849+
, chain_state_locations
850+
, ledger_backing ) =
817851
load_config_files ~logger ~conf_dir ~genesis_dir
818852
~proof_level:Genesis_constants.Compiled.proof_level config_files
819853
~genesis_constants ~constraint_constants ~cli_proof_level
820-
~genesis_backing_type:ledger_backing_type
854+
~hardfork_handling
821855
in
822856
constraint_constants.block_window_duration_ms |> Float.of_int
823857
|> Time.Span.of_ms |> Mina_metrics.initialize_all ;
@@ -1192,7 +1226,7 @@ let setup_daemon logger ~itn_features ~default_snark_worker_fee =
11921226
|> Option.to_list |> Public_key.Compressed.Set.of_list )
11931227
~genesis_state_hash:
11941228
precomputed_values.protocol_state_with_hashes.hash.state_hash
1195-
~epoch_ledger_backing_type:ledger_backing_type
1229+
~epoch_ledger_backing_type:ledger_backing
11961230
in
11971231
trace_database_initialization "epoch ledger" __LOC__
11981232
epoch_ledger_location ;
@@ -1451,7 +1485,8 @@ Pass one of -peer, -peer-list-file, -seed, -peer-list-url.|} ;
14511485
~stop_time_interval ~node_status_url
14521486
~graphql_control_port:itn_graphql_port ~simplified_node_stats
14531487
~zkapp_cmd_limit:(ref compile_config.zkapp_cmd_limit)
1454-
~itn_features ~compile_config ~hardfork_handling () )
1488+
~itn_features ~compile_config ~hardfork_handling
1489+
~ledger_backing () )
14551490
in
14561491
{ mina
14571492
; client_trustlist
@@ -2005,10 +2040,11 @@ let internal_commands logger ~itn_features =
20052040
let%bind ( precomputed_values
20062041
, _config_jsons
20072042
, _config
2008-
, _chain_state_locations ) =
2043+
, _chain_state_locations
2044+
, _ ) =
20092045
load_config_files ~logger ~conf_dir ~genesis_dir ~genesis_constants
20102046
~constraint_constants ~proof_level ~cli_proof_level:None
2011-
~genesis_backing_type:Stable_db config_files
2047+
~hardfork_handling:Keep_running config_files
20122048
in
20132049
let pids = Child_processes.Termination.create_pid_table () in
20142050
let%bind prover =

src/app/cli/src/init/client.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1845,7 +1845,7 @@ let compile_time_constants =
18451845
conf_dir ^/ "daemon.json"
18461846
in
18471847
let open Async in
1848-
let%map ({ consensus_constants; _ } as precomputed_values), _ =
1848+
let%map ({ consensus_constants; _ } as precomputed_values) =
18491849
config_file |> Genesis_ledger_helper.load_config_json >>| Or_error.ok
18501850
>>| Option.value
18511851
~default:
@@ -1854,8 +1854,7 @@ let compile_time_constants =
18541854
>>| Option.value ~default:Runtime_config.default
18551855
>>= Genesis_ledger_helper.init_from_config_file ~genesis_constants
18561856
~constraint_constants ~logger:(Logger.null ()) ~proof_level
1857-
~cli_proof_level:None ~genesis_dir
1858-
~genesis_backing_type:Stable_db
1857+
~cli_proof_level:None ~genesis_dir ~ledger_backing:Stable_db
18591858
>>| Or_error.ok_exn
18601859
in
18611860
let all_constants =

src/app/cli/src/init/test_submit_to_archive.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,8 @@ let load_and_initialize_config ~logger ~config_file =
462462
let proof_level = Genesis_constants.Compiled.proof_level in
463463
Genesis_ledger_helper.init_from_config_file ~genesis_constants
464464
~constraint_constants ~logger ~proof_level ~cli_proof_level:None
465-
~genesis_dir:"genesis" ~genesis_backing_type:Stable_db runtime_config
466-
>>| Or_error.ok_exn >>| fst
465+
~genesis_dir:"genesis" ~ledger_backing:Stable_db runtime_config
466+
>>| Or_error.ok_exn
467467

468468
let initialize_verifier_and_components ~logger
469469
~(precomputed_values : Precomputed_values.t) =

src/app/delegation_verify/delegation_verify.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ let instantiate_verify_functions ~logger ~genesis_constants
6363
in
6464
Genesis_ledger_helper.init_from_config_file ~logger ~proof_level
6565
~constraint_constants ~genesis_constants ~cli_proof_level
66-
~genesis_backing_type:Stable_db config
66+
~ledger_backing:Stable_db config
6767
in
6868
let%map.Deferred precomputed_values =
6969
match precomputed_values with
70-
| Ok (precomputed_values, _) ->
70+
| Ok precomputed_values ->
7171
Deferred.return precomputed_values
7272
| Error _ ->
7373
Output.display_error "fail to read config file" ;

src/app/runtime_genesis_ledger/dune

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@
1313
yojson
1414
async_unix
1515
;;local libraries
16+
cache_dir
17+
cli_lib
18+
coda_genesis_ledger
19+
consensus
1620
genesis_constants
21+
genesis_ledger_helper
22+
logger
23+
mina_base
1724
mina_runtime_config
1825
mina_ledger
19-
genesis_ledger_helper
2026
mina_stdlib
21-
logger
22-
cache_dir
23-
precomputed_values
24-
coda_genesis_ledger
25-
consensus
26-
mina_base)
27+
precomputed_values)
2728
(instrumentation
2829
(backend bisect_ppx))
2930
(preprocess

src/app/runtime_genesis_ledger/runtime_genesis_ledger.ml

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,23 @@ end
1515

1616
let logger = Logger.create ()
1717

18-
let load_ledger ~ignore_missing_fields ~pad_app_state
18+
let load_ledger ~ignore_missing_fields ~pad_app_state ~hardfork_slot
1919
~(constraint_constants : Genesis_constants.Constraint_constants.t)
2020
(accounts : Runtime_config.Accounts.t) =
21+
let transform_account account =
22+
let account_padded =
23+
Runtime_config.Accounts.Single.to_account ~ignore_missing_fields
24+
~pad_app_state account
25+
in
26+
match hardfork_slot with
27+
| None ->
28+
account_padded
29+
| Some hardfork_slot ->
30+
Mina_base.Account.slot_reduction_update ~hardfork_slot account_padded
31+
in
32+
2133
let accounts =
22-
List.map accounts ~f:(fun account ->
23-
( None
24-
, Runtime_config.Accounts.Single.to_account ~ignore_missing_fields
25-
~pad_app_state account ) )
34+
List.map accounts ~f:(fun account -> (None, transform_account account))
2635
in
2736
let packed =
2837
Genesis_ledger_helper.Ledger.packed_genesis_ledger_of_accounts ~logger
@@ -132,24 +141,54 @@ let load_config_exn config_file =
132141

133142
let main ~(constraint_constants : Genesis_constants.Constraint_constants.t)
134143
~config_file ~genesis_dir ~hash_output_file ~ignore_missing_fields
135-
~pad_app_state () =
144+
~pad_app_state ~hardfork_slot ~prefork_genesis_config () =
145+
let hardfork_slot =
146+
match (hardfork_slot, prefork_genesis_config) with
147+
| None, None ->
148+
None
149+
| Some hardfork_slot, Some prefork_genesis_config ->
150+
let runtime_config =
151+
Yojson.Safe.from_file prefork_genesis_config
152+
|> Runtime_config.of_yojson |> Result.ok_or_failwith
153+
in
154+
let current_genesis_global_slot =
155+
let open Option.Let_syntax in
156+
let%bind proof = runtime_config.proof in
157+
let%map { global_slot_since_genesis; _ } = proof.fork in
158+
Mina_numbers.Global_slot_since_genesis.of_int
159+
global_slot_since_genesis
160+
in
161+
Option.some
162+
@@ Mina_numbers.Global_slot_since_hard_fork.to_global_slot_since_genesis
163+
~current_genesis_global_slot hardfork_slot
164+
| Some _, None ->
165+
failwith
166+
"hardfork slot is present but no prefork genesis config is provided"
167+
| None, Some _ ->
168+
[%log info]
169+
"prefork genesis config is provided with no hardfork slot provided, \
170+
ignoring" ;
171+
None
172+
in
136173
let%bind accounts, staking_accounts_opt, next_accounts_opt =
137174
load_config_exn config_file
138175
in
139176
let ledger =
140177
load_ledger ~ignore_missing_fields ~pad_app_state ~constraint_constants
141-
accounts
178+
~hardfork_slot accounts
142179
in
143180
let staking_ledger : Ledger.t =
144181
Option.value_map ~default:ledger
145182
~f:
146-
(load_ledger ~ignore_missing_fields ~pad_app_state ~constraint_constants)
183+
(load_ledger ~ignore_missing_fields ~pad_app_state ~constraint_constants
184+
~hardfork_slot )
147185
staking_accounts_opt
148186
in
149187
let next_ledger =
150188
Option.value_map ~default:staking_ledger
151189
~f:
152-
(load_ledger ~ignore_missing_fields ~pad_app_state ~constraint_constants)
190+
(load_ledger ~ignore_missing_fields ~pad_app_state ~constraint_constants
191+
~hardfork_slot )
153192
next_accounts_opt
154193
in
155194
let%bind hash_json =
@@ -196,6 +235,21 @@ let () =
196235
~doc:
197236
"BOOL whether to pad app_state to max allowed size (default: \
198237
false)"
238+
and hardfork_slot =
239+
flag "--hardfork-slot"
240+
(optional Cli_lib.Arg_type.hardfork_slot)
241+
~doc:
242+
"INT the scheduled hardfork slot since last hardfork at which \
243+
vesting parameter update should happen. If absent, don't \
244+
update the vesting parameters"
245+
and prefork_genesis_config =
246+
flag "--prefork-genesis-config" (optional string)
247+
~doc:
248+
"STRING path to prefork genesis confg, should be present if \
249+
`--hardfork-slot` is set, the program would read the genesis \
250+
timestamps in the config to calculate the proper hardfork \
251+
slot."
199252
in
200253
main ~constraint_constants ~config_file ~genesis_dir ~hash_output_file
201-
~ignore_missing_fields ~pad_app_state) )
254+
~ignore_missing_fields ~pad_app_state ~hardfork_slot
255+
~prefork_genesis_config) )

src/lib/cli_lib/arg_type.ml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ let global_slot =
7878
Command.Arg_type.map Command.Param.int
7979
~f:Mina_numbers.Global_slot_since_genesis.of_int
8080

81+
let hardfork_slot =
82+
Command.Arg_type.map Command.Param.int
83+
~f:Mina_numbers.Global_slot_since_hard_fork.of_int
84+
8185
let txn_fee =
8286
Command.Arg_type.map Command.Param.string ~f:Currency.Fee.of_mina_string_exn
8387

src/lib/genesis_ledger_helper/dune

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@
4444
logger
4545
mina_base.import
4646
staged_ledger_diff
47-
mina_stdlib_unix)
47+
mina_stdlib_unix
48+
cli_lib)
4849
(instrumentation
4950
(backend bisect_ppx))
5051
(preprocess

0 commit comments

Comments
 (0)