Timers & Chain Time

After block fields deep dive: every timeout and timer in hyperscale-rs — what it does in plain English, which clock it uses, and how it differs from event-driven proposals. BFT story: Phase 2; execution windows: Phase 3.

⏱️ ~40–55 min read 📊 Reference 🎯 Hyperscale-rs

Two clocks (read the table with this)

Height vs round: Height = block page (advances on commit). Round = attempt at that height (advances on ViewChangeTimer). Each shard has its own height — not one global chain height.

Proposals are event-driven (not timer-driven)

There is no ProposalTimer. When mempool, QC, commit, provisions, or finalized waves change what a block could contain, queue_ready_proposal latches and try_propose runs. Liveness when the leader stalls is ViewChangeTimer → new round → new proposer — see Phase 2.

Master timer & timeout table

Shard-scoped unless noted process-scoped (one timer fans out to all shards on the node).

Name Category Clock Purpose (English)
ViewChangeTimer (TimerId::ViewChange) BFT liveness Wall (backoff from protocol constants) If the leader sits too long without progress at this height/round, bump the round so the next proposer can try the same height.
VIEW_CHANGE_TIMEOUT (+ increment, max) BFT liveness Protocol constant Base 3s per round, +1s per failed round at same height, cap 30s — every validator computes the same effective deadline.
MAX_PROGRESS_WAIT BFT safety/liveness Wall Cap how long view-change can be suppressed while a pending proposal blocks progress — stops a Byzantine leader stalling forever with a live header.
Proposal latch (queue_ready_proposal) Consensus packaging Event (not periodic) “New material worth a block” — mempool ready, new QC, commit, provisions, finalized waves — triggers try_propose.
CleanupTimer (TimerId::Cleanup) Housekeeping Wall (cleanup_interval, default 1s) Periodic sweeps: sync health, mempool tombstones, pending-block hints — hygiene, not block building.
transaction_fetch_timeout Sync / pending block Wall (operator, default 150ms) Pending block still missing txs → fetch from proposer or peer.
certificate_fetch_timeout Sync / pending block Wall (operator, default 500ms) Pending block still missing wave certs → fetch from proposer or peer.
FetchTick (TimerId::FetchTick) Fetch protocol Wall Process-scoped retry tick for outstanding fetch requests across shards.
WAVE_TIMEOUT (24s) Execution / cross-shard Chain (weighted_timestamp at wave start) Abort the whole wave if provisioning or execution cannot finish in time — deterministic on every node.
VOTE_RETRY_TIMEOUT (8s) Execution Chain Resend execution votes if gossip or wave leader is slow — liveness before WAVE_TIMEOUT abort.
PROVISION_FALLBACK_TIMEOUT (~5s chain) Cross-shard Chain Expected provision never arrived via gossip → emit fetch for missing Provisions.
Provision min_dwell_time Cross-shard Wall (operator, default 500ms) Hold verified provision batches out of the next proposal until peers had time to gossip-verify the same data.
Mempool min_dwell_time Mempool Wall (default 150ms) Delay admitting txs to the proposer-ready set so gossip can propagate duplicates first.
REMOTE_HEADER_RETENTION (30s chain) Cross-shard verify Chain Keep remote committed headers long enough that late provisions/ECs still find an anchor header.
RETENTION_HORIZON Retention Chain-derived Upper bound to drop provisions, ECs, mempool tombstones — tx is provably terminal everywhere after this.
BeaconCommitteeStart Beacon Wall (epoch boundary) Process-scoped: local vnode on next committee should start beacon work at epoch boundary if block not committed yet.
BeaconSkipTrigger / SKIP_TIMEOUT (45s) Beacon Wall Process-scoped: if expected beacon commit missing past expected block time, broadcast SkipRequest.
BeaconSpcView Beacon SPC Wall Process-scoped: SPC view timeout — drive inner PC even if leader has not surfaced input.
EPOCH_DURATION (5 min chain) Beacon Chain Epoch boundaries from committed beacon slot timestamps — committee rotation / witness window.

Wiring (where to read code)

ConcernPath
View change firescrates/node/src/state/participation/timers.rson_view_change_timercheck_round_timeout
Timers armed at genesiscrates/shard/src/coordinator.rsSetTimer ViewChange + Cleanup
Event-driven proposequeue_ready_proposal, try_propose; crates/node/src/state/participation/proposal.rs
Protocol constantscrates/types/src/time/timeouts.rs
Operator knobscrates/shard/src/config.rsShardConsensusConfig
Wave / vote retrycrates/execution/src/waves.rs, coordinator.rs
Provision fallback / dwellcrates/provisions/src/expected.rs, queue.rs

Quiz

Pass threshold: 70%.