Skip to content

feat: add GLOAS (Glamsterdam) signing support - #1192

Open
usmansaleem wants to merge 20 commits into
Consensys-Incorporated:masterfrom
usmansaleem:glamsterdam_changes
Open

feat: add GLOAS (Glamsterdam) signing support#1192
usmansaleem wants to merge 20 commits into
Consensys-Incorporated:masterfrom
usmansaleem:glamsterdam_changes

Conversation

@usmansaleem

@usmansaleem usmansaleem commented May 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds eth2 signing support for the upcoming Glamsterdam (ePBS / GLOAS) fork — five new signing types matching ethereum/remote-signing-api#28, plus CLI and schema support:

Type Domain Description
EXECUTION_PAYLOAD_BID BEACON_BUILDER (0x0B000000) Builder execution payload bid
EXECUTION_PAYLOAD_ENVELOPE BEACON_BUILDER (0x0B000000) Builder execution payload envelope
PAYLOAD_ATTESTATION_MESSAGE PTC_ATTESTER (0x0C000000) Payload attestation committee (PTC) message
PROPOSER_PREFERENCES PROPOSER_PREFERENCES (0x0D000000) Proposer preferences
BUILDER_REQUEST_AUTH BUILDER_REQUEST_AUTH (0x0B000001) Out-of-protocol builder-API auth

What's Included:

  • New Schema POJOs:
    • Under core/.../signing/eth2/schema/gloas/: ExecutionPayloadBid, ExecutionPayloadEnvelope, ExecutionPayloadGloas (extending ExecutionPayloadDeneb with block_access_list and slot_number), PayloadAttestationData, ProposerPreferences, and BuilderRequestAuth.
    • Under core/.../signing/eth2/schema/electra/: BuilderDepositRequest, BuilderExitRequest, and updated ExecutionRequests (EIP-8282).
  • Fork-Versioned Requests (VersionedRequest<T>):
    • Every Gloas payload uses the versioned envelope format {"version": "GLOAS", "data": {...}}, ensuring the signer resolves the SSZ schema from the declared milestone and validates that the milestone is scheduled on the configured network.
    • BLOCK_V2 and AGGREGATE_AND_PROOF_V2 also updated to accept version: GLOAS.
  • Serialization:
    • Added Jackson serializers/deserializers for UInt256 and KZGCommitment in SigningObjectMapperFactory and SigningMetadataModule.
  • CLI:
    • Added hidden experimental option --Xnetwork-gloas-fork-epoch to Eth2SubCommand for overriding the Gloas fork epoch.
  • OpenAPI:
  • Acceptance Tests:
    • Fixtures (Eth2RequestUtils, Eth2SigningRequestBodyBuilder) updated.
    • BlsSigningAcceptanceTest covers all five new signing types under SpecMilestone.GLOAS.
    • Eth2BlockSigningAcceptanceTest and Eth2AggregateAndProofSigningAcceptanceTest cover GLOAS BLOCK_V2 / AGGREGATE_AND_PROOF_V2.

Note: Slashing protection is intentionally omitted for the new types — per consensus spec and Teku's SlashingProtectedSigner, only blocks and attestations are slashable.

⚠️ Teku Dependency & Subject to Change

  • Temporarily points to Teku's develop snapshot in gradle/versions.gradle.
  • build.gradle is configured to treat Teku develop as a changing module and bypass the 24h cache so builds continuously resolve the latest develop build until a formal release is cut.
  • Once Teku cuts its next release, Teku will be pinned to that release version and the changing module configuration will be removed before taking this PR out of draft.

Test Plan

  • ./gradlew spotlessApply spotlessCheck checkLicense
  • ./gradlew :core:compileJava :acceptance-tests:compileTestJava
  • ./gradlew test (unit tests)
  • ./gradlew :acceptance-tests:acceptanceTest --tests "tech.pegasys.web3signer.tests.signing.*"
  • GitHub Actions CI passed (all matrix jobs and Docker builds)
  • Re-pin Teku to a fixed release once available
  • Cross-validate against a Teku build with external signing enabled

Note

Medium Risk
Changes core eth2 signing-root logic and wire formats for new fork types; builds depend on unpinned Teku develop schemas until re-pinned.

Overview
Adds initial Glamsterdam (GLOAS / ePBS) eth2 signing aligned with remote-signing-api#28: five new ArtifactType values (EXECUTION_PAYLOAD_BID, EXECUTION_PAYLOAD_ENVELOPE, PAYLOAD_ATTESTATION_MESSAGE, PROPOSER_PREFERENCES, BUILDER_REQUEST_AUTH) with JSON schemas, signing-root computation in Eth2SignForIdentifierHandler, and OpenAPI 2.1.0 docs/examples.

Gloas payloads use a new VersionedRequest envelope (version + data) so the signer picks SSZ from the declared milestone and rejects milestones not scheduled on the network. BLOCK_V2 and AGGREGATE_AND_PROOF_V2 also accept GLOAS. Electra ExecutionRequests is extended for EIP-8282 builder deposits/exits and refactored to asInternalExecutionRequests for Electra vs Gloas schemas.

Operators can override the fork via hidden --Xnetwork-gloas-fork-epoch (acceptance-test DSL wired the same way). Jackson support adds UInt256, KZGCommitment, and BLSPublicKey serializers. Build temporarily pins Teku develop with Gradle treating it as a changing module until the next Teku release.

Reviewed by Cursor Bugbot for commit 3fd20e0. Bugbot is set up for automated code reviews on this repo. Configure here.

Adds four new signing types for the upcoming Glamsterdam (ePBS) fork:
EXECUTION_PAYLOAD_BID, EXECUTION_PAYLOAD_ENVELOPE,
PAYLOAD_ATTESTATION_MESSAGE, and PROPOSER_PREFERENCES.

Bumps Teku to the develop snapshot as the GLOAS schemas (e.g.
ExecutionPayloadBid added execution_requests_root, ExecutionPayloadEnvelope
dropped slot/state_root, new ExecutionPayloadGloas) are still evolving
post-26.4.0. Should pin to a stable Teku version once the next release is cut.

Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
@sonarqubecloud

sonarqubecloud Bot commented May 6, 2026

Copy link
Copy Markdown

…he refresh

- Update BuilderRequestAuth and signing root resolution to match Teku's
  renamed classes and methods (BuilderRequestAuth, BUILDER_REQUEST_AUTH_SCHEMA,
  signingRootForSignBuilderRequestAuth).
- Update acceptance test data generator to use randomBuilderRequestAuth().
- Configure Gradle to treat Teku develop artifacts as changing modules and
  bypass changing module cache so builds always pick up latest Teku develop
  until the next release is pinned.
- Prefer 'Gloas' over 'Glamsterdam (ePBS)' in Gloas schema descriptions,
  drop spec-history notes and EIP references, and mention proposer
  self-builds for ExecutionPayloadEnvelopeGloas, per nflaig's review.
- Recompute the AGGREGATE_AND_PROOF_V2 (GLOAS) example signingRoot; the
  previous value was copied from the Fulu/Electra example and is not
  accurate given Gloas's progressive container SSZ encoding.

Mirrors ethereum/remote-signing-api@b5b8f82.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants