Skip to content

fix: Proposer max_round is 6, should be 2 (match go-ssv) #1119

Description

@shane-moore

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.

Metadata

Metadata

Assignees

Labels

epbsePBS / EIP-7732 / Gloas implementation

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions