Skip to content

[consensus/simplex] Document "notarize before finalize" requirement as intentional spec deviation #2692

@BrendanChou

Description

@BrendanChou

The Simplex implementation requires that a node has broadcast both its notarize vote AND the notarization certificate before it can broadcast a finalize vote.
From consensus/src/simplex/actors/voter/round.rs:

// If we haven't broadcast our notarize vote and notarization certificate, return None.if !self.broadcast_notarize || !self.broadcast_notarization {
    return None;
}

This is an intentional deviation from the Simplex specification which only requires:

"If have not broadcast nullify(v), broadcast finalize(c,v)"

The spec does not require sending notarize(c,v) or notarization(c,v) before finalize(c,v). Other implementations (Ava Labs, Shoup) also do not have this requirement.

Context
This was identified in #1102 (observations #7 and #9). The current behavior is likely intentional for good reasons (e.g., consistency, observability, or safety), but these reasons are not documented.

Proposed Action
Document in the module-level docs (consensus/src/simplex/mod.rs) under "Deviations from Simplex Consensus" that:

  1. This requirement exists
  2. Why it was added (rationale)
  3. Any implications for liveness or performance

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationresearchMore work required

Type

No type

Projects

Status

Ready for Review

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions