@@ -2828,6 +2828,7 @@ module Hardfork_config = struct
2828
2828
; staking_epoch_seed : Epoch_seed .t
2829
2829
; next_epoch_seed : Epoch_seed .t
2830
2830
; blockchain_length : Mina_numbers.Length .t
2831
+ ; block_timestamp : Block_time .t
2831
2832
}
2832
2833
2833
2834
let prepare_inputs ~breadcrumb_spec mina =
@@ -2840,6 +2841,7 @@ module Hardfork_config = struct
2840
2841
|> Consensus.Data.Consensus_state. global_slot_since_genesis
2841
2842
in
2842
2843
let state_hash = Transition_frontier.Breadcrumb. state_hash breadcrumb in
2844
+ let block_timestamp = block |> Mina_block. timestamp in
2843
2845
let protocol_state =
2844
2846
Transition_frontier.Breadcrumb. protocol_state breadcrumb
2845
2847
in
@@ -2859,7 +2861,256 @@ module Hardfork_config = struct
2859
2861
; staking_epoch_seed
2860
2862
; next_epoch_seed
2861
2863
; blockchain_length
2864
+ ; block_timestamp
2862
2865
}
2866
+
2867
+ (* * Copy the roots of the [source_ledgers] and gather the stable ledger
2868
+ diffs from the [source_ledgers] to their roots *)
2869
+ let copy_genesis_roots_and_diffs ~source_ledgers parent_directory =
2870
+ Core.Unix. mkdir_p parent_directory ;
2871
+ let genesis_ledger_data =
2872
+ let directory_name = parent_directory ^/ " genesis_ledger" in
2873
+ let root =
2874
+ Ledger.Root. create_checkpoint_with_directory
2875
+ source_ledgers.root_snarked_ledger ~directory_name
2876
+ in
2877
+ let diff = Ledger. all_accounts_on_masks source_ledgers.staged_ledger in
2878
+ (root, diff)
2879
+ in
2880
+ let genesis_staking_ledger_data =
2881
+ let directory_name = parent_directory ^/ " staking_ledger" in
2882
+ match source_ledgers.staking_ledger with
2883
+ | `Genesis _l ->
2884
+ failwith " TODO!"
2885
+ | `Root l ->
2886
+ let root =
2887
+ Ledger.Root. create_checkpoint_with_directory l ~directory_name
2888
+ in
2889
+ let diff = Ledger.Location.Map. empty in
2890
+ (root, diff)
2891
+ in
2892
+ let genesis_next_epoch_ledger_data =
2893
+ let directory_name = parent_directory ^/ " next_epoch_ledger" in
2894
+ match source_ledgers.next_epoch_ledger with
2895
+ | `Genesis _l ->
2896
+ failwith " TODO!"
2897
+ | `Root l ->
2898
+ let root =
2899
+ Ledger.Root. create_checkpoint_with_directory l ~directory_name
2900
+ in
2901
+ let diff = Ledger.Location.Map. empty in
2902
+ (root, diff)
2903
+ | `Uncommitted l ->
2904
+ let root =
2905
+ Ledger.Root. create_checkpoint_with_directory
2906
+ source_ledgers.root_snarked_ledger ~directory_name
2907
+ in
2908
+ let diff = Ledger. all_accounts_on_masks l in
2909
+ (root, diff)
2910
+ in
2911
+ ( genesis_ledger_data
2912
+ , genesis_staking_ledger_data
2913
+ , genesis_next_epoch_ledger_data )
2914
+
2915
+ (* * Generate the tar file and runtime ledger config for the given root
2916
+ database, and close and delete the database *)
2917
+ let generate_tar_and_config ~get_directory ~get_root_hash ~close_root ~logger
2918
+ ~target_dir ~ledger_name_prefix root =
2919
+ let open Deferred.Or_error.Let_syntax in
2920
+ let root_hash = get_root_hash root in
2921
+ let ledger_dirname = get_directory root |> Option. value_exn in
2922
+ let % bind tar_path =
2923
+ Genesis_ledger_helper.Ledger. generate_tar ~logger ~target_dir
2924
+ ~ledger_name_prefix ~root_hash ~ledger_dirname ()
2925
+ in
2926
+ let % map s3_data_hash =
2927
+ Genesis_ledger_helper. sha3_hash tar_path
2928
+ |> Deferred. map ~f: Or_error. return
2929
+ in
2930
+ let config =
2931
+ Runtime_config. ledger_of_hashes
2932
+ ~root_hash: (Mina_base.Ledger_hash. to_base58_check root_hash)
2933
+ ~s3_data_hash ()
2934
+ in
2935
+ close_root root ;
2936
+ Mina_stdlib_unix.File_system. rmrf ledger_dirname ;
2937
+ config
2938
+
2939
+ let generate_tars_and_configs ~get_directory ~get_root_hash ~close_root
2940
+ ~logger ~target_dir genesis_ledger genesis_staking_ledger
2941
+ genesis_next_epoch_ledger =
2942
+ let open Deferred.Or_error.Let_syntax in
2943
+ Core.Unix. mkdir_p target_dir ;
2944
+ let % bind genesis_ledger_config =
2945
+ generate_tar_and_config ~get_directory ~get_root_hash ~close_root ~logger
2946
+ ~target_dir ~ledger_name_prefix: " genesis_ledger" genesis_ledger
2947
+ in
2948
+ let % bind genesis_staking_ledger_config =
2949
+ generate_tar_and_config ~get_directory ~get_root_hash ~close_root ~logger
2950
+ ~target_dir ~ledger_name_prefix: " epoch_ledger" genesis_staking_ledger
2951
+ in
2952
+ let % map genesis_next_epoch_ledger_config =
2953
+ generate_tar_and_config ~get_directory ~get_root_hash ~close_root ~logger
2954
+ ~target_dir ~ledger_name_prefix: " epoch_ledger" genesis_next_epoch_ledger
2955
+ in
2956
+ ( genesis_ledger_config
2957
+ , genesis_staking_ledger_config
2958
+ , genesis_next_epoch_ledger_config )
2959
+
2960
+ let make_full_config ~genesis_state_timestamp ~global_slot_since_genesis
2961
+ ~state_hash ~blockchain_length ~staking_epoch_seed ~next_epoch_seed
2962
+ ( genesis_ledger_config
2963
+ , genesis_staking_ledger_config
2964
+ , genesis_next_epoch_ledger_config ) =
2965
+ Runtime_config. make_automatic_fork_config ~genesis_state_timestamp
2966
+ ~genesis_ledger_config ~global_slot_since_genesis ~state_hash
2967
+ ~blockchain_length ~staking_ledger_config: genesis_staking_ledger_config
2968
+ ~staking_epoch_seed: (Epoch_seed. to_base58_check staking_epoch_seed)
2969
+ ~next_epoch_ledger_config: (Some genesis_next_epoch_ledger_config)
2970
+ ~next_epoch_seed: (Epoch_seed. to_base58_check next_epoch_seed)
2971
+
2972
+ let write_config_file ~filename daemon_config =
2973
+ Async.Writer. save filename
2974
+ ~contents: (Yojson.Safe. to_string (Runtime_config. to_yojson daemon_config))
2975
+ |> Deferred. map ~f: Or_error. return
2976
+
2977
+ let write_stable_config_directory ~logger ~genesis_state_timestamp
2978
+ ~global_slot_since_genesis ~state_hash ~staking_epoch_seed
2979
+ ~next_epoch_seed ~blockchain_length ~config_dir genesis_ledger
2980
+ genesis_staking_ledger genesis_next_epoch_ledger =
2981
+ let open Deferred.Or_error.Let_syntax in
2982
+ [% log debug]
2983
+ " Generating database files and daemon.json for stable hard fork config" ;
2984
+ Core.Unix. mkdir_p config_dir ;
2985
+ let genesis_dir = config_dir ^/ " genesis" in
2986
+ let % bind genesis_config =
2987
+ generate_tars_and_configs ~get_directory: Ledger.Db. get_directory
2988
+ ~get_root_hash: Ledger.Db. merkle_root ~close_root: Ledger.Db. close ~logger
2989
+ ~target_dir: genesis_dir genesis_ledger genesis_staking_ledger
2990
+ genesis_next_epoch_ledger
2991
+ in
2992
+ write_config_file
2993
+ ~filename: (config_dir ^/ " daemon.json" )
2994
+ (make_full_config ~genesis_state_timestamp ~global_slot_since_genesis
2995
+ ~state_hash ~blockchain_length ~staking_epoch_seed ~next_epoch_seed
2996
+ genesis_config )
2997
+
2998
+ let write_migrated_config_directory ~logger ~genesis_state_timestamp
2999
+ ~global_slot_since_genesis ~state_hash ~staking_epoch_seed
3000
+ ~next_epoch_seed ~blockchain_length ~config_dir genesis_ledger
3001
+ genesis_staking_ledger genesis_next_epoch_ledger =
3002
+ let open Deferred.Or_error.Let_syntax in
3003
+ [% log debug]
3004
+ " Generating database files and daemon.json for migrated hard fork config" ;
3005
+ Core.Unix. mkdir_p config_dir ;
3006
+ let genesis_dir = config_dir ^/ " genesis" in
3007
+ let % bind genesis_config =
3008
+ generate_tars_and_configs ~get_directory: Ledger.Hardfork_db. get_directory
3009
+ ~get_root_hash: Ledger.Hardfork_db. merkle_root
3010
+ ~close_root: Ledger.Hardfork_db. close ~logger ~target_dir: genesis_dir
3011
+ genesis_ledger genesis_staking_ledger genesis_next_epoch_ledger
3012
+ in
3013
+ write_config_file
3014
+ ~filename: (config_dir ^/ " daemon.json" )
3015
+ (make_full_config ~genesis_state_timestamp ~global_slot_since_genesis
3016
+ ~state_hash ~blockchain_length ~staking_epoch_seed ~next_epoch_seed
3017
+ genesis_config )
3018
+
3019
+ let genesis_timestamp_str ~hardfork_genesis_timestamp_offset block_timestamp =
3020
+ block_timestamp |> Block_time. to_time_exn
3021
+ |> Fn. flip Time. add hardfork_genesis_timestamp_offset
3022
+ |> Time. to_string_iso8601_basic ~zone: Time.Zone. utc
3023
+
3024
+ let generate_hardfork_configs ~logger
3025
+ ~inputs :
3026
+ { source_ledgers
3027
+ ; global_slot_since_genesis
3028
+ ; state_hash
3029
+ ; staking_epoch_seed
3030
+ ; next_epoch_seed
3031
+ ; blockchain_length
3032
+ ; block_timestamp
3033
+ } ~build_dir directory_name =
3034
+ let open Deferred.Or_error.Let_syntax in
3035
+ let migrate_and_apply (root , diff ) =
3036
+ let % map.Deferred root = Ledger.Root. make_converting root in
3037
+ Ledger.Any_ledger.M. set_batch
3038
+ (Ledger.Root. as_unmasked root)
3039
+ (Map. to_alist diff) ;
3040
+ let stable_db, migrated_db_opt =
3041
+ Ledger.Root. unsafely_decompose_root root
3042
+ in
3043
+ let migrated_db =
3044
+ migrated_db_opt
3045
+ |> Option. value_exn
3046
+ ~message: " Invariant: root was already made converting"
3047
+ in
3048
+ (stable_db, migrated_db)
3049
+ in
3050
+ [% log debug] " Copying hard fork genesis ledger inputs" ;
3051
+ let ( genesis_ledger_data
3052
+ , genesis_staking_ledger_data
3053
+ , genesis_next_epoch_ledger_data ) =
3054
+ copy_genesis_roots_and_diffs ~source_ledgers build_dir
3055
+ in
3056
+ let % bind.Deferred genesis_ledger_legacy, genesis_ledger_migrated =
3057
+ migrate_and_apply genesis_ledger_data
3058
+ in
3059
+ let % bind.Deferred ( genesis_staking_ledger_legacy
3060
+ , genesis_staking_ledger_migrated ) =
3061
+ migrate_and_apply genesis_staking_ledger_data
3062
+ in
3063
+ let % bind.Deferred ( genesis_next_epoch_ledger_legacy
3064
+ , genesis_next_epoch_ledger_migrated ) =
3065
+ migrate_and_apply genesis_next_epoch_ledger_data
3066
+ in
3067
+ (* TODO: the correct timestamp is actually the timestamp of the slot_tx_end plus the hardfork genesis offset *)
3068
+ let genesis_state_timestamp =
3069
+ genesis_timestamp_str
3070
+ ~hardfork_genesis_timestamp_offset: (Time.Span. of_int_sec 0 )
3071
+ block_timestamp
3072
+ in
3073
+ [% log debug] " Writing hard fork config directories" ;
3074
+ let % bind () =
3075
+ write_stable_config_directory ~logger ~genesis_state_timestamp
3076
+ ~global_slot_since_genesis ~state_hash ~staking_epoch_seed
3077
+ ~next_epoch_seed ~blockchain_length
3078
+ ~config_dir: (directory_name ^/ " fork_validation" ^/ " legacy" )
3079
+ genesis_ledger_legacy genesis_staking_ledger_legacy
3080
+ genesis_next_epoch_ledger_legacy
3081
+ in
3082
+ let % bind () =
3083
+ write_migrated_config_directory ~logger ~genesis_state_timestamp
3084
+ ~global_slot_since_genesis ~state_hash ~staking_epoch_seed
3085
+ ~next_epoch_seed ~blockchain_length ~config_dir: directory_name
3086
+ genesis_ledger_migrated genesis_staking_ledger_migrated
3087
+ genesis_next_epoch_ledger_migrated
3088
+ in
3089
+ return ()
3090
+
3091
+ let dump_reference_config ~breadcrumb_spec ~directory_name mina =
3092
+ let open Deferred.Or_error.Let_syntax in
3093
+ let logger = mina.config.logger in
3094
+ Deferred.Or_error. try_with_join ~here: [% here]
3095
+ @@ fun () ->
3096
+ let % bind.Deferred dir_exists =
3097
+ Mina_stdlib_unix.File_system. dir_exists directory_name
3098
+ in
3099
+ let % bind () =
3100
+ if dir_exists then
3101
+ Deferred.Or_error. error_string
3102
+ " Requested config directory already exists"
3103
+ else return ()
3104
+ in
3105
+ [% log debug] " Creating reference hard fork config in $directory_name"
3106
+ ~metadata: [ (" directory_name" , `String directory_name) ] ;
3107
+ let % bind.Deferred () =
3108
+ Mina_stdlib_unix.File_system. create_dir directory_name
3109
+ in
3110
+ let % bind inputs = prepare_inputs ~breadcrumb_spec mina in
3111
+ Mina_stdlib_unix.File_system. with_temp_dir (directory_name ^/ " _build" )
3112
+ ~f: (fun build_dir ->
3113
+ generate_hardfork_configs ~logger ~inputs ~build_dir directory_name )
2863
3114
end
2864
3115
2865
3116
let zkapp_cmd_limit t = t.config.zkapp_cmd_limit
0 commit comments