undelete votestate etc (#4457)
This commit is contained in:
@ -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
|
stake. Unlike the current design, this program contains a new field to indicate
|
||||||
which VoteState program the stake is delegated to.
|
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
|
### Benefits
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user