ObolNetwork / ObolNetwork/charon
Gloas hardfork
Open
@KaloyanTanev is already working on this.
Since Apr 24, 2026.
protocol
- Dominant language
- Go
- Stars
- 222
- Forks
- 138
- Avg merge
- 2d 6h
- Merged PRs (30d)
- 35
Description
🎯 Problem to be solved
Prepare Charon for gloas hardfork
🛠️ Proposed solution
- Gloas groundwork
- Spec-driven per-fork slot timing (#4617)
- Migrate SSZ from fastssz to dynssz (#4652)
- Bump
go-eth2-clientto gloas types + transport (v0.29.0-obol.2-gloas) - Gloas in the fork schedule (#4659)
- PTC (payload attestation) duty
-
DutyPayloadAttestationduty type + PTC signing domain (#4618) - Core types:
PayloadAttestationData,SignedPayloadAttestationMessage(#4653) - DutyDB support (#4656)
- VC endpoints:
payload_attestation_data+ pool submission (#4657) - Adopt
go-eth2-clientpayload attestation interfaces (#4658) - Scheduler duty resolution (#4659)
- Fetcher: fetch data, handle 204 no-block-seen (#4667)
- Versioned payload attestation data + message types (#4663, #4668)
- Bcast: submit aggregated messages (#4668)
- Serve
duties/ptcfrom charon with pubshare mapping (#4669) - validatormock support + e2e simnet test (#4670)
-
- Fork readiness observability
- Readiness metrics for charon/BN/VC/EL (#4660)
- Populate per-fork minimum client versions once fork-ready releases exist
- Fork-aware proposer deadline, SSE thresholds, quarter-slot buckets (#4676)
- Retitle Grafana Charon Overview v3 "%% of Blocks Processed after 4s" panel to 3s after gloas activation
- Attestations
- Accept gloas-versioned attestations (#4671)
- Optional deprecated
committee_indexquery param (#4672) -
data.indexpayload-status bit: no handling needed, BN sets it and charon agrees on data opaquely; regression test (#4671)
- Block production (ePBS)
- Produce block v4 with
include_payload— nowPOST /eth/v4/validator/blocks/{slot}with a requiredBuilderConfigbody (beacon-APIs#630, client support in attestantio/go-eth2-client#323)- Proxy the
BuilderConfigbody: substitute threshold-aggregatedSignedBuilderRequestAuths for the VC's partial ones before forwarding to the BN (partial auths are useless to builders) - Watch beacon-APIs#627
produceBlockV4WithBid— explicitly motivated by multi-BN/DV setups, may become the preferred DV flow
- Proxy the
- Execution payload envelope publishing
- Proposer preferences signed duty — supersedes
prepare_beacon_proposer+register_validator(#4691)- Adopt
go-eth2-clientproposer-preferences interfaces (gated on attestantio/go-eth2-client#316) -
DutyProposerPreferencestype +DOMAIN_PROPOSER_PREFERENCES - Core
(Versioned)ProposerPreferences+ partial-signed type - Serve v2 proposer duties with the
E-2shufflingdependent_root -
SubmitProposerPreferencesintake (sync-message model, non-blocking2XX) - ParSigDB/ParSigEx/SigAgg + Bcast; key by
(validator, proposal_slot, dependent_root); gossip ahead of slot - Warn + metric on
fee_recipient/gas_limitmismatch vs lock - validatormock + simnet e2e
- Adopt
- Builder preferences signed duty —
SignedBuilderRequestAuthaggregation (builder-specs gloas/validator.md)- Mechanics: the proposer key signs
BuilderRequestAuth{data, slot}underDOMAIN_BUILDER_REQUEST_AUTH—datais out-of-band bytes per builder (default: UTF-8 of the builder's advertised URL, byte-exact),slotis the proposal slot. One signature per(builder, proposal_slot)authenticates bothsubmitBuilderPreferencesandgetExecutionPayloadBid.max_execution_paymentis NOT signed (rides beside the auth). No timestamp / dependent_root → partials aggregate iff all VCs carry byte-identical builderurl/auth_data(config alignment via #4692). Submitted the epoch before the proposal (state.proposer_lookahead). -
DutyBuilderPreferencestype +DOMAIN_BUILDER_REQUEST_AUTH - Core signed data type for
SignedBuilderRequestAuth; aggregation key(validator, proposal_slot, auth data) - VAPI intake:
POST /eth/v1/validator/builder_preferences(batchedBuilderPreferencesEntry; sync-message model, non-blocking2XX; pubshare→pubkey swap; deterministic clustermax_execution_paymentalongside the aggregated auth) - ParSigDB/ParSigEx/SigAgg + Bcast: forward aggregated entries to the BN ahead of the proposal (gated on
go-eth2-clientbuilder-preferences support) - Reuse the aggregated auths in the produce-block-v4
BuilderConfigproxy (see above) - validatormock + simnet e2e
- Mechanics: the proposer key signs
- Distribute cluster fee recipient / gas limit to VCs — charon-generated file, VC restart to apply; no keymanager API (#4692)
- Extend to builder config: byte-identical builder
url/auth_data(signed into the auth) +min_bid/builder_boost_factor/max_execution_paymentacross nodes (Prysm proposer-settings v2 extends the same file charon generates) (#4704)
- Extend to builder config: byte-identical builder
- Fork-gate legacy
--builder-apibehaviors at the gloas epoch — the flag's jobs all belong to the mev-boost architecture and dissolve post-gloas (participation becomes the granular--builder-*values; "enabled" ≈ non-empty builder URLs)- Scheduler: stop submitting validator registrations from the fork epoch (registrations are deprecated, superseded by the proposer preferences duty; nothing consumes them post-fork)
- Fetcher/router:
builder_boost_factor=MaxUint64override only applies toproduceBlockV3(v4 takes it from theBuilderConfigbody) - Infosync:
buildervsfullproposal-type negotiation is meaningless for v4 proposals (no blinded/full split) - Proposer config file: v1
builder.enabledis ignored by v2 consumers; keep emitting for pre-gloas VCs only - Deprecate the flag once pre-gloas support is dropped
- Produce block v4 with
- Testing
- e2e duty timing migration test, thirds to quarters (#4670)
- Devnet testing
🔗 References
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.