Yeah you’re right, the net_excess_penalties
keeps track of the penalties from previous slots. If net_excess_penalties
is high, it indicates a history of many penalties, which lowers the current penalty factor. This creates a self-regulating mechanism:
- If non-participation is high, penalties increase, and
net_excess_penalties
accumulate. - If non-participation reduces,
net_excess_penalties
decreases over time, reducing the impact on future penalties.
This means that if a big node operator goes offline for 10 epochs, then the penalty factor would be the highest in the first epoch1 and then decreases gradually, approaching a penalty factor of 1, even if that operator stays offline.
This image (h/t dapplion) does a good job showing these dynamics:
When non_participating_balance
increases (=participation drops), both penalty_factor
and net_excess_penalties
rise. Once non_participating_balance
stabilizes or decreases, the penalty_factor
and net_excess_penalties
begin to decrease.
The floor in net_access_penalty
at 0.5 ensures that we don’t end up with a division by 0.