Skip to content

chore(client): adopt Gloas inner-slot duty triggers from Lighthouse #1114

Description

@shane-moore

Goal

Once Lighthouse exposes fork-aware inner-slot duty timing in validator services, bump the Lighthouse pin and align Anchor's aggregation pipeline to those timings end-to-end.

At Gloas, verify the full path uses:

  • attestation fallback: 25%
  • sync message: 25%
  • aggregate attestation: 50%
  • sync contribution: 50%

Avoid adding long-lived Anchor-side timing constants for values that should come from Lighthouse ChainSpec.

Blocked on sigp/lighthouse#8615.

Context / motivation

Anchor constructs Lighthouse validator services in anchor/client/src/lib.rs:736-767 and starts them at anchor/client/src/lib.rs:800-805. Those services own when the ValidatorStore trait methods are called.

At the current Anchor pin 1a6863118, Lighthouse validator-service triggers are still static:

Trigger Pin behavior Gloas spec
Unaggregated attestation fallback static get_unaggregated_attestation_due() at about 33.3% (validator_services/src/attestation_service.rs:176, :188, :312-323) 25%
Sync message static get_sync_message_due() at about 33.3% (validator_services/src/sync_committee_service.rs:109-115) 25%
Aggregate attestation static get_aggregate_attestation_due() at about 66.7% (validator_services/src/attestation_service.rs:376-380, :464) 50%
Sync contribution static get_contribution_message_due() at about 66.7% (validator_services/src/sync_committee_service.rs:155-159, :341) 50%

The pin has a fork-aware get_attestation_due<E>(slot) helper, but Lighthouse validator services do not use it for the attestation trigger. The pin also still lists AGGREGATE_DUE_BPS_GLOAS, SYNC_MESSAGE_DUE_BPS_GLOAS, and CONTRIBUTION_DUE_BPS_GLOAS under UPSTREAM_KEYS_NOT_IN_LIGHTHOUSE.

Anchor also has internal aggregation timers that must move when the Lighthouse triggers move:

  • anchor/validator_store/src/metadata_service.rs:318: phase-3 AggregationAssignments scheduling
  • anchor/validator_store/src/lib.rs:410: Boole+ aggregator-committee QBFT instance_start_time
  • anchor/validator_store/src/lib.rs:999: pre-Boole aggregate QBFT instance_start_time
  • anchor/validator_store/src/lib.rs:1150: pre-Boole sync-contribution QBFT instance_start_time
  • anchor/validator_store/src/lib.rs:2987: attestation selection-proof timeout window
  • anchor/validator_store/src/lib.rs:3097: sync selection-proof timeout window

Until the Lighthouse trigger change lands, flipping Anchor's aggregation QBFT start times to 50% is risky: Lighthouse still calls Anchor's aggregate/contribution signing hooks at about 66.7%, while Anchor's SlotTime QBFT deadlines are measured from instance_start_time.

Suggested approach

Track sigp/lighthouse#8615. When Lighthouse exposes fork-aware validator-service timing:

  1. Bump Anchor's Lighthouse pin.
  2. Replace Anchor's aggregation timing hardcodes with the Lighthouse fork-aware getters.
  3. Move AggregationAssignments phase-3 scheduling to the fork-aware aggregate/contribution deadline.
  4. Move aggregation QBFT instance_start_time to the same fork-aware aggregate/contribution deadline.
  5. Move attestation and sync selection-proof timeout windows to the same fork-aware deadlines.
  6. Verify the full path on the ePBS local testnet across the Gloas fork boundary.

If Gloas devnet timelines outpace the Lighthouse work, decide separately whether to carry a small Lighthouse patch or add a temporary Anchor-side shim.

Acceptance criteria

  • Lighthouse pin bumped to a revision where validator services use fork-aware Gloas inner-slot duty timing.
  • On an ePBS local testnet across the Gloas fork boundary, observed triggers are:
    • attestation fallback at 25%
    • sync message at 25%
    • aggregate attestation at 50%
    • sync contribution at 50%
  • Anchor phase-3 AggregationAssignments are available by the Gloas aggregate/contribution trigger.
  • Anchor aggregation QBFT instance_start_time matches the Lighthouse aggregate/contribution trigger timing.
  • Anchor selection-proof timeout windows use the same fork-aware aggregate/contribution timing.
  • No remaining Anchor-owned hardcodes duplicate timing values that Lighthouse now exposes.

Tests

  • Fork-boundary test for Anchor's selected aggregate/contribution deadline helpers or call sites.
  • Test that phase-3 scheduling uses the Gloas deadline for the first Gloas slot.
  • Test that aggregation QBFT instance_start_time uses the same fork-aware deadline.
  • Test that attestation and sync selection-proof timeout windows use aggregate/contribution due across the fork boundary.

Notes

Late pre-Gloas-fraction calls on a Gloas network are not expected to be invalid by themselves, but they reduce propagation and reward margin. The milestone should not claim end-to-end SIP-94 inner-slot timing until this issue lands.

Issues are directionally correct, not prescriptive; verify symbols at PR time.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    epbsePBS / EIP-7732 / Gloas implementation

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions