From 6ada249f91db90c4a19e335489f341ff6a8de623 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 11:54:20 +0100 Subject: [PATCH 1/6] Proto/Delegate_storage: more comments --- .../lib_protocol/delegate_storage.ml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/proto_alpha/lib_protocol/delegate_storage.ml b/src/proto_alpha/lib_protocol/delegate_storage.ml index b2ee0bfdc66e..0da2cf0c8b7e 100644 --- a/src/proto_alpha/lib_protocol/delegate_storage.ml +++ b/src/proto_alpha/lib_protocol/delegate_storage.ml @@ -25,6 +25,25 @@ (* *) (*****************************************************************************) +(* + Some invariants: + + A contract is a delegate <=> + - it is registered (i.e. in the set {!Storage.Delegates.mem}), and + - its full staking balance is initialized. + + If a contract is a delegate then : + - it has no stake in another account, though it may (still) have unstake + requests from another contract. + + If a contract is not a delegate then: + - it has no *own* frozen stake (a.k.a. frozen deposits), + - it has no consensus key. + + Once a contract has become a delegate, it is so forever. There are no ways + to unregister. +*) + type error += | (* `Permanent *) Unregistered_delegate of Signature.Public_key_hash.t @@ -129,6 +148,7 @@ module Contract = struct in let* c = Contract_delegate_storage.set c contract delegate in let* c = + (* This initializes the full staking balance of [delegate]. *) Stake_storage.add_delegated_stake c delegate balance_and_frozen_bonds in let*! c = Storage.Delegates.add c delegate in -- GitLab From ba1505488e76460167c738085abfe40097bcde88 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 11:52:39 +0100 Subject: [PATCH 2/6] Proto/Stake_storage: simplify get_full_staking_balance It is only called on registered delegates. The staking balance of registered delegates is always initialized. --- src/proto_alpha/lib_protocol/stake_storage.ml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 1cbe43ee1bc4..107f9b025d64 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -73,10 +73,7 @@ module Selected_distribution_for_cycle = struct Storage.Stake.Selected_distribution_for_cycle.remove_existing ctxt cycle end -let get_full_staking_balance ctxt delegate = - let open Lwt_result_syntax in - let+ staking_balance_opt = Storage.Stake.Staking_balance.find ctxt delegate in - Option.value staking_balance_opt ~default:Full_staking_balance_repr.zero +let get_full_staking_balance = Storage.Stake.Staking_balance.get let get_initialized_stake ctxt delegate = let open Lwt_result_syntax in -- GitLab From f84bb5bef9fd0bf2144c38d9ff7d84b5f3cb3cee Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 12:04:50 +0100 Subject: [PATCH 3/6] Proto/Stake_storage: inactive delegates are still registered delegates --- src/proto_alpha/lib_protocol/stake_storage.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 107f9b025d64..f7f91531b04d 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -206,7 +206,7 @@ let set_active ctxt delegate = let* ctxt, inactive = Delegate_activation_storage.set_active ctxt delegate in if not inactive then return ctxt else - let* staking_balance, ctxt = get_initialized_stake ctxt delegate in + let* staking_balance = get_full_staking_balance ctxt delegate in if has_minimal_stake ctxt staking_balance then let*! ctxt = Storage.Stake.Active_delegates_with_minimal_stake.add ctxt delegate () -- GitLab From a08932ae8ec9f417ef7701e32e37f6717f17ec0c Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 21:47:37 +0100 Subject: [PATCH 4/6] Proto/Delegate_storage: initializes staking balance explicitly --- src/proto_alpha/lib_protocol/delegate_storage.ml | 7 +++++-- src/proto_alpha/lib_protocol/stake_storage.ml | 16 ++++++++++++++++ src/proto_alpha/lib_protocol/stake_storage.mli | 6 ++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_storage.ml b/src/proto_alpha/lib_protocol/delegate_storage.ml index 0da2cf0c8b7e..04ee724eba8d 100644 --- a/src/proto_alpha/lib_protocol/delegate_storage.ml +++ b/src/proto_alpha/lib_protocol/delegate_storage.ml @@ -148,8 +148,11 @@ module Contract = struct in let* c = Contract_delegate_storage.set c contract delegate in let* c = - (* This initializes the full staking balance of [delegate]. *) - Stake_storage.add_delegated_stake c delegate balance_and_frozen_bonds + (* Initializes the full staking balance of [delegate]. *) + Stake_storage.initialize_delegate + c + delegate + ~delegated:balance_and_frozen_bonds in let*! c = Storage.Delegates.add c delegate in let* c = Delegate_consensus_key.init c delegate pk in diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index f7f91531b04d..2289bbb5be8f 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -105,6 +105,22 @@ let has_minimal_stake_and_frozen_stake ctxt Tez_repr.(own_frozen >= minimal_frozen_stake) && has_minimal_stake ctxt full_staking_balance +let initialize_delegate ctxt delegate ~delegated = + let open Lwt_result_syntax in + let balance = + Full_staking_balance_repr.make + ~own_frozen:Tez_repr.zero + ~staked_frozen:Tez_repr.zero + ~delegated + in + let* ctxt = Storage.Stake.Staking_balance.init ctxt delegate balance in + if has_minimal_stake ctxt balance then + let*! ctxt = + Storage.Stake.Active_delegates_with_minimal_stake.add ctxt delegate () + in + return ctxt + else return ctxt + let update_stake ~f ctxt delegate = let open Lwt_result_syntax in let* staking_balance_before, ctxt = get_initialized_stake ctxt delegate in diff --git a/src/proto_alpha/lib_protocol/stake_storage.mli b/src/proto_alpha/lib_protocol/stake_storage.mli index 413ebf3582f2..440aa77b7761 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.mli +++ b/src/proto_alpha/lib_protocol/stake_storage.mli @@ -34,6 +34,12 @@ - {!Storage.Stake.Total_active_stake} *) +val initialize_delegate : + Raw_context.t -> + Signature.public_key_hash -> + delegated:Tez_repr.t -> + Raw_context.t tzresult Lwt.t + val get_full_staking_balance : Raw_context.t -> Signature.public_key_hash -> -- GitLab From 52265ee0abfe3fa33afa90f0b3a6362bd8361297 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 21:49:25 +0100 Subject: [PATCH 5/6] Proto/Stake_storage: the staking balance is always initialized on registered delegates --- src/proto_alpha/lib_protocol/stake_storage.ml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 2289bbb5be8f..bd3255e5c265 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -75,16 +75,6 @@ end let get_full_staking_balance = Storage.Stake.Staking_balance.get -let get_initialized_stake ctxt delegate = - let open Lwt_result_syntax in - let* balance_opt = Storage.Stake.Staking_balance.find ctxt delegate in - match balance_opt with - | Some staking_balance -> return (staking_balance, ctxt) - | None -> - let balance = Full_staking_balance_repr.zero in - let* ctxt = Storage.Stake.Staking_balance.init ctxt delegate balance in - return (balance, ctxt) - let has_minimal_stake ctxt {Full_staking_balance_repr.own_frozen; staked_frozen; delegated} = let open Result_syntax in @@ -123,7 +113,7 @@ let initialize_delegate ctxt delegate ~delegated = let update_stake ~f ctxt delegate = let open Lwt_result_syntax in - let* staking_balance_before, ctxt = get_initialized_stake ctxt delegate in + let* staking_balance_before = get_full_staking_balance ctxt delegate in let*? staking_balance = f staking_balance_before in let* ctxt = Storage.Stake.Staking_balance.update ctxt delegate staking_balance -- GitLab From ce7fef7604b067edf62deedc18e9d28851a8f892 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 6 Dec 2023 21:49:55 +0100 Subject: [PATCH 6/6] Proto/Full_staking_balance_repr: remove zero --- src/proto_alpha/lib_protocol/full_staking_balance_repr.ml | 6 ------ src/proto_alpha/lib_protocol/full_staking_balance_repr.mli | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index 745ed009b166..1d0e825c5522 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -14,12 +14,6 @@ type t = { let make ~own_frozen ~staked_frozen ~delegated = {own_frozen; staked_frozen; delegated} -let zero = - make - ~own_frozen:Tez_repr.zero - ~staked_frozen:Tez_repr.zero - ~delegated:Tez_repr.zero - let encoding = let open Data_encoding in conv diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index 019ab5cf08ad..0fde0fbfd3ec 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -14,8 +14,6 @@ type t = private { val make : own_frozen:Tez_repr.t -> staked_frozen:Tez_repr.t -> delegated:Tez_repr.t -> t -val zero : t - val encoding : t Data_encoding.t (** The weight of a delegate used for voting rights. *) -- GitLab