Gloas (ePBS) testnet profiles for Anchor epbs testing - #33
Conversation
- Point ethereum-package imports at a fork pin (main @ d47e987 + one fix): Gloas genesis needs ethereum-genesis-generator >= 6.0.0, which no tagged release carries, and upstream's builder_count collides with preregistered_validator_count (builders derive from the same mnemonic starting at the participant validator sum, landing on the keyshare validators 64-73). Branch: shane-moore/ethereum-package@ssv-mini/builder-skip-preregistered. - params-gloas.yaml: nethermind+lighthouse glamsterdam-devnet-5 images, Gloas at genesis, 4-operator all-Anchor cluster, validators 64-73 registered on-chain. cstar_epoch deliberately omitted: scheduling CStar before sigp/anchor#1061 lands breaks attestations cluster-wide (sync path equivocates against the attestation path on the shared wire MessageId, gossipsub graylists the operators within ~4 epochs). - Flag-gated validator registration (register_validators, default false): restores Step 4 for standalone runs without touching the aetheria local_testnet flow. Registration fixes verified live: explicit gas limits (nethermind eth_estimateGas underestimates SSVNetwork delegatecall paths ~3x, inner OOG via the 63/64 rule) and msg.value on the payable v2.0.0 bulkRegisterValidator (reverts InsufficientBalance without it). - Conditional cstar entry in the Anchor fork-schedule template (cstar_epoch arg), for when #1061 lands. - Anchor nodes expose Prometheus metrics on port 5164 (duty timing, head-event trigger counters). - Makefile: ANCHOR_COMMIT parameter for prepare-anchor, run-gloas and run-gloas-builders targets. Regression: default params.yaml verified on the new pin (geth+lighthouse, contracts, static keys, 4 SSV nodes; monitor skipped, image currently unbuildable since ssvlabs/ethereum2-monitor is not accessible). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
params-gloas-builders.yaml adds builder_count: 2 (genesis ePBS builders with 0x03 credentials, kept in the separate Gloas BeaconState.builders registry) and mev_type buildoor. Exercises the payload half of ePBS: external builder bids via gossip, payload reveals, and chain-level PTC (payload_attestations from the lighthouse VC validators). Measured on this profile: ~40% of LH-proposed slots take the external bid; Anchor cluster proposers self-build 22/22 (no builder registration or proposer preferences yet) and their payloads are never revealed (SIP-94 envelope stub), so cluster slots are execution-empty. The gating Anchor work for complete ePBS proposals is the bid-targeting path, not envelope signing. Requires the forked ethereum-package pin from the previous commit (upstream builder placement collides with the preregistered keyshare validator range). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dedicated section covering both Gloas profiles end to end: the prepare-anchor + run-gloas flow, what each profile exercises, and the non-obvious edge cases a teammate hits (Kurtosis >=1.19 for the GpuConfig builtin, the forked ethereum-package pin and why it exists, the deliberate no-CStar omission per sigp/anchor#1061, prepare-anchor moving ../anchor's HEAD, all-Anchor cluster needing no node/ssv or monitor, builders living in BeaconState.builders, and cluster slots being execution-empty by SIP-94 design). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or #1090) sigp/anchor#1090 removes the SSV Fork::CStar variant and gates ePBS/Gloas behavior on the Ethereum fork (spec...gloas_enabled()) instead of an SSV-side fork ordinal, so there is no longer a cstar_epoch knob. - Remove the conditional cstar entry from the ssv_fork_schedule.yaml template and the HasCStar/CStarEpoch render data (utils.star). The emitted schedule is now Alan + Boole only, valid on pre- and post-#1090 anchor images alike (we never emitted a cstar entry regardless). - Rewrite the profile/README/CLAUDE narrative: Gloas activates purely from gloas_fork_epoch. The previous "omit cstar_epoch to dodge #1061" guidance no longer applies, because #1090 moves the attestation signing gate to gloas_enabled(), so gloas-at-genesis now drives GloasBeaconVote committee consensus from slot 0. With the sync signing path still unmigrated (sigp/anchor#1061, open), SSV cluster attestations now require an anchor image carrying the #1061 fix; proposals, external-builder bids, and chain-level PTC remain testable regardless. Supersedes the approach in sigp/anchor#1085 (fork reorder). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n-break mechanism Validated live on a #1090 (rip-cstar) image: proposals canonical (+0.13s), but attestations are never submitted. The attestation QBFT reaches COMMIT; the sync-committee BeaconVote instance round-changes forever, and the committee post-consensus partial-signature batch (sized to attestations + sync) never fills. Replaces the imprecise 'equivocation/graylist' framing. Adds a rip-cstar build note until #1090 merges into epbs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…g note CStar is removed by #1090, so drop the removal backstory from the build note and params headers (keep only the rip-cstar branch name and the one #1061 explanation). Mark attestation timing as needing the #1061 fix in the image. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
anchor #1090 (remove SSV Fork::CStar, gate ePBS on the Ethereum Gloas fork) has merged into epbs. Drop the "build from rip-cstar until #1090 lands" instruction and the #1090-removed-CStar backstory; state the model directly (ePBS gated on gloas_fork_epoch, no SSV-side fork knob) and reword the measurement notes to "epbs image without #1061". Keep the #1061 attestation caveat intact. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
iurii-ssv
left a comment
There was a problem hiding this comment.
Hey @shane-moore, I think most of this functionality has already been implemented in main branch, aside from:
params-gloas-builders.yaml— the buildoor external-builder profile: ePBS bids, payload reveals, chain-level PTC (payload_attestations). This is the one real net-new capability; nothing in main exercises the builder/payload/PTC side.- Anchor Prometheus metrics (
--metricson port 5164 innodes/anchor/node.star) — small, self-contained, useful regardless of Gloas.
Maybe you could rebase this PR as needed and we can merge it into main ?
|
Thanks @iurii-ssv, agreed on both. Metrics: split out into #46. The Builders profile: this one needs an upstream fix first. Closing this rather than rebasing, since the rest is superseded by #34, #35, #36, #37, #39, #40, #41. The sigp/anchor#1061, #1078 and #1082 caveats in the description are stale too, all three closed in June/July. |
What this adds
Two Gloas (EIP-7732 / ePBS) testnet profiles for ssv-mini, so Anchor's
epbsbranch can beexercised end to end on a local Glamsterdam-style chain with its own genesis and SSV contracts:
block proposal through the ePBS block structure, and attestation against the new 3s Gloas deadline.
A 4-operator all-Anchor cluster does real duties; no go-SSV nodes involved.
Built for Anchor devs: point it at your
epbswork and watch the cluster propose and attest on aGloas chain.
Quick start
ePBS is gated on the Ethereum Gloas fork (
gloas_fork_epoch); there is no SSV-side fork knob. Theepbsbranch already carries this model, so a plainANCHOR_COMMIT=epbsbuild is all you need.Requires Docker and a recent Kurtosis CLI (1.19.x; 1.15.x rejects a
GpuConfigbuiltin in thepinned ethereum-package). Full walkthrough and edge cases are in the new "Gloas (ePBS) testnet"
section of the README.
Testing your own Anchor changes
prepare-anchorbuildsnode/anchorfrom any branch/tag/commit on your../anchorclone'sorigin:ANCHOR_COMMIT=my-epbs-feature make prepare-anchor && make run-gloasOr build the image straight from your working tree and skip prepare entirely:
Either way the profile consumes whatever is tagged
node/anchor. There is no hot-swap for Anchornodes (unlike
restart-ssv-nodes), so the iteration loop is: rebuild the image, thenmake reset.The two profiles
params-gloas.yamlmake run-gloasparams-gloas-builders.yamlmake run-gloas-builderspayload_attestations).Reference behavior (tell a regression from a known gap)
Measured live on an
epbsimage without #1061, local devnet:canonical=true, "Successfully published block" on every operator).epbsimage without #1061: 0 cluster attestations published, even though the attestation QBFT reaches COMMIT consensus. The sync-committee half stalls and takes submission down with it (see the #1061 note below). With #1061 also in the image, attestations publish ~+4.09s vs the 3.0s Gloas deadline (QBFT itself ~15ms; the remaining gate is the committee partial-signature batch waiting on the sync-message flow, which fires on Lighthouse's static 4s sync timer; head-event pipeline healthy at ~+0.12s). That ~+4.09s is an Anchor/LH timing-wiring gap, not a cluster failure, and is identical on every operator.payload_present=falseon them and the EL does not advance that slot. Expected, not a bug.gloas_fork_epoch; there is no SSV-side fork knob. With Gloas active the committee runsGloasBeaconVotefor attestations, but the sync-committee signing path still runsBeaconVote(feat(validator_store): migrate sign_committee_sync_committee_signatures to GloasBeaconVote at CStar sigp/anchor#1061, open), so the two resolve to different QBFT instances instead of sharing one. Observed mechanism: the attestation instance reaches COMMIT, but the sync instance round-changes every slot and never completes, and because the committee's post-consensus partial-signature batch is sized to attestations + sync messages, it never fills, so the agreed attestation is never submitted (0 published, every operator). So attestation testing needs an anchor image carrying #1061; proposals, external-builder bids, and chain-level PTC work regardless. (Consensus succeeds; only submission is blocked.)Related Anchor issues: sigp/anchor#1061 (sync
GloasBeaconVotemigration; required for SSV attestations), sigp/anchor#1082 / #1078 (PTC duties).Mechanics worth knowing
ethereum-packagepin (shane-moore/ethereum-package, by commit), fetched automatically by Kurtosis. Needed because Gloas genesis requiresethereum-genesis-generator >= 6.0.0(no tagged release ships it) plus a one-line fix so genesis ePBS builders do not collide with the preregistered keyshare validators (indices 64-73).glamsterdam-devnet-5images (geth has no Glamsterdam build).eth_estimateGasunderestimates SSVNetwork delegatecall paths ~3x) andmsg.valueon the payable v2.0.0bulkRegisterValidator.register_validators(default false) gates on-chain registration so the default aetheria flow is untouched; the Gloas profiles set it true so operators get duties.ssv.count: 0): nonode/ssvimage needed, and monitor is disabled.Why draft
This is a testing tool for the in-flight
epbswork, not a finished feature. Opening as draft forvisibility and so Anchor devs can use it now; happy to adjust scope or take out of draft per review.