Supporting materials for the 2026 revival of EIP-7716 (anti-correlation attestation penalties): an exact-integer simulation of the originally drafted mechanism, the quantitative case for restructuring it, the calibration of the revised mechanism, and the figure-generation code for the accompanying write-up.
offline = balance in a slot's committees missing BOTH
timely source AND timely target # the "offline indicator"
committee_balance = total_active_balance // 32
factor = min(1 + PENALTY_SLOPE * max(0, offline − offline_balance_ema)
// committee_balance,
MAX_PENALTY_FACTOR) # cap 128, slope = 3·(cap−1) = 381
offline_balance_ema += (offline − offline_balance_ema) // 2**17 # ~12.6d half-life
The factor scales only the timely-target penalty of validators that produced no timely attestation at all. Uncorrelated failures pay exactly today's penalties; the factor is never below 1; the cap binds at exactly one third of stake — where the inactivity leak takes over — by the slope identity, at any baseline participation rate.
| Artifact | Link |
|---|---|
| EIP update PR (Stagnant → Draft, restructured mechanism) | ethereum/EIPs#11962 |
| Executable consensus-specs feature (built on Heze) | ethereum/consensus-specs#5452 |
| Analysis write-up (comment on the original thread) | ethresear.ch/t/…/19116 — source in ethresearch-comment.md |
| Hardfork tracking (PFI for Hegotá) | forkcast.org/upgrade/hegota |
| EIP discussion thread | ethereum-magicians.org/t/…/20137 |
Prior work this builds on: Vitalik's anti-correlation incentives analysis and concrete proposal, Toni's backtest, the 2024 explainer, FAQ, and the draft Lighthouse implementation.
Per 32 eth validator, July 2026 parameters (~40.7M eth staked, eth ≈ $1,840, ~0.3% baseline offline rate — though the normalisation makes the results baseline-independent), cohort offline 24h:
| Event | Today | Revised | Payback |
|---|---|---|---|
| uncorrelated failure | $6.17 | $6.17 (1.0x) | 1.2 d |
| 10% correlated | $6.17 | $69 (11.3x) | ~2 wk |
| 20% correlated | $6.17 | $133 (21.5x) | ~3.7 wk |
| 40% down 3 days (finality lost) | $819 | $1,469 (1.8x) | ~9.5 mo ≈ 2.5% of principal |
Under the originally drafted mechanism every one of these events costs within a few percent of $6.17, at any cap — the update rule has a fixed excess-penalty budget, Σ(factor−1) = PAF·Δmiss/32, independent of MAX_PENALTY_FACTOR and outage duration. That invariant is why the mechanism was restructured rather than retuned; see the write-up for the full argument.
The as-drafted mechanism (green) is indistinguishable from having no mechanism at all (grey, underneath it); the revision (blue) charges an amount operators will notice, front-loaded so that slow-recovering solo stakers aren't the ones who pay.
| File | What it is |
|---|---|
eip7716_model.py |
Network anchors (stake, rewards, penalties) and an exact-integer simulation of the originally drafted NET_EXCESS_PENALTIES mechanism |
gen_figures.py |
The final revised mechanism (slope 381 / cap 128 / 2¹⁷ EMA) plus the inactivity-leak model, and generation of all seven figures in figures/ |
ethresearch-comment.md |
Source of the analysis write-up (image paths are local; swap for Discourse uploads) |
figures/ |
The seven figures referenced by the write-up |
eip7716_variants.py |
Design evolution: cap/PAF sweeps proving the fixed-budget invariant, and an early slow-EMA-ratio design |
eip7716_frontloaded.py |
Design evolution: retuned-counter vs fast-EMA designs under heterogeneous recovery times, with the inactivity-leak model |
eip7716_aggressive.py |
Design evolution: EMA-relative excess-ratio calibration (superseded by the baseline-invariant absolute slope) |
eip7716_report.py |
Design evolution: early scenario tables |
The three design evolution scripts implement superseded parameterisations and are kept as the record of how the final design was reached (and why the alternatives — duration-punishing leaks, EMA-relative slopes, counter retuning, non-linear factors — were rejected). gen_figures.py is the source of truth for the proposed mechanism's behaviour.
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python gen_figures.py # regenerates figures/*.png
.venv/bin/python eip7716_model.py # original-mechanism scenario tablesNetwork parameters are embedded in eip7716_model.Network (defaults are the July 2026 snapshot); change them there to rerun the calibration under different assumptions of stake, price, or baseline offline rate.

