From 14594217db837c9294e016c527aa5f87d2bc7345 Mon Sep 17 00:00:00 2001 From: Rob Walker Date: Tue, 28 May 2019 16:01:27 -0700 Subject: [PATCH] undelete votestate etc (#4457) --- .../passive-stake-delegation-and-rewards.md | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/book/src/passive-stake-delegation-and-rewards.md b/book/src/passive-stake-delegation-and-rewards.md index 805253a6e5..d8814d6ed3 100644 --- a/book/src/passive-stake-delegation-and-rewards.md +++ b/book/src/passive-stake-delegation-and-rewards.md @@ -39,6 +39,125 @@ program is owned by the staker only. Lamports stored in this program are the stake. Unlike the current design, this program contains a new field to indicate which VoteState program the stake is delegated to. +### VoteState + +VoteState is the current state of all the votes the **delegate** has submitted +to the bank. VoteState contains the following state information: + +* votes - The submitted votes data structure. + +* credits - The total number of rewards this vote program has generated over its +lifetime. + +* root\_slot - The last slot to reach the full lockout commitment necessary for +rewards. + +* commission - The commission taken by this VoteState for any rewards claimed by +staker's StakeState accounts. This is the percentage ceiling of the reward. + +* Account::lamports - The accumulated lamports from the commission. These do not +count as stakes. + +* `authorized_vote_signer` - Only this identity is authorized to submit votes, and +this field can only modified by this entity + +### VoteInstruction::Initialize + +* `account[0]` - RW - The VoteState + `VoteState::authorized_vote_signer` is initialized to `account[0]` + other VoteState members defaulted + +### VoteInstruction::AuthorizeVoteSigner(Pubkey) + +* `account[0]` - RW - The VoteState + `VoteState::authorized_vote_signer` is set to to `Pubkey`, instruction must by + signed by Pubkey + + +### StakeState + +A StakeState takes one of two forms, StakeState::Delegate and StakeState::MiningPool. + +### StakeState::Delegate + +StakeState is the current delegation preference of the **staker**. StakeState +contains the following state information: + +* Account::lamports - The staked lamports. + +* `voter_pubkey` - The pubkey of the VoteState instance the lamports are +delegated to. + +* `credits_observed` - The total credits claimed over the lifetime of the +program. + +### StakeState::MiningPool + +There are two approaches to the mining pool. The bank could allow the +StakeState program to bypass the token balance check, or a program representing +the mining pool could run on the network. To avoid a single network wide lock, +the pool can be split into several mining pools. This design focuses on using a +StakeState::MiningPool as the cluster wide mining pools. + +* 256 StakeState::MiningPool are initialized, each with 1/256 number of mining pool +tokens stored as `Account::lamports`. + +The stakes and the MiningPool are accounts that are owned by the same `Stake` +program. + +### StakeInstruction::Initialize + +* `account[0]` - RW - The StakeState::Delegate instance. + `StakeState::Delegate::credits_observed` is initialized to `VoteState::credits`. + `StakeState::Delegate::voter_pubkey` is initialized to `account[1]` + +* `account[1]` - R - The VoteState instance. + +### StakeInstruction::RedeemVoteCredits + +The VoteState program and the StakeState programs maintain a lifetime counter +of total rewards generated and claimed. Therefore an explicit `Clear` +instruction is not necessary. When claiming rewards, the total lamports +deposited into the StakeState and as validator commission is proportional to +`VoteState::credits - StakeState::credits_observed`. + + +* `account[0]` - RW - The StakeState::MiningPool instance that will fulfill the +reward. +* `account[1]` - RW - The StakeState::Delegate instance that is redeeming votes +credits. +* `account[2]` - R - The VoteState instance, must be the same as +`StakeState::voter_pubkey` + +Reward is payed out for the difference between `VoteState::credits` to +`StakeState::Delgate.credits_observed`, and `credits_observed` is updated to +`VoteState::credits`. The commission is deposited into the `VoteState` token +balance, and the reward is deposited to the `StakeState::Delegate` token balance. The +reward and the commission is weighted by the `StakeState::lamports` divided by total lamports staked. + +The Staker or the owner of the Stake program sends a transaction with this +instruction to claim the reward. + +Any random MiningPool can be used to redeem the credits. + +```rust,ignore +let credits_to_claim = vote_state.credits - stake_state.credits_observed; +stake_state.credits_observed = vote_state.credits; +``` + +`credits_to_claim` is used to compute the reward and commission, and +`StakeState::Delegate::credits_observed` is updated to the latest +`VoteState::credits` value. + +### Collecting network fees into the MiningPool + +At the end of the block, before the bank is frozen, but after it processed all +the transactions for the block, a virtual instruction is executed to collect +the transaction fees. + +* A portion of the fees are deposited into the leader's account. +* A portion of the fees are deposited into the smallest StakeState::MiningPool +account. ### Benefits