Supporting decentralized staking through more anti-correlation incentives

Content note: preliminary research. Would love to see independent replication attempts.

Code: https://github.com/ethereum/research/tree/master/correlation_analysis

One tactic for incentivizing better decentralization in a protocol is to penalize correlations. That is, if one actor misbehaves (including accidentally), the penalty that they receive would be greater the more other actors (as measured by total ETH) misbehave at the same time as them. The theory is that if you are a single large actor, any mistakes that you make would be more likely to be replicated across all “identities” that you control, even if you split your coins up among many nominally-separate accounts.

This technique is already employed in Ethereum slashing (and arguably inactivity leak) mechanics. However, edge-case incentives that only arise in a highly exceptional attack situation that may never arise in practice are perhaps not sufficient for incentivizing decentralization.

This post proposes to extend a similar sort of anti-correlation incentive to more “mundane” failures, such as missing an attestation, that nearly all validators make at least occasionally. The theory is that larger stakers, including both wealthy individuals and staking pools, are going to run many validators on the same internet connection or even on the same physical computer, and this will cause disproportionate correlated failures. Such stakers could always make an independent physical setup for each node, but if they end up doing so, it would mean that we have completely eliminated economies of scale in staking.

Sanity check: are errors by different validators in the same “cluster” actually more likely to correlate with each other?

We can check this by combining two datasets: (i) attestation data from some recent epochs showing which validators were supposed to have attested, and which validators actually did attest, during each slot, and (ii) data mapping validator IDs to publicly-known clusters that contain many validators (eg. “Lido”, “Coinbase”, “Vitalik Buterin”). You can find a dump of the former here, here and here, and the latter here.

We then run a script that computes the total number of co-failures: instances of two validators within the same cluster being assigned to attest during the same slot, and failing in that slot.

We also compute expected co-failures: the number of co-failures that “should have happened” if failures were fully the result of random chance.

For example, suppose that there are ten validators with one cluster of size 4 and the others independent, and three validators fail: two within that cluster, and one outside it.



There is one co-failure here: the second and fourth validators within the first cluster. If all four validators in that clusters had failed, there would be six co-failures, one for each six possible pairs.

But how many co-failures “should there” have been? This is a tricky philosophical question. A few ways to answer:

  • For each failure, assume that the number of co-failures equals the failure rate across the other validators in that slot times the number of validators in that cluster, and halve it to compensate for double-counting. For the above example, this gives \frac{2}{3}.
  • Calculate the global failure rate, square it, and then multiply that by \frac{n * (n-1)}{2} for each cluster. This gives (\frac{3}{10})^2 * 6 = 0.54.
  • Randomly redistribute each validator’s failures among their entire history.

Each method is not perfect. The first two methods fail to take into account different clusters having different quality setups. Meanwhile, the last method fails to take into account correlations arising from different slots having different inherent difficulties: for example, slot 8103681 has a very large number of attestations that don’t get included within a single slot, possibly because the block was published unusually late.


See the “10216 ssfumbles” in this python output.


I ended up implementing three approaches: the first two approaches above, and a more sophisticated approach where I compare “actual co-failures” with “fake co-failures”: failures where each cluster member is replaced with a (pseudo-) random validator that has a similar failure rate.

I also explicitly separate out fumbles and misses. I define these terms as follows:

  • Fumble: when a validator misses an attestation during the current epoch, but attested correctly during the previous epoch
  • Miss: when a validator misses an attestation during the current epoch and also missed during the previous epoch

The goal is to separate the two very different phenomena of (i) network hiccups during normal operation, and (ii) going offline or having longer-term glitches.

I also simultaneously do this analysis for two datasets: max-deadline and single-slot-deadline. The first dataset treats a validator as having failed in an epoch only if an attestation was never included at all. The second dataset treats a validator as having failed if the attestation does not get included within a single slot.

Here are my results for the first two methods of computing expected co-failures. SSfumbles and SSmisses here refer to fumbles and misses using the single-slot dataset.

Fumbles Misses SSfumbles SSmisses
Expected (algo 1) 8602090 1695490 604902393 2637879
Expected (algo 2) 937232 4372279 26744848 4733344
Actual 15481500 7584178 678853421 8564344

For the first method, the Actual row is different, because a more restricted dataset is used for efficiency:

Fumbles Misses SSfumbles SSmisses
Fake clusters 8366846 6006136 556852940 5841712
Actual 14868318 6451930 624818332 6578668

The “expected” and “fake clusters” columns show how many co-failures within clusters there “should have been”, if clusters were uncorrelated, based on the techniques described above. The “actual” columns show how many co-failures there actually were. Uniformly, we see strong evidence of “excess correlated failures” within clusters: two validators in the same cluster are significantly more likely to miss attestations at the same time than two validators in different clusters.

How might we apply this to penalty rules?

I propose a simple strawman: in each slot, let p be the current number of missed slots divided by the average for the last 32 slots. That is, p[i] = \frac{misses[i]}{\sum_{j=i-32}^{i-1}\ misses[j]}. Cap it: p \leftarrow min(p, 4). Penalties for attestations of that slot should be proportional to p. That is, the penalty for not attesting at a slot should be proportional to how many validators fail in that slot compared to other recent slots.

This mechanism has a nice property that it’s not easily attackable: there isn’t a case where failing decreases your penalties, and manipulating the average enough to have an impact requires making a large number of failures yourself.

Now, let us try actually running it. Here are the total penalties for big clusters, medium clusters, small clusters and all validators (including non-clustered) for four penalty schemes:

  • basic: Penalize one point per miss (ie. similar to status quo)
  • basic_ss: the same but requiring single-slot inclusion to not count as a miss
  • excess: penalize p points with p calculated as above
  • excess_ss: penalize p points with p calculated as above, requiring single-slot inclusion to not count as a miss

Here is the output:

                   basic          basic_ss       excess         excess_ss    
big                0.69           2.06           2.73           7.96           
medium             0.61           3.00           2.42           11.54         
small              0.98           2.41           3.81           8.77           
all                0.90           2.44           3.54           9.30

With the “basic” schemes, big has a ~1.4x advantage over small (~1.2x in the single-slot dataset). With the “excess” schemes, this drops to ~1.3x (~1.1x in the single-slot dataset). With multiple other iterations of this, using slightly different datasets, the excess penalty scheme uniformly shrinks the advantage of “the big guy” over “the little guy”.

What’s going on?

The number of failures per slot is small: it’s usually in the low dozens. This is much smaller than pretty much any “large staker”. In fact, it’s smaller than the number of validators that a large staker would have active in a single slot (ie. 1/32 of their total stock). If a large staker runs many nodes on the same physical computer or internet connection, then any failures will plausibly affect all of their validators.

What this means is: when a large validator has an attestation inclusion failure, they single-handedly move the current slot’s failure rate, which then in turn increases their penalty. Small validators do not do this.

In principle, a big staker can get around this penalty scheme by putting each validator on a separate internet connection. But this sacrifices the economies-of-scale advantage that a big staker has in being able to reuse the same physical infrastructure.

Topics for further analysis

  • Find other strategies to confirm the size of this effect where validators in the same cluster are unusually likely to have attestation failures at the same time
  • Try to find the ideal (but still simple, so as to not overfit and not be exploitable) reward/penalty scheme to minimize the average big validator’s advantage over little validators.
  • Try to prove safety properties about this class of incentive schemes, ideally identify a “region of design space” within which risks of weird attacks (eg. strategically going offline at specific times to manipulate the average) are too expensive to be worth it
  • Cluster by geography. This could determine whether or not this mechanism also creates an incentive to geographically decentralize.
  • Cluster by (execution and beacon) client software. This could determine whether or not this mechanism also creates an incentive to use minority clients.

Mini-FAQ

Q: But wouldn’t this just lead to staking pools architecturally decentralizing their infra without politically decentralizing themselves, and isn’t the latter what we care about more at this point?

A: If they do, then that increases the cost of their operations, making solo staking relatively more competitive. The goal is not to single-handedly force solo staking, the goal is to make the economic part of the incentives more balanced. Political decentralization seems very hard or impossible to incentivize in-protocol; for that I think we will just have to count on social pressure, starknet-like airdrops, etc. But if economic incentives can be tweaked to favor architectural decentralization, that makes things easier for politically decentralized projects (which cannot avoid being architecturally decentralized) to get off the ground.

Q: Wouldn’t this hurt the “middle-size stakers” (wealthy individuals who are not big exchanges/pools) the most, and encourage them to move to pools?

A: In the table above, the “small” section refers to stakers with 10-300 validators, ie. 320-9600 ETH. That includes most wealthy people. And as we can see, those stakers suffer significantly higher penalties than pools today, and the simulation shows how the proposed adjusted reward scheme would equalize things between precisely those validators and the really big ones. Mathematically speaking, someone with 100 validator slots would only have 3 per slot, so they would not be greatly affecting the penalty factor for a round; only validators that go far above that would be.

Q: Post-MAXEB, won’t big stakers get around this by consolidating all their ETH into one validator?

A: The proportional penalty formula would count total amount of ETH, not number of validator IDs, so 4000 staked ETH that acts the same way would be treated the same if it’s split between 1 validator or 2 or 125.

Q: Won’t adding even more incentives to be online create further pressure to optimize and hence centralize, regardless of the details?

A:The parameters can be set so that on average, the size of the incentive to be online is the same as it is today.

37 Likes

I’m delighted to see your engagement with this issue, and I support the initiative to enhance Ethereum staking decentralization by introducing more anti-correlation incentives. The additional risks posed to Ethereum when multiple validators err simultaneously, especially if they’re part of the same cluster, like staking pools, are noteworthy. Reducing the advantage large stakers have over smaller ones contributes to our network’s decentralization. However, I have concerns:

  1. Will this “measure” be implemented at the base or application layer? (Concerning the complexity of implementing such a system)

2.Incentives may result in unforeseeable games and ensure that punishment mechanisms do not disproportionately affect smaller validators or validators that do not have the ability to diversify their infrastructure.
This tactic could lead to a situation where large stakers, by investing in multiple diverse setups, manage to dilute the impact of correlated penalties, thus maintaining their economies of scale advantage while appearing more decentralized. This approach could potentially undermine the intended effect of promoting genuine decentralization by incentivizing superficial compliance with the anti-correlation mechanisms rather than encouraging a broader distribution of validation power.

3.To avoid operational complexity and correlated failures while minimizing risk, validators should diversify their infrastructure geographically and across different software clients. Automating operational processes to limit human error, and implementing effective monitoring and alerting systems for rapid issue resolution, are also advisable. Engaging with other validators to share best practices and experiences can further aid in achieving these goals. This strategy seeks to maintain operational efficiency alongside network decentralization and resilience.

6 Likes

(Disclaimer: I am a home staker.)

Thanks again for engaging on this issue, it is appreciated. I think Ethereum’s correlation penalty is one of its best staking-decentralization incentivization mechanisms, and IMO it is under-utilized and could be doing so much more.

I’ve actually pointed this out in an earlier post that uses this mechanism to encourage adding proper protocol-legible metadata about validators. The details are in the post, but the tl;dr is to reduce the correlated failure penalty if the validators had voluntarily declared themselves as run by the same operator, and/or increase the correlated failure penalty if they had not.

More generally, I’d love a discussion on how the design space of the correlated-failure mechanism can be enhanced if validators had protocol-legible ownership metadata attached to them.


I’d also like to point out something about one of the assumptions from the OP, which I believe to be overly reductive:

While I am a home staker (not a large staking operator), I have experience running online services at scale and I can attest that the hardware cost of replicating identical physical setups is only a tiny part of the economies of scale that large service operators enjoy. The other large-but-scalable cost that stakers have are in the form of “devops” or maintenance work. This is work like:

  • Monitoring the node and validator daemons (alerts, dashboards).
  • Responding to incidents quickly and effectively.
  • Having redundancy built into the system.
  • Rotating keys (not necessarily validator keys; can also be OpenSSH keys to the servers themselves).
  • Hardening servers and protect against intrusion (especially relevant for validators as they have hot keys in them).
  • Handling software upgrades (of the Ethereum software or just the regular software on the server it runs on).
  • Moving accumulated ETH rewards for safekeeping, DeFi, or to new validators and spinning those up.
  • Running sidecar software like mev-boost and ensuring its uptime and redundancy (multiple relays etc.)
  • Implementing long-term fixes to reliability problems once they occur: disk-almost-full alerting, automated node pruning, automated fallbacks to secondary node software.
  • Continuous integration infrastructure and tests for all of the above to ensure new replicas of this entire setup can be spun up on demand.
  • Continuous deployment infrastructure to keep said infrastructure in sync with the intended configuration.

This complexity needs to be solved only once per staking operator, regardless of how many replicas of the physical setup exists. For a large operator, this is typically kept as a “configuration as code” setup (think Ansible/Kubernetes/Terraform configs) that define how to create and configure servers to have node software running and all the monitoring and security infrastructure around it, and paying humans to make themselves available around the clock should a problem happen. Once that is in place, from that point onwards, spinning up new physical replicas of this infrastructure becomes trivial. There is a large economy of scale realized in being able to reuse the same configuration-as-code setup to spin up the new replica.

Home stakers do not have the time or resources to invest into having setups of this level of reliability, so making multiple replicas (e.g. at a friend’s house) is a much more laborious process, and incident response is slower. Anecdotally, I personally only have email alerting if my validator starts missing attestations, and I usually only have time to look into it on the next weekend.

For this reason, I disagree with the assertion that “if [a large staking operator] ends up [making an independent physical setup], it would mean that we have completely eliminated economies of scale”. It helps, but it doesn’t completely eliminate them.

(This, by the way, is one reason why Verkle trees are an exciting development for home stakers: they reduce not just the hardware requirements, but more importantly the number of possible failure modes that Ethereum node clients can have, thereby reducing the relative effectiveness of the reliability work going into large-scale staking operation.)


I was also going to ask the question about how MaxEB changes things, but looks like the mini-FAQ you added covers that. :slight_smile:

12 Likes

Using historical data from times of network-wide instability could be an important test case for choosing the right parameters here.

I think the idea is interesting idea, but should be number-crunched for some important historical cases to understand how it impacts the staking in practice. The infra used for node operation is multi-layered:

  • physical machine
  • location (e.g. house or data center)
  • network connection
  • operating person
  • consensus client
  • execution client
  • signing software/hardware

And home stakers have a definite advantage in diversity (so, protection from correlation) only on operating person, physical machine, and, to a lesser extent, internet connection. Which is to say, if attestation misses are the result of client bug (happened before at scale) or country-wide internet problems (didn’t happen before at scale, I think), they are actually at disadvantage vs. professional operations who can afford 24/7 incident response, multi-client setups with fast switching etc. For stakers who use cloud infra the advantage is less pronounced (DC outage takes out everyone in the same DC).

I also think that the market’s answer to this might be more along the lines of improving liveness in bigger operations instead of decentralizing the stake more. The tech is already there, inter- and intra-operators DVT is working in production. A multi-client, multi-cloud dirk+vouch setup managed by a highly responsive team is expensive but very robust. I guess more incentive for DVT adoption is a good thing, though. Might also make on-prem/dedicated hardware setups less preferred to cloud ones.

Another rough edge could be geographical diversification. At the moment having nodes in Latam or Africa means you’re going to miss attestations regularly. With how forgiving the consequences of that are, it’s not a big deal but if in future it means you and everyone else in the region is put to “correlated, pls slash” bucket by protocol we might have a strong disincentive to geographical diversity.

And finally there’s a another source of correlated misses to keep in mind - when there’s problem with block proposing (e.g. because of a client bug, big outage or misconfiguration, mev-boost bug etc) there’s not enough place to put all the attestations and overall attestation rate drops. I think it’s mostly random, so it’s not likely your validator will miss two attestations in a row due to this. But this is another reason you can miss attestion where smaller and bigger operators are on equal terms.

TLDR risk is coming not just from stake concentration, but from any common infra, like clients used; and from just Ethereum network weather sometimes. And more even stake distribution helps with stake concentration vector of risk, but the rest of the risk stack I think actually favors robust DVT clusters or larger well managed high-availability cloud setups.

7 Likes

I think this is one of the best ideas I’ve seen in a while here and I’d love to work towards it. I think complexity concerns aren’t warranted since this would be a simple pure function executed at epoch transition that can be thoroughly tested on unit/spec tests.

I do worry about MaxEB for the opposite reason of what you mention though: if the correlated slots that trigger a steep penalty are substantially less than 32 (say failures for 4 consecutive slots are already enough) then large operators would be better off not coalescing their validators under Max EB to be protected from small network outages like for 4-5 slots. And this probably renders Max EB useless (so we should strictly restrict to misses instead of fumbles in your notation)

Another issue is builder/relay failure, we have essentially 3 builders responsible for all of our blocks and in the event that they fail then this would trigger heavy penalties on validators until the circuit breaker kicks in and we revert to local building.

I think we can mitigate some of these effects if we restrict ourselves to missing attestation penalties during times in which there weren’t missing blocks.

6 Likes

Very supportive of correlation penalties! I’ve previously advocated for starting the quadratic inactivity leak at a much higher percentage (e.g. 90), but I think a change like that comes under;

so I think a design around relative misses is more sensible. However I think we could explore a non-linear proportional penalty where you suggest:

I think @vshvsh 's comment is pretty astute, and suggests a decent amount of retrospective analysis and prospective modelling would help with setting effective parameters for such a penalty.

I also want to highlight that this could hopefully be an effective way to put the finger on the scales for client diversity. We have had numerous liveness failures from clients, (and thankfully no safety failures) and if we tweaked the correlation penalties such that a double-digit% liveness failure resulted in a month or more of lost rewards, that would have an impact on operator behaviour in my opinion.

One ‘parameter’ that is probably closely intertwined with this one is the ‘socialised penalty’ that the whole network faces when participation is <100%. I think this feature is important and worth protecting, to keep operators in a win/win mindset with respect to uptime rather than win/lose, but some adjustment such that those who are offline during the outage get hit harder than those who remain online through the outage is probably not a bad thing.

4 Likes

How easy is it to classify different validators? Is this a largely “solved” problem already?

1 Like

look here An introduction to the proof history of proving datasets.

Very easy and, for the proposal of slot-correlated penaties, it doesn’t matter (except for doing analysis).

Correlated penalties do not distinguish between entities but treat every validator the same. It just happens that there is a “natural” correlation between the individual validators that belong to one entity, based on running them on the same machine, the same network, the same clients etc.

1 Like

Awesome stuff and super excited to see some stronger language against correlation, especially the idea of using publicly known clusters (which is where this makes the sense). Some of my iniitial thoughts:

  1. I think the whole discussion around client diversity is enlightening in this regard. The inactivity leak penalty is massive for correlating failures but yet it’s not doing much to actually jump start client diversity. Whether we’re in this state or not is worth looking into (I’m guessing it’s a curve of adoption that once we’re past, they don’t mind)
  2. As others have pointed out, a CEX that owns 90% of the stake but that distributes it amongst various LST’s/DVT’s is still a piss poor validator set when it comes to decentralization.
  3. Addressing systemic risks – discouragement attacks against centralized validator sets - #2 by aelowsson. Wrote this post on a discouragement attack that seems relevant here. This would make this particular discouragement attack even more severe as a large proposer (who also has lots of aggregators) could just ignore attestations of parties they claim are correlated.

For a question, If we don’t like the public mapped correlation, why are we not just coming to consensus on it and just limiting rewards/penalizing for size?

Yesterday’s data could be pretty interesting to grind here. 13% of lost slots over an hour and impact of that on correlated attestations would be supper interesting.

5 Likes

I was wondering more about this part and the steps involved, not necessarily just the end results. Maybe it’s just so easy that there isn’t much explanation involved

1 Like

Wouldn’t anti-correlation incentives drive big players away from consolidating their validators? Consolidation means higher correlation penalty when missing attestations.

In maxEB, we reduce the slashing penalty to incentivize them to consolidate.

MaxEB is more expected to be used for consolidating the validators that you’re running from a single node already.

Also, MaxEB doesn’t come with any additional incentives to consolidate. The slashing penalty is reduced linearly without any advantages for consolidated parties - so, doesn’t count.

I see your point and it’s valid, however, one could argue that you shouldn’t run a large number of validators in one box that is high enough to trigger the anti-correlation penalty.

1 Like

There is no difference between correlation penalties depending on consolidation, in the sense that someone running 64 32-ETH validators on the same faulty node and someone running 1 2048-ETH validator on the same node gets the same penalty.

However, I was considering if it might be beneficial to apply higher correlated attestation penalties on smaller (e.g., 32-ETH) validators, relatively speaking, in order to incentivize consolidation. The idea would be that it would be particularly suitable for penalizing those that run lots of 32-ETH validators, under the assumption that single 32-ETH validators will be less likely to suffer correlated penalties anyway.

But while this would hit non-consolidated correlated big stakers the most (good), it would still have a negative effect on small stakers relative to consolidated big stakers, and so this is problematic. It would also make the analysis more messy. So it is just something to keep in mind, but not really something I would actively promote now.

1 Like

Reviving this thread two years on, with a model, a calibration, and a proposed restructuring of the mechanism it produced.

Earlier in this thread I commented that if a double-digit% liveness failure cost a month or more of lost rewards, it would have an impact on operator behaviour. Now that extra intelligence costs a hundred dollars a month on subscription, I’ve been able to spend the time to put together a model on the existing proposal, to ensure we are setting parameters that will appropriately influence change. Unfortunately it turns out that the EIP as written changed almost nothing for any outage of any size or duration, and the implicit fix (raising the cap, which was suggested at the time by Vasiliy and ValarDragon) turns out to be irrelevant due to an invariant in the update rule. This comment is 1) the case for why the mechanism needs restructuring rather than retuning, 2) a proposed replacement that keeps the per-slot structure but changes the reference variable, and 3) a calibration with simulated costs across outage scenarios to help build rough consensus in the community on how punitive a correlated downtime should be. It complements an update to EIP7716 as it seeks SFI for the Hegotá hardfork.

tl;dr: under the original 7716 mechanism, a validator caught in a 10%-of-stake, 24 hour correlated outage loses $6.17, identical to an uncorrelated failure, whether the cap is 4 or 256. Under the proposed revision it loses ~$69 (about two weeks of rewards), the penalty factor scales linearly with event size up to the finality threshold, and a multi-day finality-losing outage reaches 1-3% of principal in combination with the (unchanged) inactivity leak. Solo stakers failing on their own keep paying exactly what they pay today.

Prior work

I take the empirical motivation as settled and focus on the mechanism. Numbers below use July 2026 parameters (~40.7M eth staked, eth ≈ $1,840, base_reward ≈ 10,144 gwei/epoch per 32 eth, full CL+EL rewards ≈ $5.08/day per 32 eth validator) and a ~0.3% baseline offline rate (30-day network uptime is 99.72% at time of writing; the true both-flags-missing rate is somewhat lower still, and helpfully, under the proposed normalisation none of the numbers below depend on it). The simulations use exact spec integer arithmetic.

What the drafted mechanism actually charges

EIP-7716 as drafted computes, per slot:

penalty_factor = min(non_attesting_balance * PENALTY_ADJUSTMENT_FACTOR
                       // (NET_EXCESS_PENALTIES * total_active_balance + 1),
                     MAX_PENALTY_FACTOR)                        # 4096, cap 4
NET_EXCESS_PENALTIES = max(1, NET_EXCESS_PENALTIES + penalty_factor) - 1

NET_EXCESS_PENALTIES chases the current miss rate, so the factor returns to 1 under any sustained participation level. For a 10% outage this takes about two minutes (Fig. 1). The mechanism prices the first few slots of an event and nothing after, and even hands out a small factor-0 discount window once the outage ends.

The natural response is to raise the cap. It doesn’t work. Each slot adds penalty_factor − 1 to the counter, so across any step change in participation:

ÎŁ (factor − 1)  =  ΔNET_EXCESS_PENALTIES  =  PAF · Δmiss / 32

The total excess penalty is a fixed budget, independent of MAX_PENALTY_FACTOR and of outage duration. A larger cap just concentrates the same budget into fewer slots (Fig. 2).

Raising PENALTY_ADJUSTMENT_FACTOR does grow the budget, but the counter only decays at 1 per slot, so at constants large enough to matter (PAF ≈ 2^27 for percent-of-principal severity) the post-event recovery window stretches to roughly eight months, during which a second correlated event of any size lands at factor ~1. There are two further problems: at mainnet participation the counter’s equilibrium sits below 1, so it bounces off zero and ordinary uncorrelated misses draw random factors between 0 and the cap (bad luck for solo stakers, who this EIP is meant to favour), and the original revenue-neutrality goal is itself what pins the total at a rounding error. These are properties of the update rule, not the constants, which is why I think the mechanism needs restructuring rather than retuning.

What I think the penalty should look like

  1. Severity should scale with how much stake failed together, and the marginal cost of staying offline should decline quickly back towards the status quo. Rectification speed correlates with operator size: professional operators restore service in hours, a solo staker might need days to recover or replace a machine. A duration-punishing design transfers the burden to exactly the operators this EIP is meant to protect. (For the same reason I looked at, and rejected, extending the quadratic inactivity leak below the finality threshold: its marginal cost per hour grows with consecutive downtime, the exact opposite shape. A quadratic leak-style penalty gated at 5% offline could charge a 72 hour recovery north of $800 while barely touching the 1 hour one.)

  2. Penalties should stay reward-relative. Principal-level punishment already exists in the inactivity leak (≄1/3 offline) and slashing. Today the protocol prices correlation as a step function at 33%; the job for this EIP is bringing incentives into the 1-33% band that are measured as a function of the reward one might make staking for a year.

  3. The mechanism shouldn’t misfire on things that aren’t infrastructure failures: relay/builder outages, late epoch-boundary blocks, proposers splitting views, or operators correctly staying on a minority client through a majority-client bug.

  4. The reference inactivity should forget events on a fixed timescale, not one proportional to event size, so the deterrent is always armed.

The proposed revision to EIP 7716

One new Gwei state field and effectively two constants (the slope is derived):

offline           = balance in this slot's committees missing BOTH
                    timely source AND timely target
committee_balance = total_active_balance // 32
factor            = min(1 + PENALTY_SLOPE * max(0, offline − smoothed_offline_balance)
                          // committee_balance,
                        MAX_PENALTY_FACTOR)   # cap 128, slope = 3·(cap−1) = 381
smoothed_offline_balance += (offline − smoothed_offline_balance)
                          // OFFLINE_BALANCE_SMOOTHING_FACTOR   # 2**17, ~12.6d half-life

The factor multiplies only the timely-target penalty, and only for validators missing both source and target. Source penalties stay at 1x and head votes remain penalty-free. OFFLINE_BALANCE_SMOOTHING_FACTOR = 2**17 makes smoothed_offline_balance an exponential moving average (EMA) of the per-slot offline balance with a half-life of ~12.6 days (the same integer smoothing pattern as 4844’s excess blob gas, so nothing novel for client teams). At steady state the factor is exactly 1 for every slot.

There are two normalisation details worth highlighting. The excess is divided by per-slot active balance, not by the EMA: an EMA-relative slope would make every onset factor (and the point where the cap binds) proportional to the baseline offline rate, so at the 99.7% participation we actually observe, a curve calibrated against a 99.5% assumption steepens by two thirds and saturates near 19% rather than a third. Dividing by active balance makes the curve invariant to participation drift, and setting PENALTY_SLOPE = 3 × (MAX_PENALTY_FACTOR − 1) makes the cap bind at exactly one third of stake as an identity, leaving the cap as the single severity knob. (One might worry that committee selection isn’t stake-weighted post-7251, so realised per-slot committee balances wobble with the mix of 2048s and 32s — I checked, and it’s ~1.2% relative std today and ~2% even under heavy consolidation, and the divisor is the deterministic per-slot average anyway, so the noise only enters the numerator where the EMA absorbs it.)

Onset factors are then baseline-independent: ~5x at a 1% event, 20x at 5%, 39x at 10%, 77x at 20%, cap at one third — the factor discriminates by size across the whole band it is responsible for, and hands over to the leak exactly where the leak activates (Fig. 3).

The new scope restriction (“missing both source and target”) is doing most of the security work. A missing block does not prevent anyone attesting: the committee votes the previous head and keeps full credit, so relay and builder failures don’t register as attester faults at all. The one artifact they can cause (timely-source loss when 5+ consecutive slots are empty) is excluded, because scaling also requires a missed target, and target has the whole next epoch to be included. A validator that attested with a wrong target but a live, correct source (i.e a late boundary block, a split view, a correct minority client while a supermajority client forks off) was demonstrably online, so should pay only today’s unscaled penalty. Getting scaled requires producing no timely attestation at all, which a third party can’t induce in a healthy validator without sustained censorship of its aggregates across a full epoch of inclusion opportunities. In my eyes this closes the proposer view-splitting attack the original EIP left as TBD, and it answers the concern (raised by jshufro in Toni’s thread) that correlation penalties would punish operators for correctly staying on a canonical minority client.

What it costs

Per 32 eth validator. The cohort is offline for 24 hours unless stated; “payback” is the time to re-earn the loss at full rewards.

Event Rectified in Today Revised Payback
uncorrelated failure 24 h $6.17 $6.17 (1.0x) 1.2 d
1% correlated 24 h $6.17 $12 (2.0x) 2.5 d
5% correlated 24 h $6.17 $38 (6.1x) 7.4 d
10% correlated 6 h $1.54 $18 (11.5x) 3.5 d
10% correlated 24 h $6.17 $69 (11.3x) 2 wk
10% correlated 72 h $18.50 $82 (4.4x) 2.3 wk
20% correlated 24 h $6.17 $133 (21.5x) 3.7 wk
40%, leak active 24 h $95 $312 (3.3x) 2 mo
40% down 3 days (finality lost) 72 h $819 $1,469 (1.8x) 9.5 mo ≈ 2.5% of principal

Fig. 4 compares mechanisms as a function of individual rectification time (the drafted mechanism literally overlaps the status quo line). Note the shape: exposure is meaningful but flattens once the cohort recovers, so the 72 hour straggler pays about $12 more than the 24 hour rectifier. Fig. 5 shows the same property as marginal cost per hour. Fig. 6 shows the layering with the leak across event sizes. (The clean gap-down at hour 24 in these charts is a modelling simplification; real events mostly do recover near-in-unison — a patch ships, operators restart — but if you model an exponentially staggered recovery instead, the aggregate anomaly persists a little longer and a 48h straggler pays ~10-25% more than the cliff model suggests, i.e. the cliff is the optimistic case for stragglers. Fig. 1 shows both. Nothing qualitative changes.)

Here are some key bounds worth considering as we review this proposal. The worst-case penalty flow is ~0.38% of a 32 eth principal per day, and only while roughly a third of stake is newly offline and the validator itself is fully offline (for calibration: the leak takes ~50% in 18 days, slashing can take everything). A useful conversion at current rates is that X months of rewards ≈ X × 0.26% of principal, so even the harshest scenario in the table is nowhere near stake-level punishment. An uncorrelated validator coincidentally down for six hours during a 40% crisis pays ~$55, about eleven days of rewards — bounded, but a real cost of any statistical mechanism, since the protocol can’t observe cluster membership. Flapping outages cost less than the same downtime taken as isolated events, because the elevated EMA acts as a refractory period. And after a major crisis the reference decays on its fixed half-life (Fig. 7), where a counter-based design with an equivalent budget would report factor ~1 for the better part of a year.

My original gut-feel calibration was that a double-digit% liveness failure should cost “a month or more” to earn back. This proposal lands a 20%/24h event at ~3.7 weeks and a 10%/24h at ~2 weeks, which is about in range, without slamming into the cap at small event sizes (an earlier calibration I tried saturated at 5%, making a 10% event and a 30% event cost the same, which seems wrong). Also from that 2024 comment: the suggestion that those offline during an outage should be hit harder than those who stay online through it — that’s what this shape does, and the factor never drops below 1, so there are no discount windows subsidising missers during recovery.

Departures from the original EIP-7716 2024 design, stated plainly

  • Revenue neutrality is dropped. The original mechanism guaranteed unchanged average validator revenue at every participation level, and that guarantee is the direct cause of the fixed-budget behaviour above. Considering many in the community want staking to be less appealing, and for issuance to be lower, I infer this will be a positively received alteration.
  • One severity knob. With the slope pinned to 3×(cap−1), MAX_PENALTY_FACTOR is the only free severity parameter: cap 128 gives the table above; cap 64 (slope 189) halves the curve (10%/24h ≈ $37, about a week of rewards) with saturation still at one third. The ~12.6 day half-life separately sets how long the EMA remembers an event, which is both the decay of an ongoing event’s factor and the re-arm time.
  • Known residual issues: an entity could suppress the reference by sustaining elevated misses for a couple of weeks before a planned failure, at the cost of paying full penalties on that stake the whole time, visibly on-chain; the bystander exposure above; and the implementation cost, which is dominated by per-slot participation bookkeeping at epoch processing (a 32×3 balance array and a validator-to-slot mapping — the draft Lighthouse PR built this already). No block-path changes, one state field.

Open questions

  1. Calibration: is ~2 weeks of lost rewards the right price for a 10%/24h correlated failure? Would the cap-64 variant (~1 week) still change operator behaviour? I don’t have a rigorous model of operator elasticity here, just the GCP SLA comparison ValarDragon made in 2024 (a 7-8 hour monthly outage earns you a 10% bill rebate from Google; the revised mechanism charges a 10% cohort roughly 3.5 days of gross revenue for the same downtime, which at typical operator commissions is a far larger fraction of margin).

  2. Should the leak’s own cliff at 33% be smoothed with a graded ramp? Out of scope here but adjacent.

  3. Historical replay: I’d like to run the revised factor over past incidents (the May 2023 non-finality events in particular). The offline-signature scope needs per-flag participation history which public datasets don’t consistently carry — pointers to a good source very welcome.

To conclude: the case for anti-correlation penalties was made two years ago and hasn’t been rebutted; what was missing is a mechanism that charges an amount anyone would notice, without punishing the slow-recovery long tail or misfiring on relay outages and chain splits. I think the offline-pattern + EMA-reference design above addresses both concerns, and the constants are now a policy choice the community can argue about with the model in hand. The revised EIP text is up as a PR, the simulation and figure code I have published here, as well as a PR to the consensus-specs. Feedback is sought and appreciated on all of it, particularly from operators whose incident-response costs this is explicitly trying to shape, and core devs considering it for inclusion in Hegotá. Thanks for reading.

(Edited this post to change variable names in line with this feedback pass)

1 Like

Something that keeps nagging me reading the whole thread end to end: almost every mechanism here, correlated-slashing curves, client-diversity rewards, geographic spread, timing-based co-failure detection, works the same way underneath. It observes a proxy for correlation, and then prices that proxy. And each of the well-known failure modes we keep circling back to is really the proxy coming apart from the thing it was standing in for:

  • Bystander hits = a small independent operator gets caught by a co-failure signal it didn’t cause. The proxy fired without the underlying concentration.
  • Fake diversity = a large operator sybils into clusters that look independent (and yes, can even look like squad-staking) while sharing a cloud region, a client, a power grid. The underlying concentration is there but theproxy misses it. DVT tightens this but doesn’t fully close it, since a single entity can run many “distributed” clusters over shared infrastructure.
  • Discouragement attacks = someone games the proxy to push honest-but-correlated-by-accident validators off, harvesting the penalty asymmetry.

So the mechanism is in a permanent chase: every patch sharpens the proxy, and every attack finds the next gap between the proxy and the real concentration.

The part I can’t get past is why it stays a chase. On a purely stake-weighted base, concentration is the profit-maximizing move, economies of scale, MEV, operational overhead all reward getting bigger and more correlated. So these incentives are all pushing uphill against the base reward. You observe a proxy for concentration and tax it, on a substrate that is simultaneously paying concentration to exist.

Which makes me wonder if the framing could be inverted. Every design in this thread treats anti-correlation as a penalty bolted onto the weighting after the fact. Is there a version where anti-correlation is a property of the weighting itself? Concretely: a second weight dimension, co-necessary with stake for finality, that concentration cannot simply buy. If a share of decisive weight had to come from something capital can’t accumulate, then diversity wouldn’t be inferred from a proxy and then penalized, it would be structurally required to have weight at all, and “faking diversity” would mean faking the unbuyable thing, which is a much harder problem than spinning up independent-looking clusters.

I don’t have the clean version of this, which is why I’m asking rather than proposing. But it seems like the right question to sit with before adding another proxy: what would that second dimension have to be for it to (a)genuinely resist concentration and (b) not just become a new proxy to game? Curious whether anyone has chased this thread to its end.

This would be very hard to do in a permissionless network. We can’t do zkProofs of ID or KYC or something, the goal is for the network to be free to anyone to operate, so unless we compromise that view, I think we’re stuck with stochastic approaches to penalising correlation rather than something more targeted.

I don’t think the failure modes are all that bad too. 1) bystander hit; the network needs you, get online. 2) ‘fake diversity’ increases the costs for centralised operators which currently have unbelievably favourable economies of scale, 3) this one is worth being wary of, but I don’t believe there is a profitable DoS vector in this design. I’ll keep thinking about it.

On the DoS vector: the penalty pays out the damage of correlated failure, which also prices a bounty on causing it, and it cannot distinguish chosen correlation from imposed. An attacker who forces correlated failure on otherwise-independent validators through a shared fault line they did not pick, a common client, cloud, or relay, griefs them at superlinear return funded by your own curve. The anti-correlation incentive is also an anti-correlation attack surface, and its strength is the attacker’s budget.

I think it’s genuinely worth thinking about so don’t be discouraged just thought I’d push it forward.

Finding and exploiting an unknown correlation between independent validators super-linearly isn’t fun, but the superlinear penalty means the operators will fix the issue, and Ethereum becomes incrementally more anti-fragile as a result. A linear or sub-linear penalty would likely permit the fragility longer, potentially to the point that it’s exploited as a safety failure rather than a liveness failure.