Skip to content

Require timeout certificates to leave all non-Fast rounds#6605

Draft
afck wants to merge 1 commit into
linera-io:mainfrom
afck:timeout-only-rounds
Draft

Require timeout certificates to leave all non-Fast rounds#6605
afck wants to merge 1 commit into
linera-io:mainfrom
afck:timeout-only-rounds

Conversation

@afck

@afck afck commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Motivation

Multi-leader rounds can be skipped by any valid proposal in a later round. Supporting that requires tracking the highest signed proposal (signed_proposal), a recovery path that advances the round on rejected proposals, and special round-comparison rules — logic that complicates the protocol.

Proposal

Now every non-Fast round ends only via a timeout certificate for that round (or a locking block from a higher round, which proves a quorum already reached it). Proposals must match the current round exactly. Fast proposals remain exempt: the existing vote and locking-block checks prevent them from conflicting with later-round blocks.

  • Add TimeoutConfig::multi_leader_round_duration (default 1 second): multi-leader rounds are meant to be cooperative, so contention should be rare, and a short round keeps retry latency low. Single-leader rounds keep base_timeout plus timeout_increment.
  • The fast round times out iff fast_round_duration is configured, regardless of whether there are regular owners. A chain with only super owners and no fast-round duration relies on them for progress.
  • Remove the signed_proposal register, its recovery path, and requested_signed_proposal from ChainManagerInfo; Worker::handle_block_proposal returns Result again since a rejected proposal can no longer produce notifications.
  • Expose the new duration as --multi-leader-round-ms in the CLI and multiLeaderRoundMs in GraphQL, and fix the base_timeout docs.

Test Plan

Tests were updated and extended.

Release Plan

  • Nothing to do / These changes follow the usual release cycle.

Links

Multi-leader rounds could previously be skipped by any valid proposal
in a later round. Supporting that required tracking the highest signed
proposal (`signed_proposal`), a recovery path that advanced the round
on rejected proposals, and special round-comparison rules — logic that
complicated the protocol.

Now every non-Fast round ends only via a timeout certificate for that
round (or a locking block from a higher round, which proves a quorum
already reached it). Proposals must match the current round exactly.
`Fast` proposals remain exempt: they can no longer advance the round,
and the existing vote and locking-block checks prevent them from
conflicting with later-round blocks.

- Add `TimeoutConfig::multi_leader_round_duration` (default 1 second):
  multi-leader rounds are meant to be cooperative, so contention should
  be rare, and a short round keeps retry latency low. Single-leader
  rounds keep `base_timeout` plus `timeout_increment`.
- The fast round times out iff `fast_round_duration` is configured,
  regardless of whether there are regular owners. A chain with only
  super owners and no fast-round duration relies on them for progress.
- Remove the `signed_proposal` register, its recovery path, and
  `requested_signed_proposal` from `ChainManagerInfo`;
  `Worker::handle_block_proposal` returns `Result` again since a
  rejected proposal can no longer produce notifications.
- Expose the new duration as `--multi-leader-round-ms` in the CLI and
  `multiLeaderRoundMs` in GraphQL, and fix the `base_timeout` docs.
- Add the new field to the EVM `LineraTypes.yaml` registry, the
  regenerated `LineraTypes.sol`, and the `Linera.sol` wrapper, so that
  EVM contracts can deserialize the `chain_ownership()` result.

This changes the serialization of `TimeoutConfig` and therefore chain
IDs and the network protocol; it is not compatible with existing
deployments.
@afck afck force-pushed the timeout-only-rounds branch from bd0cc82 to 172ff64 Compare July 13, 2026 14:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant