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:
- Bump Anchor's Lighthouse pin.
- Replace Anchor's aggregation timing hardcodes with the Lighthouse fork-aware getters.
- Move
AggregationAssignments phase-3 scheduling to the fork-aware aggregate/contribution deadline.
- Move aggregation QBFT
instance_start_time to the same fork-aware aggregate/contribution deadline.
- Move attestation and sync selection-proof timeout windows to the same fork-aware deadlines.
- 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.
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:
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-767and starts them atanchor/client/src/lib.rs:800-805. Those services own when theValidatorStoretrait methods are called.At the current Anchor pin
1a6863118, Lighthouse validator-service triggers are still static:get_unaggregated_attestation_due()at about 33.3% (validator_services/src/attestation_service.rs:176,:188,:312-323)get_sync_message_due()at about 33.3% (validator_services/src/sync_committee_service.rs:109-115)get_aggregate_attestation_due()at about 66.7% (validator_services/src/attestation_service.rs:376-380,:464)get_contribution_message_due()at about 66.7% (validator_services/src/sync_committee_service.rs:155-159,:341)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 listsAGGREGATE_DUE_BPS_GLOAS,SYNC_MESSAGE_DUE_BPS_GLOAS, andCONTRIBUTION_DUE_BPS_GLOASunderUPSTREAM_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-3AggregationAssignmentsschedulinganchor/validator_store/src/lib.rs:410: Boole+ aggregator-committee QBFTinstance_start_timeanchor/validator_store/src/lib.rs:999: pre-Boole aggregate QBFTinstance_start_timeanchor/validator_store/src/lib.rs:1150: pre-Boole sync-contribution QBFTinstance_start_timeanchor/validator_store/src/lib.rs:2987: attestation selection-proof timeout windowanchor/validator_store/src/lib.rs:3097: sync selection-proof timeout windowUntil 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
SlotTimeQBFT deadlines are measured frominstance_start_time.Suggested approach
Track sigp/lighthouse#8615. When Lighthouse exposes fork-aware validator-service timing:
AggregationAssignmentsphase-3 scheduling to the fork-aware aggregate/contribution deadline.instance_start_timeto the same fork-aware aggregate/contribution deadline.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
AggregationAssignmentsare available by the Gloas aggregate/contribution trigger.instance_start_timematches the Lighthouse aggregate/contribution trigger timing.Tests
instance_start_timeuses the same fork-aware deadline.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.