Summary
Role::Proposer has max_round = Some(6); go-ssv caps the proposer QBFT round at 2. Anchor therefore accepts consensus messages at rounds 3-6 for a proposer duty that go-ssv drops.
Current behavior
common/ssv_types/src/msgid.rs:76:
Role::Proposer | Role::SyncCommittee => Some(6),
go-ssv parity (epbs-gloas 90df7fa0)
message/validation/consensus_validation.go maxRound:
case spectypes.RoleProposer, spectypes.RoleEnvelopeBuilder:
return 2, nil
case ssvtypes.RoleSyncCommitteeContribution:
return 6, nil
So Proposer = 2, SyncCommitteeContribution = 6. A message with round > maxRound is ErrRoundTooHigh (IGNORE).
Why 2
A proposer QBFT that has not decided by round 2 has already missed its in-slot broadcast deadline (attestation deadline at 25% of the slot under Gloas), so the block is late regardless of whether QBFT decides later; rounds 3-6 produce nothing usable and only widen the accept surface. This is the same rationale SIP-94 §7 uses to pin the new RoleEnvelopeProposer (proposer-class) round cut-off at 2.
Fix
Split the arm: Role::Proposer => Some(2), keeping Role::SyncCommittee => Some(6) (matches go's SyncCommitteeContribution). Confirm anchor's Role::SyncCommittee is the QBFT contribution role before leaving it at 6. Add a test asserting round 3 is rejected for Role::Proposer.
Note: the forthcoming RoleEnvelopeProposer must also use 2 (SIP-94 §7, tracked in #1120); this issue is the separate pre-existing Proposer divergence.
Refs at anchor upstream/epbs 35191521, go-ssv epbs-gloas 90df7fa0.
Summary
Role::Proposerhasmax_round = Some(6); go-ssv caps the proposer QBFT round at 2. Anchor therefore accepts consensus messages at rounds 3-6 for a proposer duty that go-ssv drops.Current behavior
common/ssv_types/src/msgid.rs:76:go-ssv parity (
epbs-gloas90df7fa0)message/validation/consensus_validation.gomaxRound:So Proposer = 2, SyncCommitteeContribution = 6. A message with
round > maxRoundisErrRoundTooHigh(IGNORE).Why 2
A proposer QBFT that has not decided by round 2 has already missed its in-slot broadcast deadline (attestation deadline at 25% of the slot under Gloas), so the block is late regardless of whether QBFT decides later; rounds 3-6 produce nothing usable and only widen the accept surface. This is the same rationale SIP-94 §7 uses to pin the new
RoleEnvelopeProposer(proposer-class) round cut-off at 2.Fix
Split the arm:
Role::Proposer => Some(2), keepingRole::SyncCommittee => Some(6)(matches go'sSyncCommitteeContribution). Confirm anchor'sRole::SyncCommitteeis the QBFT contribution role before leaving it at 6. Add a test asserting round 3 is rejected forRole::Proposer.Note: the forthcoming
RoleEnvelopeProposermust also use 2 (SIP-94 §7, tracked in #1120); this issue is the separate pre-existing Proposer divergence.Refs at anchor
upstream/epbs35191521, go-ssvepbs-gloas90df7fa0.