Repository navigation
Description
The validator client (crates/validator) should support Electra, Fulu and Gloas only, and stop carrying code for ForkName::Lean and the pre-Electra forks.
Why
The client already only works from Electra on. It submits SingleAttestations to /eth/v2/beacon/pool/attestations at every fork. It also refuses pre-Electra blocks (ProducedBlock::from_ssz) and aggregates ("electra is the earliest supported"). Every network we run against (mainnet, Sepolia, Hoodi, Platåberget) is past Electra.
The code still handles the earlier forks anyway, and Lean shows up only because ForkName is shared with the lean chain in ethlambda-types. Config::fork_at_epoch never returns Lean. Each of these branches guards a state that can't occur, but a reviewer still has to reason about it. The review of #789 spent several comments on this: whether the Lean arm's error is retryable, and whether committee 0 is right before Electra.
Line numbers below are as of 9be2506:
- Arms that exist only to fail.
Phase0 | Altair | Bellatrix | Capella | Deneb | Leanarms appear inbeacon_node/block_contents.rs:316andbeacon_node/http.rs:881. fix(validator): slashing-protection review follow-ups: attestation index check, exit on a poisoned record #789 addshighest_attestation_indexwith a pre-Electra arm and aLeanarm, which returns a retryableInconsistentResponseafter the request was already made. - Pre-Gloas attestation data is requested under the slot's own fork, as far back as Phase0.
a_pre_gloas_slot_is_asked_about_under_its_own_forkassertsForkName::Phase0.attestation_data_pathsendscommittee_index=0before Gloas, and every validator signs that same data. That would also be wrong before Electra, wheredata.indexmust be the attester's own committee. - The sync committee subscription gate checks
< ForkName::Altair(lib.rs:817). - Tests pinned to the Phase0/Altair boundary:
attestation.rs:769-818(theEth-Consensus-Versionheader test) and the boundary tests insigning.rs(around lines 461, 621 and 703).
Proposal
- Refuse to start before Electra. If the beacon node's schedule (from
/eth/v1/config/spec) puts the current epoch before Electra, stop at startup with one clear error. - Give the client its own fork type, e.g.
enum ValidatorFork { Electra, Fulu, Gloas }withTryFrom<ForkName>. Convert once, wherefork_at_epochis called, so everymatchin the client has three arms and noLeanor pre-Electra ones. A fork added after Gloas still breaks every match until someone decides what it means. - Remove the pre-Electra branches: the
< Altairsync gate, the pre-Electra andLeanarms in block and aggregate decoding and inhighest_attestation_index, and comments that describe pre-Electra semantics (e.g. the index as a committee). - Move the boundary tests from Phase0/Altair to the Electra/Fulu or Fulu/Gloas boundary, so they still check that headers and domains follow the right epoch.
Consider dropping Electra too
Every network the client targets is already past Fulu:
- mainnet: Fulu at epoch 411392, December 2025
- Sepolia: epoch 272640
- Hoodi: epoch 50688
- Platåberget and the kurtosis battery (
tooling/kurtosis-assertoor/network_params.yaml): Fulu from genesis
Supporting only Fulu and Gloas would remove the code that exists for Electra alone. That mainly means the per-blob-proof block contents (ProducedBlock::from_ssz's Electra arm and Contents::WithBlobProofs, which Fulu's cell proofs replaced) and whatever publishes them. It would also move the many tests that use Electra as their default fork over to Fulu. The startup check in step 1 would then refuse anything before Fulu, and the client's fork type would have two variants.
The cost is losing any network that is still on Electra, such as a local devnet configured with Electra at genesis and a later Fulu epoch. Worth deciding before step 2, since it changes the enum.
Out of scope
config_from_spec_responsekeeps parsing the whole fork schedule. Fork versions and epochs are configuration, not fork handling.- The
altair::sync committee containers stay. They are the containers in use today, not pre-Electra support.
Activity