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.
weighted_timestamp from committed QCs. Used for wave abort, provision fallback, retention. Every honest node derives the same value.ViewChangeTimer). Each shard has its own height — not one global chain height.
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.
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. |
| Concern | Path |
|---|---|
| View change fires | crates/node/src/state/participation/timers.rs → on_view_change_timer → check_round_timeout |
| Timers armed at genesis | crates/shard/src/coordinator.rs — SetTimer ViewChange + Cleanup |
| Event-driven propose | queue_ready_proposal, try_propose; crates/node/src/state/participation/proposal.rs |
| Protocol constants | crates/types/src/time/timeouts.rs |
| Operator knobs | crates/shard/src/config.rs — ShardConsensusConfig |
| Wave / vote retry | crates/execution/src/waves.rs, coordinator.rs |
| Provision fallback / dwell | crates/provisions/src/expected.rs, queue.rs |
Pass threshold: 70%.