Goal
Produce the sync-committee-message partial signature immediately when the committee vote decides, instead of waiting for Lighthouse's SyncCommitteeService timer. The shared per-committee partial-signature batch bundling stays as is.
Context / motivation
Spin-out of #1092, Phase 2 of the validation posted there: #1092 (comment).
- The per-committee partial-signature batch flushes only when full (
signature_collector), and its expected size counts attesting plus sync validators (voting_message_count_for_committee). On slots where any cluster validator is in the current sync committee, publish therefore waits for the sync partial signature.
- Lighthouse's
SyncCommitteeService is timer-only at 3999ms and not fork-aware at the current pin (SYNC_MESSAGE_DUE_BPS_GLOAS is explicitly unimplemented). Anchor cannot make Lighthouse call earlier; it can only produce the partial signature on its own initiative.
- Consequence: sync-overlap cluster-slots publish at >= 4s regardless of the start-gate fix, for the whole ~27h sync-committee period.
- go-ssv parity: its committee runner signs attestation and sync partial signatures immediately after the decide, so it has no sync-overlap bottleneck.
- The data is available at decide time: the sync message signs the decided vote's
block_root (the Lighthouse-supplied duty root is discarded today), and the slot-scoped voting context already tracks the sync validators.
Implementation approach
To settle at PR time; the natural hook is the tail of decide_committee_vote, where #1128 records the committee decision (VotingContext::remember_decided_vote).
Open design points:
- Kick plumbing: keep scheduling/gating in
validator_store/metadata service, not inside qbft_manager or signing paths (effects at the seam).
- Dedupe: the later timer-driven
sign_sync_committee_signatures call from Lighthouse must not double-produce partial signatures or error.
- Publish path: how the reconstructed signature reaches Lighthouse's publish flow (the timer call is also what publishes the final
SyncCommitteeMessage to the beacon node today).
- Ships with its own disable flag (killswitch per phase).
Acceptance criteria
- On sync-overlap slots with a decided committee vote, the sync partial signature is produced at decide time and the per-committee batch flushes without waiting for the Lighthouse timer.
- The later Lighthouse timer call neither double-produces nor errors, and the final sync message still reaches the beacon node.
- Attestation-only cluster-slots are unaffected.
- The feature can be disabled via its own flag.
Depends on #1128 (introduces the decision handoff this builds on and rewrites the same decide_committee_vote/VotingContext region). Distinct from #1114, which adopts Lighthouse's timer values but keeps the timer trigger. Related: #1092, #1113.
Goal
Produce the sync-committee-message partial signature immediately when the committee vote decides, instead of waiting for Lighthouse's
SyncCommitteeServicetimer. The shared per-committee partial-signature batch bundling stays as is.Context / motivation
Spin-out of #1092, Phase 2 of the validation posted there: #1092 (comment).
signature_collector), and its expected size counts attesting plus sync validators (voting_message_count_for_committee). On slots where any cluster validator is in the current sync committee, publish therefore waits for the sync partial signature.SyncCommitteeServiceis timer-only at 3999ms and not fork-aware at the current pin (SYNC_MESSAGE_DUE_BPS_GLOASis explicitly unimplemented). Anchor cannot make Lighthouse call earlier; it can only produce the partial signature on its own initiative.block_root(the Lighthouse-supplied duty root is discarded today), and the slot-scoped voting context already tracks the sync validators.Implementation approach
To settle at PR time; the natural hook is the tail of
decide_committee_vote, where #1128 records the committee decision (VotingContext::remember_decided_vote).Open design points:
validator_store/metadata service, not insideqbft_manageror signing paths (effects at the seam).sign_sync_committee_signaturescall from Lighthouse must not double-produce partial signatures or error.SyncCommitteeMessageto the beacon node today).Acceptance criteria
Depends on #1128 (introduces the decision handoff this builds on and rewrites the same
decide_committee_vote/VotingContextregion). Distinct from #1114, which adopts Lighthouse's timer values but keeps the timer trigger. Related: #1092, #1113.