diff --git a/src/proto_alpha/lib_parameters/default_parameters.ml b/src/proto_alpha/lib_parameters/default_parameters.ml index 2ea7877721f755da6f157d3a1e12b93d3afbe1c1..366a3067671f3121cd0ff0453d5d518420e9c58e 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/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index d0adde3d981b887506b77fcd57ffce260b279d36..7ecece83bf89017c9fcfd11693ba9e884b0506ab 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 8e1f9cd6426d7f01337e55bf85d22c58e6846bd9..801d20b58fafe16f7cc4b432aa351e3ce3943fbd 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 08a2672a4a94a9744683dff4e54419a233e94908..a45af41e6d0d146bfe319fe68b1f3c34e06c2773 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, 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/raw_context.ml b/src/proto_alpha/lib_protocol/raw_context.ml index d5350aad160b37b244b12ca83899701d5aecf3bc..f771611dd1363f2ab865edb5c41b1faf43b37548 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 @@ -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; @@ -1265,7 +1269,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 +1279,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 327b8ed2c0a28d5c4d98e235f88134517c015bb1..76a39cc234385210af5d31ad82eea384a05591ac 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 diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index b2995c36b7b743815df960c52d71662faab4a2b8..712a1aedf77059619ad99e6cf988e7220f3bc530 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 5dbf028bbc7bbec3c91f3befd65e99874dc74dfd..721e24698c6efdd87d2a047c51a2ca14c09dbe3d 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