Skip to content

cl, execution: implement EIP-8282 (Builder Execution) for Gloas — builder_deposits & builder_exits in ExecutionRequests #22008

Description

@yperbasis

Summary

Implement EIP-8282 (Builder Execution) for the Gloas/Glamsterdam fork. The current consensus spec extends the ExecutionRequests container from 3 to 5 request lists, adding builder_deposits and builder_exits. Caplin currently implements the pre-EIP-8282 (devnet-4 / v1.7.0-alpha.8) layout with 3 lists, so erigon is incompatible with devnet-6+ tooling.

Background — why now

The Kurtosis GLOAS Tests CI is flaky/timing out because ethpandaops/assertoor:master moved onto the glamsterdam-devnet-6 branch (EIP-8282, 2026-06-18) and now expects a 5-list ExecutionRequests, while erigon (and the pinned lighthouse:glamsterdam-devnet-4/5 images) still produce 3 lists. assertoor can no longer decode erigon's gloas blocks:

  • SSZ (lighthouse-mirrored erigon blocks): Message.Body.ParentExecutionRequests: unexpected end of SSZ: not enough data for fixed fields (have 12, needed 20) — 3 offsets present, 5 expected.
  • JSON (caplin): failed to unmarshal data … builder_deposits: missing.

Because only pre-gloas (epoch-0/Fulu) proposals are decodable, the block-proposal-check matrix hangs whenever a client pair misses an epoch-0 proposer slot, and the job times out. Example failing run: https://github.com/erigontech/erigon/actions/runs/28103161617/job/83210197969 (PR #21987, on release/3.5).

A short-term CI stopgap pins assertoor to a pre-EIP-8282 image; this issue tracks the real implementation so the clients can move to devnet-6 and assertoor:master can be restored.

Spec changes (consensus-specs specs/gloas/beacon-chain.md)

ExecutionRequests becomes 5 fields:

class ExecutionRequests(Container):
    deposits        # unchanged (Electra)
    withdrawals     # unchanged
    consolidations  # unchanged
    builder_deposits: List[BuilderDepositRequest, MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD]  # [New in Gloas:EIP8282]
    builder_exits:    List[BuilderExitRequest,    MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD]      # [New in Gloas:EIP8282]

New containers:

class BuilderDepositRequest(Container):
    pubkey: BLSPubkey
    withdrawal_credentials: Bytes32
    amount: Gwei
    signature: BLSSignature

class BuilderExitRequest(Container):
    source_address: ExecutionAddress
    pubkey: BLSPubkey

New constants: BUILDER_DEPOSIT_REQUEST_TYPE = 0x03, BUILDER_EXIT_REQUEST_TYPE = 0x04, MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD = 256, MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD = 16. New handlers process_builder_deposit_request, process_builder_exit_request, is_valid_builder_deposit_signature, wired into process_operations via for_ops(...).

Current erigon state

  • cl/cltypes/execution_requests.go — ExecutionRequests has 3 lists; SSZ encode/decode/size, HashTreeRoot, and JSON all assume 3.
  • cl/cltypes/beacon_block.go — the gloas body's ParentExecutionRequests *ExecutionRequests reuses the 3-list type.
  • cl/phase1/core/state/epbs.go — builder onboarding is modeled as a regular deposit with a 0x03 withdrawal credential routed via ApplyDepositForBuilder (the pre-EIP-8282 design); there is no builder_exits path. Note the 0x03 collision: today it's a withdrawal-credential prefix; under EIP-8282 0x03 is also the builder-deposit request-type byte for a distinct request list.
  • Targets consensus-specs v1.7.0-alpha.8 / devnet-4 (cl: implement consensus-specs v1.7.0-alpha.8 for Gloas devnet-4 #21308; devnet-5 fixes in cl, execution: glamsterdam devnet-5 fixes #21655).

Tasks

  • CL types: add BuilderDepositRequest / BuilderExitRequest; extend ExecutionRequests to 5 lists (SSZ encode/decode/size, HTR, JSON, Clone).
  • EL: emit/parse the new 0x03/0x04 execution-request types (EIP-7685 framing; engine getPayload/newPayload execution_requests) under execution/engineapi.
  • State transition: process_builder_deposit_request, process_builder_exit_request, is_valid_builder_deposit_signature; wire into operation processing and reconcile with the existing 0x03-credential builder routing.
  • Config: add the two MAX_BUILDER_*_REQUESTS_PER_PAYLOAD and the request-type constants.
  • Spec tests: enable the gloas EIP-8282 vectors.
  • CI: bump lighthouse/prysm images to glamsterdam-devnet-6 in .github/workflows/kurtosis/gloas-*.io and restore assertoor_params.image: ethpandaops/assertoor:master.

References

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

CaplinCaplin: Consensus Layer, Beacon APIGlamsterdamhttps://eips.ethereum.org/EIPS/eip-7773

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions