Namada uses the automatically-compounding variant of F1 fee distribution.
Rewards are given to validators for voting on finalizing blocks: the fund for these rewards can come from minting (creating new tokens). The amount that is minted depends on how much is staked and our desired yearly inflation. When the total of the tokens staked is very low, the return rate per validator needs to increase, but as the total amount of stake rises, validators will receive less rewards. Once we have acquired the desired stake percentage, the amount minted will just be the desired yearly inflation.
The validator and the delegator must have agreed on a commission rate between themselves. Delegators pay out rewards to validators based on a mutually-determined commission rate that both parties must have agreed upon beforehand. The minted rewards are auto-bonded and only transferred when the funds are unbonded. Once we have calculated the total that needs to be minted at the end of the epoch, we split the minted tokens according to the stake the relevant validators and delegators contributed and distribute them to validators and their delegators. This is similar to what Cosmos does.
Consider a system with
- a canonical singular staking unit of account.
- a set of validators .
- a set of delegations , each to a particular validator and in a particular (initial) amount.
- epoched proof-of-stake, where changes are applied as follows:
- bonding after the pipeline length
- unbonding after the unbonding length
- rewards are paid out at the end of each epoch, to wit, in each epoch , is paid out to validator
- slashing is applied as described in slashing.
We wish to approximate as exactly as possible the following ideal delegator reward distribution system:
- At each epoch, for a validator , iterate over all of the delegations to that validator. Update each delegation , as follows. where and respectively denote the reward and stake of validator at epoch .
- Similarly, multiply the validator's voting power by the same factor , which should now equal the sum of their revised-amount delegations.
In this system, rewards are automatically rebonded to delegations, increasing the delegation amounts and validator voting powers accordingly.
However, we wish to implement this without actually needing to iterate over all delegations each block, since this is too computationally expensive. We can exploit this constant multiplicative factor which does not vary per delegation to perform this calculation lazily, storing only a constant amount of data per validator per epoch, and calculate revised amounts for each individual delegation only when a delegation changes.
We will demonstrate this for a delegation to a validator .Let denote the stake of at epoch .
For two epochs and with , define the function as
Denote as . The function has a useful property.
One may calculate the accumulated changes upto epoch as
If we know the delegation upto epoch , the delegation at epoch is obtained by the following formula,
Using property ,
Clearly, the quantity does not depend on the delegation . Thus, for a given validator, we need only store this product at each epoch , with which updated amounts for all delegations can be calculated.
Commission is implemented as a change to . Validators can charge any commission they wish (in ). The commission is paid directly to the account indicated by the validator.
Slashes should lead to punishment for delegators who were contributing voting power to the validator at the height of the infraction, as if the delegations were iterated over and slashed individually.
This can be implemented as a negative inflation rate for a particular block.
Instant redelegation is not supported. Redelegations must wait the unbonding period.
Each can be reference-counted by the number of delegations created during that epoch which might need to reference it. As soon as the number of delegations drops to zero, the entry can be deleted.