Pre-mainnet research network No public testnet yet Protocol manifest r28 Shielded transfers experimental Current status
Implemented

Consensus and finality

Resilience uses a lock-based BFT protocol in the Tendermint family with stake-weighted, secret leader election. A block is final once validators holding more than two thirds of voting power precommit it. Safety holds while less than one third of voting power is Byzantine and signing records are never rolled back.

§1Model and assumptions#

AssumptionIf it breaks
Less than one third of voting power is ByzantineConflicting blocks could finalize
One validator set per height; keys are authenticatedCertificates become ambiguous
Signing storage is durable, unshared, and never rolled backA validator can equivocate after a restart
Messages are eventually delivered and an honest proposer eventually winsProgress stalls; safety is unaffected
Validator clocks are NTP-disciplinedSlot timing drifts. Skew is detected and alerted, not corrected

The slot scheduler runs at a fixed interval; it is not an adaptive partial-synchrony pacemaker. Liveness under partitions and high latency is therefore measured rather than assumed. See load qualification.

§2Parameters#

Development defaults from configs/config.toml
ParameterValueAt the 2 s target
Slot duration2 s
Slots per epoch192384 s
Rounds per slot, maximum3
Active validators, maximum128
Minimum validator stake10,000 RSC
Unbonding period14 epochs (2,688 slots)about 89.6 min
Downtime participation window300 committed blocksabout 10 min
Double-sign slash5% (500 basis points)
Downtime slash0.1% (10 basis points)
Forced evidence-inclusion deadline32 slotsabout 64 s
Evidence lifetime2,688 slotsabout 89.6 min
Evidence per block / pending queue128 / 512

The Kubernetes template uses 1 s slots with 64-slot epochs, and the test harness 1 s with 32. These are different consensus profiles. A network qualifies one exact profile, and none of these values may change on an initialized database.

§3Views, locks and certificates#

At a fixed height, views are ordered by (slot, round). A validator precommits a block only after fully validating it and seeing more than two thirds of active voting power prevote that exact block in the current view. It writes the lock and the certificate to disk before releasing the precommit signature. A failed write or a corrupt record stops voting rather than clearing the lock.

A validator locked at view (5,1) accepts a conflicting block only with a prevote certificate newer than its lock. slot 5slot 6 (5,0)(5,1)(5,2) (6,0)(6,1)(6,2) lock on block A Accept B at (6,1): its certificate from (6,0) is newer than the lock Refuse B at (6,2): its certificate from (5,0) is older than the lock. Prevote A or nil.
Figure 2. Proof of lock change. Timeouts and nil votes never clear a lock; only an authenticated prevote certificate strictly newer than the lock and older than the proposal does.
  • A locked validator prevotes its locked block, or a conflicting block only if it carries such a certificate.
  • A locked proposer re-proposes the original block unchanged: same hash, author signature, timestamp and state commitments. It signs a fresh envelope for the new view.
  • Finality signatures carry their slot and round. Verifiers reject mixed views, views earlier than the block's proposal, duplicate signers, and insufficient power. Quorum counts voting power, not signatures.
  • Sync import accepts a block finalized in a later view than the one it was created in.

§4Secret leader election#

Each validator privately evaluates the RFC 9381 ECVRF with its own key over the view input

alpha = head.Randomness ‖ slot (8 bytes, big-endian) ‖ round (4 bytes, big-endian)

It may propose only if BE64(output[:8]) mod totalVotingPower falls inside its own stake window. The winner publishes the 80-byte proof and 32-byte output in the block header, so one evaluation is both the lottery ticket and the next randomness beacon.

Total voting power divided into one window per validator. A validator proposes only when its own output lands in its own window. Total voting power, example of four validators V1 window, 40% V2 window, 25% V3, 20% V4, 15% V2's output V3's output V2's output is in V2's window: V2 may propose. V3's output lands outside V3's window: V3 does not propose. Nobody can compute another validator's output without its secret key.
Figure 3. Stake-weighted sortition with one expected winner per round. Window sizes are illustrative.
  • Secret. Outcomes depend on secret keys, so no observer can derive the schedule from the public head. This removes advance targeting of the next proposer by denial of service or bribery.
  • Probabilistic. A round may have no winner, and every validator times out and advances. It may have several, and the first valid proposal wins while the BFT rounds absorb the race. Empty rounds depend on secret keys, so they leak no lookahead.
  • Re-proposals carry a leader claim (winner, proof, output) that is bound into the envelope signature.
  • Suite. ECVRF-EDWARDS25519-SHA512-TAI. Try-and-increment is safe here because the VRF input is public, so its input-dependent running time leaks nothing.
Known limit

A winner sees its output before publishing and can withhold its block, which turns a fair coin into a 3/4 coin. That is why contracts cannot read the beacon. A threshold beacon is proposed.

§5Signing domains#

MessageConstruction
Block header, by its authorEd25519 over ASCII RESILIENCE_BLOCK_HEADER_V1 followed by the 32-byte header hash; 58 bytes, no terminator or length prefix
Prevote and precommitKeccak-256 of RESILIENCE_CONSENSUS_VOTE_V2 ‖ type ‖ slot ‖ height ‖ round ‖ block hash
Proposal envelope32-byte digest of the genesis-bound view, block hash, certificate and leader claim
VRF proofThe RFC 9381 construction, separate from all of the above

The signer interface exposes only header and vote signing, each over a 32-byte input, with no general message-signing method. Local, encrypted-keystore and remote signers produce identical signatures, and the remote signer enforces its own watermarks. The remote-signer custody path has an open internal finding; see Assurance.

§6Evidence and slashing#

Correct builders include every provable, unexpired pending evidence item, oldest offense first, up to 128 per block, and blocks must carry evidence in that canonical order. Validators enforce timely inclusion by withholding votes from fresh proposals that omit evidence they have held for more than 32 slots.

Omission is punished at vote time instead of at validity: validators withhold their votes from a fresh proposal that omits evidence they have held past the deadline. Censorship therefore fails whenever more than one third of voting power holds the evidence, because the censoring block cannot reach quorum.

Omission is deliberately not a validity rule, because honest nodes can hold different pending sets and rejecting their blocks would fork them. Locked re-proposals are exempt, since their body cannot change. If a node cannot evaluate the rule, it votes normally: withholding is a preference, never a safety mechanism.

§7Epochs and the validator set#

The validator set changes only at epoch boundaries, so a successful stake action does not mean immediate participation. Rewards depend on participation and on time-weighted delegation. A restarting node must rebuild exactly the same set. Jailing for downtime follows the signed ratio within a participation window of 300 committed blocks, not a count of consecutive misses.

§8Open limits#

  • Slot time is a target, not a bound on finality.
  • Light clients trust the validator set on first contact until out-of-band anchor pinning is implemented.
  • If more than one third of voting power is eclipsed from the evidence, inclusion can be delayed until the evidence expires.
  • Measured liveness under sustained load is the binding constraint today. See Assurance.

Sources: internal/consensus/engine.go, locking.go, leader.go, importer.go, evidence_force.go; crypto/ecvrf.go, crypto/validator_signing.go; configs/config.toml; consensus/BFT threat model 0.3.0.

Cite this page
@misc{resilience-protocol-consensus,
  title  = {{Consensus and finality}},
  author = {{Resilience Network}},
  year   = {2026},
  note   = {Reference implementation c3acec4, protocol manifest r28},
  url    = {https://resiliencenetwork.xyz/protocol/consensus/}
}