warmup && cooldown
delegate后的stake不会立即effective。它们必须先经过一段warmup期。在此期间,部分 stake 被视为"effective",其余部分被视为"activating"。变更发生在epoch边界。
stake program将变化率限制为total network stake,这反映在stake program中config::warmup_rate (在当前实施中设置为每个时期 25%)。
// means that no more than RATE of current effective stake may be added or subtracted per
// epoch
pub const DEFAULT_WARMUP_COOLDOWN_RATE: f64 = 0.25;
pub const NEW_WARMUP_COOLDOWN_RATE: f64 = 0.09;
pub fn warmup_cooldown_rate(current_epoch: Epoch, new_rate_activation_epoch: Option<Epoch>) -> f64 {
if current_epoch < new_rate_activation_epoch.unwrap_or(u64::MAX) {
DEFAULT_WARMUP_COOLDOWN_RATE
} else {
NEW_WARMUP_COOLDOWN_RATE
}
}
每个epoch可以warmup的stake量取决于前一个ecpo的total effective stake、total activating stake以及 stake program's configured warmup rate。
cooldown的工作原理相同。一旦stake 被 deactivated,其中的一部分将被视为"effective",同时也被视为"deactivating"。随着stake的cool down,它将继续获得rewards并受到slashing,但它也可以被withdrawal。
Bootstrap stakes不需warmup。
rewards 是根据该epoch 的"effective" portion of the stake 支付的。
warmup 示例
考虑在第 N 个epoch activate了 1,000 个单一stake的情况,网络warmup rate为 20%,并且在第 N 个epoch 的quiescent total network stake为 2,000。
在epoch N+1 时,可供网络激活的数量为 400 (2000 的 20% ),而在epoch N,此示例stake是唯一activated的stake,因此有权使用所有可用的warmup room。
| epoch | effective | activating | total effective | total activating |
|---|---|---|---|---|
| N-1 | 2,000 | 0 | ||
| N | 0 | 1,000 | 2,000 | 1,000 |
| N+1 | 400 | 600 | 2,400 | 600 |
| N+2 | 880 | 120 | 2,880 | 120 |
| N+3 | 1000 | 0 | 3,000 | 0 |
如果在epoch N 激活 2 个stake(X 和 Y ),则他们将按stake比例获得 20% 的一部分。在每个epoch,每个stake的 effective 和 activating 取决于前一个epoch的state。
| epoch | X eff | X act | Y eff | Y act | total effective | total activating |
|---|---|---|---|---|---|---|
| N-1 | 2,000 0 | |||||
| N | 0 | 1,000 | 0 | 200 | 2,00 | 1,200 |
| N+1 | 333 | 667 | 67 | 133 | 2,4 | 800 |
| N+2 | 733 | 267 | 146 | 54 | 2, | 321 |
| N+3 | 1000 | 0 | 200 | 0 | 3 | 0 |
提取 withdraw
任何时候都只能withdraw 超过 effective + activating stake 的 Lamport。
这意味着在warmup期间,实际上不能提取任何stake。
在cooldown期间,可以提取超过effective stake的任何token (activating == 0 )。
由于获得的rewards会自动添加到stake中,因此通常只有在deactivation后才可以withdraw。