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_penaltiesaccumulate. - If non-participation reduces,
net_excess_penaltiesdecreases 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.
