From ed4ca2bffc47c0ab39ba8860ceebc1269040cfa7 Mon Sep 17 00:00:00 2001 From: Marina Polubelova Date: Fri, 19 Jan 2024 15:02:23 +0100 Subject: [PATCH 1/3] proto: expose previous_proto_constants for protocol migration --- src/proto_alpha/lib_protocol/init_storage.ml | 2 +- src/proto_alpha/lib_protocol/raw_context.ml | 8 ++++---- src/proto_alpha/lib_protocol/raw_context.mli | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/proto_alpha/lib_protocol/init_storage.ml b/src/proto_alpha/lib_protocol/init_storage.ml index 08a2672a4a94..2429e95d7a92 100644 --- a/src/proto_alpha/lib_protocol/init_storage.ml +++ b/src/proto_alpha/lib_protocol/init_storage.ml @@ -182,7 +182,7 @@ let clean_frozen_deposits_for_p ctxt = let prepare_first_block chain_id ctxt ~typecheck_smart_contract ~typecheck_smart_rollup ~level ~timestamp ~predecessor = let open Lwt_result_syntax in - let* previous_protocol, ctxt = + let* previous_protocol, _previous_proto_constants, ctxt = Raw_context.prepare_first_block ~level ~timestamp chain_id ctxt in let parametric = Raw_context.constants ctxt in diff --git a/src/proto_alpha/lib_protocol/raw_context.ml b/src/proto_alpha/lib_protocol/raw_context.ml index d5350aad160b..38cab1c081b9 100644 --- a/src/proto_alpha/lib_protocol/raw_context.ml +++ b/src/proto_alpha/lib_protocol/raw_context.ml @@ -1011,7 +1011,7 @@ let update_cycle_eras ctxt level ~prev_blocks_per_cycle ~blocks_per_cycle let prepare_first_block ~level ~timestamp _chain_id ctxt = let open Lwt_result_syntax in let* previous_proto, ctxt = check_and_update_protocol_version ctxt in - let* ctxt = + let* ctxt, previous_proto_constants = match previous_proto with | Genesis param -> let*? first_level = Raw_level_repr.of_int32 level in @@ -1026,7 +1026,7 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = let*? cycle_eras = Level_repr.create_cycle_eras [cycle_era] in let* ctxt = set_cycle_eras ctxt cycle_eras in let*! result = add_constants ctxt param.constants in - return result + return (result, None) | Oxford_018 -> let*! c = get_previous_protocol_constants ctxt in @@ -1265,7 +1265,7 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = else return (ctxt, constants) in let*! ctxt = add_constants ctxt constants in - return ctxt + return (ctxt, Some c) in let+ ctxt = prepare @@ -1275,7 +1275,7 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = ~timestamp ~adaptive_issuance_enable:false in - (previous_proto, ctxt) + (previous_proto, previous_proto_constants, ctxt) let activate ctxt h = let open Lwt_syntax in diff --git a/src/proto_alpha/lib_protocol/raw_context.mli b/src/proto_alpha/lib_protocol/raw_context.mli index 327b8ed2c0a2..76a39cc23438 100644 --- a/src/proto_alpha/lib_protocol/raw_context.mli +++ b/src/proto_alpha/lib_protocol/raw_context.mli @@ -100,7 +100,8 @@ val prepare_first_block : timestamp:Time.t -> Chain_id.t -> Context.t -> - (previous_protocol * t) tzresult Lwt.t + (previous_protocol * Constants_parametric_previous_repr.t option * t) tzresult + Lwt.t val activate : t -> Protocol_hash.t -> t Lwt.t -- GitLab From 14968e1b05b354376c2b082c847dbd2249c337b3 Mon Sep 17 00:00:00 2001 From: Marina Polubelova Date: Fri, 19 Jan 2024 15:15:37 +0100 Subject: [PATCH 2/3] proto/constants: change consensus_rights_delay from 5 to 2 for mainnet --- src/proto_alpha/lib_parameters/default_parameters.ml | 2 +- src/proto_alpha/lib_protocol/raw_context.ml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_parameters/default_parameters.ml b/src/proto_alpha/lib_parameters/default_parameters.ml index 2ea7877721f7..366a3067671f 100644 --- a/src/proto_alpha/lib_parameters/default_parameters.ml +++ b/src/proto_alpha/lib_parameters/default_parameters.ml @@ -180,7 +180,7 @@ let constants_mainnet : Constants.Parametric.t = in let sc_rollup = make_sc_rollup_parameter ~dal_activation_level block_time in { - consensus_rights_delay = 5; + consensus_rights_delay = 2; blocks_preservation_cycles = 1; delegate_parameters_activation_delay = 5; blocks_per_cycle = 24576l; diff --git a/src/proto_alpha/lib_protocol/raw_context.ml b/src/proto_alpha/lib_protocol/raw_context.ml index 38cab1c081b9..f771611dd136 100644 --- a/src/proto_alpha/lib_protocol/raw_context.ml +++ b/src/proto_alpha/lib_protocol/raw_context.ml @@ -1190,10 +1190,14 @@ let prepare_first_block ~level ~timestamp _chain_id ctxt = } in let direct_ticket_spending_enable = false in + let consensus_rights_delay = + (* We change the consensus_rights_delay value only for mainnet *) + if Compare.Int.(c.preserved_cycles = 5) then 2 else c.preserved_cycles + in let constants = Constants_parametric_repr. { - consensus_rights_delay = c.preserved_cycles; + consensus_rights_delay; blocks_preservation_cycles = 1; delegate_parameters_activation_delay = c.preserved_cycles; blocks_per_cycle = c.blocks_per_cycle; -- GitLab From 1ecedea7afbefb9f071dd946b70add75fb47cbee Mon Sep 17 00:00:00 2001 From: Marina Polubelova Date: Fri, 19 Jan 2024 15:14:32 +0100 Subject: [PATCH 3/3] proto: cleanup values for protocol P This commit removes redundant entries in the following tables (when decreasing the consensus_rights_delay value): - Storage.Stake.Total_active_stake - Selected_distribution_for_cycle - Delegate_sampler_state --- .../lib_protocol/delegate_sampler.ml | 20 +++++++++ .../lib_protocol/delegate_sampler.mli | 7 +++ src/proto_alpha/lib_protocol/init_storage.ml | 43 ++++++++++++++++++- src/proto_alpha/lib_protocol/stake_storage.ml | 30 +++++++++++++ .../lib_protocol/stake_storage.mli | 7 +++ 5 files changed, 106 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index d0adde3d981b..7ecece83bf89 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -63,6 +63,13 @@ module Delegate_sampler_state = struct let id = identifier_of_cycle cycle in let*? ctxt = Cache.update ctxt id None in Storage.Delegate_sampler_state.remove_existing ctxt cycle + + let remove ctxt cycle = + let open Lwt_result_syntax in + let id = identifier_of_cycle cycle in + let*? ctxt = Cache.update ctxt id None in + let*! ctxt = Storage.Delegate_sampler_state.remove ctxt cycle in + return ctxt end module Random = struct @@ -239,6 +246,19 @@ let clear_outdated_sampling_data ctxt ~new_cycle = let* ctxt = Delegate_sampler_state.remove_existing ctxt outdated_cycle in Seed_storage.remove_for_cycle ctxt outdated_cycle +let cleanup_values_for_protocol_p ctxt ~preserved_cycles ~consensus_rights_delay + ~new_cycle = + let open Lwt_result_syntax in + assert (Compare.Int.(consensus_rights_delay <= preserved_cycles)) ; + if Compare.Int.(consensus_rights_delay = preserved_cycles) then return ctxt + else + let start_cycle = Cycle_repr.add new_cycle (consensus_rights_delay + 1) in + let end_cycle = Cycle_repr.add new_cycle preserved_cycles in + List.fold_left_es + Delegate_sampler_state.remove + ctxt + Cycle_repr.(start_cycle ---> end_cycle) + module For_RPC = struct let delegate_current_baking_power ctxt delegate = let open Lwt_result_syntax in diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.mli b/src/proto_alpha/lib_protocol/delegate_sampler.mli index 8e1f9cd6426d..801d20b58faf 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.mli +++ b/src/proto_alpha/lib_protocol/delegate_sampler.mli @@ -70,6 +70,13 @@ val clear_outdated_sampling_data : val select_distribution_for_cycle : Raw_context.t -> Cycle_repr.t -> Raw_context.t tzresult Lwt.t +val cleanup_values_for_protocol_p : + Raw_context.t -> + preserved_cycles:int -> + consensus_rights_delay:int -> + new_cycle:Cycle_repr.t -> + Raw_context.t tzresult Lwt.t + module For_RPC : sig (** The baking power for a given delegate computed from its current stake. *) diff --git a/src/proto_alpha/lib_protocol/init_storage.ml b/src/proto_alpha/lib_protocol/init_storage.ml index 2429e95d7a92..a45af41e6d0d 100644 --- a/src/proto_alpha/lib_protocol/init_storage.ml +++ b/src/proto_alpha/lib_protocol/init_storage.ml @@ -179,10 +179,48 @@ let clean_frozen_deposits_for_p ctxt = in Raw_context.update_tree ctxt contracts_index contracts_tree +let cleanup_values_for_protocol_p ctxt + (previous_proto_constants : Constants_parametric_previous_repr.t option) + level = + let open Lwt_result_syntax in + let preserved_cycles = + let previous_proto_constants = + match previous_proto_constants with + | None -> + (* Shouldn't happen *) + failwith + "Internal error: cannot read previous protocol constants in \ + context." + | Some c -> c + in + previous_proto_constants.preserved_cycles + in + let consensus_rights_delay = Constants_storage.consensus_rights_delay ctxt in + let new_cycle = + let next_level = Raw_level_repr.succ level in + let cycle_eras = Raw_context.cycle_eras ctxt in + (Level_repr.level_from_raw ~cycle_eras next_level).cycle + in + let* ctxt = + Stake_storage.cleanup_values_for_protocol_p + ctxt + ~preserved_cycles + ~consensus_rights_delay + ~new_cycle + in + let* ctxt = + Delegate_sampler.cleanup_values_for_protocol_p + ctxt + ~preserved_cycles + ~consensus_rights_delay + ~new_cycle + in + return ctxt + let prepare_first_block chain_id ctxt ~typecheck_smart_contract ~typecheck_smart_rollup ~level ~timestamp ~predecessor = let open Lwt_result_syntax in - let* previous_protocol, _previous_proto_constants, ctxt = + let* previous_protocol, previous_proto_constants, ctxt = Raw_context.prepare_first_block ~level ~timestamp chain_id ctxt in let parametric = Raw_context.constants ctxt in @@ -280,6 +318,9 @@ let prepare_first_block chain_id ctxt ~typecheck_smart_contract let* ctxt = migrate_staking_balance_and_active_delegates_for_p ctxt in let* ctxt = clean_frozen_deposits_for_p ctxt in let*! ctxt = Raw_context.remove ctxt ["last_snapshot"] in + let* ctxt = + cleanup_values_for_protocol_p ctxt previous_proto_constants level + in return (ctxt, []) in let* ctxt = diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index b2995c36b7b7..712a1aedf770 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -71,6 +71,15 @@ module Selected_distribution_for_cycle = struct let id = identifier_of_cycle cycle in let*? ctxt = Cache.update ctxt id None in Storage.Stake.Selected_distribution_for_cycle.remove_existing ctxt cycle + + let remove ctxt cycle = + let open Lwt_result_syntax in + let id = identifier_of_cycle cycle in + let*? ctxt = Cache.update ctxt id None in + let*! ctxt = + Storage.Stake.Selected_distribution_for_cycle.remove ctxt cycle + in + return ctxt end let get_full_staking_balance = Storage.Stake.Staking_balance.get @@ -263,6 +272,27 @@ let add_contract_delegated_stake ctxt contract amount = | None -> return ctxt | Some delegate -> add_delegated_stake ctxt delegate amount +(* let's assume that consensus_rights_delay <= preserved_cycles; + we need to keep [ new_cycles; new_cycles + consensus_rights_delay ] + and remove the rest, i.e., + [ new_cycles + consensus_rights_delay + 1; new_cycles + preserved_cycles ] *) +let cleanup_values_for_protocol_p ctxt ~preserved_cycles ~consensus_rights_delay + ~new_cycle = + let open Lwt_result_syntax in + assert (Compare.Int.(consensus_rights_delay <= preserved_cycles)) ; + if Compare.Int.(consensus_rights_delay = preserved_cycles) then return ctxt + else + let start_cycle = Cycle_repr.add new_cycle (consensus_rights_delay + 1) in + let end_cycle = Cycle_repr.add new_cycle preserved_cycles in + List.fold_left_es + (fun ctxt cycle_to_clear -> + let*! ctxt = + Storage.Stake.Total_active_stake.remove ctxt cycle_to_clear + in + Selected_distribution_for_cycle.remove ctxt cycle_to_clear) + ctxt + Cycle_repr.(start_cycle ---> end_cycle) + module For_RPC = struct let get_staking_balance ctxt delegate = let open Lwt_result_syntax in diff --git a/src/proto_alpha/lib_protocol/stake_storage.mli b/src/proto_alpha/lib_protocol/stake_storage.mli index 5dbf028bbc7b..721e24698c6e 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.mli +++ b/src/proto_alpha/lib_protocol/stake_storage.mli @@ -143,6 +143,13 @@ val add_contract_delegated_stake : val remove_contract_delegated_stake : Raw_context.t -> Contract_repr.t -> Tez_repr.t -> Raw_context.t tzresult Lwt.t +val cleanup_values_for_protocol_p : + Raw_context.t -> + preserved_cycles:int -> + consensus_rights_delay:int -> + new_cycle:Cycle_repr.t -> + Raw_context.t tzresult Lwt.t + module For_RPC : sig val get_staking_balance : Raw_context.t -> Signature.Public_key_hash.t -> Tez_repr.t tzresult Lwt.t -- GitLab