fix(message_validator): accept messages up to one second before their slot - #1315
Conversation
… slot RANDAO and selection-proof partials are sent once on the sender's slot tick and never re-sent. A sender clock slightly ahead of the receiver's made peers ignore them as early, so the duty was lost; go-ssv missed a block this way (ssvlabs/ssv#3026). Apply the one-second early margin, previously limited to proposer preferences, to every role, matching ssvlabs/ssv#2901. Proposer preferences keep their existing bound and lateness is unchanged.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## epbs #1315 +/- ##
=======================================
Coverage ? 80.79%
=======================================
Files ? 179
Lines ? 41191
Branches ? 0
=======================================
Hits ? 33281
Misses ? 7910
Partials ? 0
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Review from Claude (Fable 5.1), head lgtm. Checked the five-line production change against the consumers and the go-ssv source: the bound matches One doc nit, not blocking: the |
|
re the doc nit, agreed sync committee hits this every slot before boole and qbft reads the same |
Problem, Evidence, and Context
stageormain), accepts every role up to 50 ms + 1 s early. Anchor applies that margin only to proposer preferences (fix(message_validator): align SIP-94 partial signature timing #1308). Between 50 ms and 1.05 s early, Anchor therefore drops messages that go-ssv ePBS nodes accept and forward.Change Overview
CLOCK_ERROR_TOLERANCE + EARLY_MESSAGE_MARGIN(1.05 s), measured from the role's earliest arrival. Proposer preferences keep their epoch-aligned reference point, so their bound does not change.Risks, Trade-offs, and Mitigations
SlotAlreadyAdvanced. This needs one validator to hold the same role in consecutive slots, plus a late or reordered slot-N message, and it affects only that signer. A test pins this behavior.Validation
EarlySlotMessagebefore the change and pass after:SlotAlreadyAdvanced. Another signer's slot-N packet, and the reverse order, are both accepted.make cargo-fmt-check,make lintandmake test(release, 993 passed) all pass.Rollback
Revert the commit. There is no config, storage, or wire-format impact.
Additional Info / Next Steps
🤖 Generated with Claude Code