You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Proxy the BuilderConfig body: substitute threshold-aggregated SignedBuilderRequestAuths for the VC's partial ones before forwarding to the BN — deferred to the builder preferences duty (core: gloas builder preferences duty (SignedBuilderRequestAuth aggregation) #4724); charon currently emits min_bid/builder_boost_factor with no builder entries (self-build only)
Watch beacon-APIs#627produceBlockV4WithBid — explicitly motivated by multi-BN/DV setups, may become the preferred DV flow
(up for discussion / review — do we need it?) Forward the broadcast_validation query param (gossip default / consensus / consensus_and_equivocation) to the beacon node. Currently dropped for every duty, block proposals included: charon always broadcasts at the BN default (gossip). Cross-cutting — the requested level would have to be carried as duty metadata through parsig → sigagg → bcast, so scope it across block proposals and envelopes together (they share the consensus_and_equivocation anti-unbundling motivation)
Mechanics: the proposer key signs BuilderRequestAuth{data, slot} under DOMAIN_BUILDER_REQUEST_AUTH — data is out-of-band bytes per builder (default: UTF-8 of the builder's advertised URL, byte-exact), slot is the proposal slot. One signature per (builder, proposal_slot) authenticates both submitBuilderPreferences and getExecutionPayloadBid. max_execution_payment is NOT signed (rides beside the auth). No timestamp / dependent_root → partials aggregate iff all VCs carry byte-identical builder url/auth_data (config alignment via app: distribute cluster proposer config (fee recipient / gas limit) to validator clients #4692). Submitted the epoch before the proposal (state.proposer_lookahead).
DutyBuilderPreferences type + 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 (batched BuilderPreferencesEntry; sync-message model, non-blocking 2XX; pubshare→pubkey swap; deterministic cluster max_execution_payment alongside the aggregated auth)
ParSigDB/ParSigEx/SigAgg + Bcast: forward aggregated entries to the BN ahead of the proposal (gated on go-eth2-client builder-preferences support)
Reuse the aggregated auths in the produce-block-v4 BuilderConfig proxy (see above)
Extend to builder config: byte-identical builder url/auth_data (signed into the auth) + min_bid/builder_boost_factor/max_execution_payment across nodes (Prysm proposer-settings v2 extends the same file charon generates) (app: generate builder config for validator clients #4704)
Fork-gate legacy --builder-api behaviors 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=MaxUint64 override only applies to produceBlockV3 (v4 takes it from the BuilderConfig body)
Infosync: builder vs full proposal-type negotiation is meaningless for v4 proposals (no blinded/full split)
🎯 Problem to be solved
Prepare Charon for gloas hardfork
🛠️ Proposed solution
go-eth2-clientto gloas types + transport (v0.29.0-obol.2-gloas)DutyPayloadAttestationduty type + PTC signing domain (*: add PayloadAttestation duty #4618)PayloadAttestationData,SignedPayloadAttestationMessage(core: add payload attestation types for gloas #4653)payload_attestation_data+ pool submission (core/validatorapi: add payload attestation endpoints #4657)go-eth2-clientpayload attestation interfaces (core/validatorapi: adopt payload attestation interfaces #4658)duties/ptcfrom charon with pubshare mapping (core/validatorapi: serve ptc duties #4669)committee_indexquery param (core/validatorapi: optional committee index param #4672)data.indexpayload-status bit: no handling needed, BN sets it and charon agrees on data opaquely; regression test (core: accept gloas versioned attestations #4671)include_payload(self-build) —POST /eth/v4/validator/blocks/{slot}with aBuilderConfigbody (beacon-APIs#630). Stack in review: *: adopt go-eth2-client v0.29.0-obol.4-gloas #4715 client bump, core: gloas epbs proposal data types #4717 core types, core/fetcher: fetch gloas epbs proposals #4718 fetcher, core/validatorapi: serve and accept gloas epbs proposals #4719 validatorapi, testutil: vmock gloas epbs proposals and simnet e2e #4720 validatormock + simnet e2eBuilderConfigbody: substitute threshold-aggregatedSignedBuilderRequestAuths for the VC's partial ones before forwarding to the BN — deferred to the builder preferences duty (core: gloas builder preferences duty (SignedBuilderRequestAuth aggregation) #4724); charon currently emitsmin_bid/builder_boost_factorwith no builder entries (self-build only)produceBlockV4WithBid— explicitly motivated by multi-BN/DV setups, may become the preferred DV flowbroadcast_validationquery param (gossipdefault /consensus/consensus_and_equivocation) to the beacon node. Currently dropped for every duty, block proposals included: charon always broadcasts at the BN default (gossip). Cross-cutting — the requested level would have to be carried as duty metadata through parsig → sigagg → bcast, so scope it across block proposals and envelopes together (they share theconsensus_and_equivocationanti-unbundling motivation)prepare_beacon_proposer+register_validator(core: proposer preferences signed duty (gloas ePBS) #4691); implementation in review (core: add gloas proposer preferences duty #4693 + *: adopt go-eth2-client v0.29.0-obol.4-gloas #4715/testutil: vmock proposer preferences and simnet e2e #4716)go-eth2-clientproposer-preferences interfaces (*: adopt go-eth2-client v0.29.0-obol.4-gloas #4715)DutyProposerPreferencestype +DOMAIN_PROPOSER_PREFERENCES(core: add gloas proposer preferences duty #4693)(Versioned)ProposerPreferences+ partial-signed type (core: add gloas proposer preferences duty #4693)E-2shufflingdependent_root— client-native v2 duties + cache (*: adopt go-eth2-client v0.29.0-obol.4-gloas #4715); cache invalidation ondependent_rootchange tracked separately (app/eth2wrap: invalidate duties cache on dependent_root change #4710)SubmitProposerPreferencesintake (sync-message model, non-blocking2XX) (core: add gloas proposer preferences duty #4693)(validator, proposal_slot, dependent_root)(core: add gloas proposer preferences duty #4693)fee_recipient/gas_limitmismatch vs lock (core: add gloas proposer preferences duty #4693)SignedBuilderRequestAuthaggregation (builder-specs gloas/validator.md)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 app: distribute cluster proposer config (fee recipient / gas limit) to validator clients #4692). Submitted the epoch before the proposal (state.proposer_lookahead).DutyBuilderPreferencestype +DOMAIN_BUILDER_REQUEST_AUTHSignedBuilderRequestAuth; aggregation key(validator, proposal_slot, auth data)POST /eth/v1/validator/builder_preferences(batchedBuilderPreferencesEntry; sync-message model, non-blocking2XX; pubshare→pubkey swap; deterministic clustermax_execution_paymentalongside the aggregated auth)go-eth2-clientbuilder-preferences support)BuilderConfigproxy (see above)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) (app: generate builder config for validator clients #4704)--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)builder_boost_factor=MaxUint64override only applies toproduceBlockV3(v4 takes it from theBuilderConfigbody)buildervsfullproposal-type negotiation is meaningless for v4 proposals (no blinded/full split)builder.enabled; CDVN wrappers source it from theBUILDER_API_ENABLEDenv var🔗 References