$_ stdout

The Case for Verified Consensus, Part 1

Lean 4, Rust-to-Lean transpilation, and AI-orchestrated proof search are being credited with turning blockchain consensus verification from an academic curiosity into a production requirement. The technology underneath that claim is real: Lean 4, Aeneas, Charon, LeanDojo all hold up.

A claim that machine-checked proof beats human trust invites exactly one kind of stress test: trace the chain of trust to where it ends. Done honestly, the finding is stranger than a checklist of bad footnotes — the claim depends, at exactly one point, on the very human judgment it promises to eliminate.

Part 1 sets up the question: why consensus correctness is a blockchain's actual product, what “correct” formally means, and the four distinct ways a formal-verification claim can fail even when the proof itself is genuine. Wrong, unshipped, partial, narrow.

Part 2 (coming soon) puts Lean 4 itself under that lens: the real technology, five recent protocol case studies, and whether any of them get all the way to production.

BL Dr. Ben Livshits August 16, 2026 · 162 commits

Distributed systems have leaned on consensus for decades. Databases replicate for durability, cloud platforms fail over across regions, and every one of them settles disagreements through some protocol most users never see or think about. Blockchains inherit that same problem under harsher constraints: no operator holds root access to break a tie, no snapshot exists to roll back to, and the thing being agreed on is frequently somebody else's money. That's what makes consensus correctness the actual product rather than an implementation detail. Get it right and a ledger earns trust without needing to trust any single party; get it wrong, and every guarantee built on top of it, finality, custody, cross-chain settlement, stops meaning anything the instant two honest nodes disagree.

Every so often a claim arrives confident enough to deserve a check of its own. The claim at the center of this post is that formal verification, specifically the Lean 4 theorem prover combined with Rust-to-Lean transpilation pipelines and AI-orchestrated proof search, has crossed the threshold from research toy to production requirement over roughly the last fifteen months, succeeding precisely where dynamic testing is supposed to top out.

Infographic titled 'The Problem: The Cost of Human Error' and 'The Solution: The Lean 4 and AI Stack.' Left, three problem panels: a cracked safe beside a '$1.09 Billion in Real Web3 Losses' statistic, illustrating the scale of catastrophic losses across the space; a spotlight-in-darkness illustration captioned 'Testing Samples a Space; It Doesn't Cover It,' noting dynamic testing can't provide safety guarantees for an arbitrary number of nodes; and 'The Failure of Manual Peer Review,' showing a flagged 'Proven EPaxos Protocol' document on a timeline marked 'Hidden for a Decade,' noting the 'proven' EPaxos protocol contained a safety violation that stayed hidden from human reviewers for ten years. Right, four solution panels: 'The Zero-Sorry Standard,' a shield badge for a machine-checked proof with every step verified by a kernel and no gaps or placeholders; 'Rust-to-Lean Transpilation,' showing Charon and Aeneas translating Rust code into Lean 4; 'AI-Orchestrated Proof Dispatch,' showing an LLM generating proof tactics dispatched to a Lean 4 kernel acting as a deterministic referee that rejects hallucinations; and a comparison table pitting Lean 4 against legacy provers like Coq and Isabelle on language unity, execution speed, and metaprogramming support.
// A visual overview of the ground this post covers — the same cost figures, tools, and standards get checked individually, section by section, below.

The stakes named are specific, not abstract. A permissionless network has no trusted operator standing by to reboot the cluster or reconcile from a backup when nodes disagree — the same consensus mechanism that decides which transactions are real is also the last line of defense between an attacker and someone else's money, with no maintenance window if it fails. That's exactly why sequencer engines, L1 consensus layers, and cross-chain bridges get named as case studies, backed by ten references, building toward the claim that machine-checked "zero-sorry" proofs are becoming the industry's baseline expectation.

The workhorse Lean 4 provides is real.

The Curry-Howard correspondence between proofs and programs is a century of logic, not a marketing claim. Curry is Haskell Curry, who saw in the 1930s that a logic's inference rules could be read as a language's typing rules. Deriving a conclusion from premises behaves exactly like a program producing a value from its inputs. Howard is William Howard, who made the observation precise in 1969: a proposition is a type, and a proof of it is a program that constructs a value of that type.

And the correspondence part is the strong claim, stronger than analogy: proofs and programs aren't two things that merely resemble each other — they're one structure seen twice.

That's why Lean 4 can treat a proof as a checkable artifact at all: the kernel type-checks a proof term the way a compiler type-checks a program, because as far as the kernel is concerned those are the same act. Aeneas and Charon extend that same trust one step further, translating Rust into the form the kernel can check. They are real tools, built by real people, to solve a real problem. But an argument whose entire thesis is "don't trust an unverified claim, verify it" is making a promise about its own footnotes too, and that promise starts to wobble with a decade-old "settled" proof that, in 2019, turned out not to be.

01 The Cost of Getting Consensus Wrong

Three pieces of framing set up the cost argument: (1) how consensus correctness used to be established before machine-checked proof, (2) what getting it wrong has actually cost, and (3) how production defends itself today.

Background: How Consensus Correctness Used to Be Established

Distributed consensus has always had a validation problem. How mutually distrusting parties agree on a single shared fact has mattered since the 1970s and '80s for a life-or-death reason, not an academic one. SRI's SIFT project needed redundant flight-control computers to reach the same decision even when one of them was feeding the others corrupted or contradictory data, the exact scenario Lamport et al. formalized as the Byzantine Generals Problem. A single malfunctioning sensor on an aircraft can't be allowed to talk the rest of the system into a fatal disagreement.

// the Byzantine Generals problem

The setup reads like an allegory, but the result is a theorem. Byzantine generals camped around an enemy city, communicating only by messenger, must agree on one attack plan — and some of them are traitors sending contradictory orders.

Lamport, Shostak, and Pease proved that with oral messages, no signatures, the loyal generals can agree only if more than two-thirds of them are loyal (n > 3f). That threshold is the same <1/3-Byzantine assumption inside every BFT protocol this post covers (PBFT, Tendermint, Casper, HotStuff), and it reappears as the h_byz : 3 * f < n hypothesis in the quorum-intersection proof coming in Part 2.

Consensus papers responded to that stake by making a hand-written correctness argument part of the deliverable, not an afterthought. That convention, not machine-checked proof, is what the field settled into for the next four decades:

TLA+ recurs throughout that list, so a quick pause on what it actually is. First proposed by Lamport (2002), TLA+ is a formal language specifically designed to describe and verify system behavior. It combines first-order logic, set theory, and temporal logic, representing system behavior as a sequence of states in which an initial state, transition conditions, and system properties together describe an execution path. The approach is relatively concise and supports decomposing and modularizing large specifications — including the asynchronous distributed systems every protocol on this page is one of.

The gap between that and a full machine-checked proof isn't exactly small. A later project, Verdi, fully mechanized Raft's safety property in Coq in 2015, the first mechanically-checked linearizability proof for the algorithm, and it took roughly 50,000 lines of proof script, for one already-understood, already-battle-tested protocol.

That cost, not a lack of tooling, is the real reason pen-and-paper proofs became the discipline's default. Interactive theorem proving existed the whole time, but formalizing a full distributed protocol was a project of its own then, and often still is, disproportionate to what a conference deadline allows.

A protocol can be mathematically elegant on paper (Paxos, PBFT, Tendermint, Casper) and still ship a production bug that costs real money, because the gap between a proof sketch and 50,000 lines of Rust is where bugs live.

The hand-written era's own track record is checkered, and the canonical case is EPaxos: a widely-cited protocol whose decade-old hand-written proof turned out to hide a real safety violation, found only once someone went looking for it in earnest. Peer review had been the correctness gate, and it had been wrong; that story is told in full two sections down, and its machine-checked-era counterpart alongside it.

For two decades the industry's answer was dynamic testing: unit tests, property-based fuzzing, and Kyle Kingsbury's Jepsen suite, a fault-injection framework that deliberately partitions networks, kills nodes, and skews clocks to see whether a database really delivers the consistency it advertises. Jepsen spent a decade finding split-brain conditions and data loss in MongoDB, Cassandra, CockroachDB, and Elasticsearch, systems that had already passed thousands of deterministic tests. Jepsen is real, its track record is real, and the conclusion it points to is correct: testing samples a space; it doesn't cover it.

The spectrum of consensus validation, from unit tests to formal proof A horizontal timeline of increasing rigor, left to right: unit and integration testing, verifying a linear execution path; property-based and fuzz testing, exploring pseudo-random traces; chaos engineering in the style of Jepsen, discovering fault-injection edge cases; and, at the far right and visually emphasized as the endpoint, formal verification in Lean 4, an exhaustive mathematical proof over all possible state-space executions. Each stage covers more of the state space than the one before it, and only the rightmost stage covers all of it. Linear execution path verification Unit / Integration Testing Property-Based / Fuzzing Pseudo-random trace exploration Fault-injection edge-case discovery Chaos Engineering Formal Verification (Lean 4) Exhaustive proof of all state-space executions
// Figure 1. The framing behind why testing tops out: each stage to the right covers a larger slice of the state space, and only formal proof covers the whole thing, for an arbitrary number of nodes.

Figure 1 lays out that whole spectrum, testing through formal proof. The Lean 4 end of it is already the bleeding edge in practice, not just in theory; the Mysticeti formalization in Part 2 will make that concrete.

Flawed Consensus

Actual consensus bugs — the kind that live in the protocol layer itself, not in a smart contract sitting on top of it — have mostly been quieter but no less real: Tendermint-based Cosmos chains have stalled on voting-power edge cases and epoch-boundary mismatches, and Solana has taken multi-hour outages from resource-exhaustion and clock-drift conditions in its leader schedule. Layer-2 sequencers have shipped their own version of the same story more than once: Arbitrum's Sequencer got stuck after a burst of transactions in September 2021, stalled again under an Ethscriptions-driven batch-posting backlog in December 2023, and Base halted block production twice in one week in June 2026 after a stale-journal-state bug produced a receipts root validators correctly rejected.

A validator set can't roll back a finalized block without a hard fork, and a hard fork is a political event, not a technical one.

The dramatic bugs, the ones that actually split a network or forced a chain to reorganize, are fewer, older, and much better documented:

None of the three needed a flawed spec or a broken incentive design to be expensive. They were plain implementation bugs in consensus-critical code.

The three dramatic, network-splitting Bitcoin and Ethereum consensus bugs A horizontal timeline with three points. August 2010: the value overflow incident, an integer overflow that let a single block mint 184.5 billion BTC, undone by a 53-block reorganization. March 2013: a Bitcoin 0.8.0 versus 0.7 database-layer mismatch split the network until miners downgraded, orphaning 24 blocks and letting a real double spend through. November 2020: a consensus bug in the Geth client, then running roughly 80 percent of Ethereum, split the chain for about two hours. August 2010 Value Overflow 184.5B BTC minted ~53-block reorg March 2013 v0.8 / v0.7 Chain Fork 24 blocks orphaned real double spend November 2020 Geth Consensus Bug ~80% of network ~2hr chain split
// Three real, network-splitting consensus bugs, a decade apart — older and better documented than the quieter failures above, and the reference cases the rest of this post keeps measuring machine-checked proof against.

Their cost shows up differently from headline thefts: forced reorgs, split networks, and halted services rather than drained wallets. Exactly the class of bug machine-checked verification exists to catch.

How Production Consensus Actually Gets Tested

None of the machinery described so far, Lean 4 proofs or AI-orchestrated tactic generation, is how Ethereum or Solana actually defend against the bugs above, today, in production. Both networks lean on client diversity instead (see a forthcoming blog post): multiple, independently-written implementations of the same protocol, run in parallel, precisely because a single codebase, however carefully audited, shares one blind spot across every validator running it.

The mechanism holding these independent implementations to identical behavior isn't a Lean 4 kernel; it's Hive, Ethereum's cross-client end-to-end test harness. Hive boots a simulated network from real client images, Geth, Nethermind, and Besu on the execution side, Lighthouse, Prysm, and Teku on the consensus side, and runs scenarios a unit test can't stage. A staple: make one node propose a block with a corrupted state root, then verify every other client rejects it and the network keeps finalizing the valid chain. That's precisely the failure mode a dominant-client bug produces, and the one the Nethermind incident later in this section actually hit.

On top of that sits a shared conformance suite derived directly from the protocol spec, covering epoch processing, fork-choice, validator shuffling, reward calculation, SSZ serialization, and more, versioned per hard fork from Phase0 through the upcoming Fulu and Gloas — plus devnets and shadow forks that replay real mainnet state to stress-test upgrades before they ship.

The suite runs the same test logic under two parameter presets, because a conformance failure can hide in either. The mainnet configuration uses the production constants: 12-second slots, full epoch lengths, a validator set in the hundreds of thousands. A passing test there means the code handles real mainnet parameters. The minimal configuration scales every parameter down, a handful of validators and shorter epochs, so the same tests run in seconds in CI and on devnets. The two columns below count the test vectors each configuration produced, per hard fork:

Hard forkMainnet-config filesMinimal-config files
Phase02,26512,015
Altair3,88917,767
Bellatrix4,19219,433
Capella4,46321,133
Deneb4,62721,669
Electra5,46325,447
Fulu7,70528,751
Gloas5,17730,055
EIP-7805 (inclusion lists)3,36226,037
Total, per config41,143202,307
// Figure 2. Test-vector file counts per hard fork in ethereum/consensus-spec-tests, mainnet vs. minimal configuration, counted directly from the repository's Git tree as of this writing. A further 9,961 config-independent files (SSZ generics, BLS, Merkle-proof fixtures, and other non-fork-specific categories) bring the repository past 253,000 individual test vectors in total — before Hive, devnets, or shadow forks add anything on top.

Not Hypothetical

That mechanism isn't hypothetical: a deviating client exposed and contained by disagreeing with the majority. In January 2024, a bug in versions 1.23–1.25 of the Nethermind execution client caused roughly 8% of Ethereum's validators to start producing invalid blocks. Because Nethermind was one of several independent execution clients rather than the only one, the network as a whole kept finalizing correctly on the majority behavior. The bug was contained to the validators running that specific client, visible almost immediately as a minority disagreeing with everyone else, and patched within hours. A Geth-scale bug in a network with only one dominant client wouldn't have that containment property at all.

The Nethermind incident wasn't the first time this mechanism did its job. The earlier case is the more dramatic one, and it's the reason Ethereum takes client diversity as seriously as it does. In August 2020, Prysm ran over 65% of the nodes on the Medalla public testnet when a Cloudflare clock-sync bug knocked it offline, triggering more than 3,000 slashing events and collapsing network participation from roughly 75% to the single digits within hours, a client-concentration failure playing out exactly as feared, months before mainnet and with no real stake at risk. Prysmatic Labs' own postmortem, days later, was unusually blunt about what that timing meant:

It would have been really terrifying if the Medalla public testnet ran uninterrupted, with perfect performance right before mainnet, and then this bug occurred with real money at stake once eth2 launched. [...] This was the best thing to happen to a testnet.

Solana is the network that counterfactual describes. Its validator fleet ran almost entirely on one client, Agave, until Firedancer's mainnet arrival in 2026, and in December 2025 Anza, Agave's maintainer, privately disclosed two critical bugs in it. Malicious gossip messages could crash validators outright, and a flood of unverified vote messages could stall consensus; both were patched in the urgent v3.0.14 release of January 2026, coordinated with Firedancer, Jito, and the Solana Foundation. A day after the patch shipped, only 18% of stake had upgraded. The network's "always-on" promise was still running on software that a coordinated attacker could have stalled. Nothing was exploited; the exposure window is the point.

// the actual argument For me, the interesting question was never whether blockchain consensus bugs are expensive, or whether published proofs can be wrong. Both obviously happen. It's whether the specific remedy on offer, machine-checked Lean 4 proofs dispatched by AI tactic generators, delivers on what its own marketing claims, and whether the case being made for it holds itself to the standard it's prescribing.

02 What “Correct” Actually Means

Grading the remedy means grading it against something. Every consensus protocol specification rests on two properties Leslie Lamport formalized in the 1970s: safety, meaning nothing bad happens, and liveness, meaning something good eventually happens.

Safety for a consensus protocol unpacks into agreement, validity, and integrity. Agreement means no two honest nodes decide differently for the same slot; validity means a decided value must trace back to a legitimate proposal; integrity means no node decides twice. Liveness unpacks into termination and progress: every honest node eventually decides, and the network keeps committing blocks despite bounded adversarial behavior.

Consensus correctness decomposed into safety and liveness A root property, consensus correctness, branches into two child properties. Safety, nothing bad happens, requires agreement (no two honest nodes decide differently), validity (decided values trace to a real proposal), and integrity (no node decides twice). Liveness, something good eventually happens, requires termination (every honest node eventually decides) and progress (forward progress continues despite bounded adversary disruption). Consensus Correctness Safety “Nothing bad happens” Liveness “Something good eventually happens” Agreement — no two honest nodes decide differently Validity — decided values trace to a real proposal Integrity — no node decides twice Termination — every honest node eventually decides Progress — commits continue despite bounded adversary disruption
// Figure 3. The two properties every consensus proof has to establish — and the sub-obligations each one unpacks into.

One more piece of framing before the verification tooling: the CAP theorem, which sits one level up from safety and liveness rather than inside them. Eric Brewer's conjecture, proven by Gilbert and Lynch in 2002, says a distributed system can't simultaneously deliver consistency, availability, and partition tolerance. It isn't a free pick-any-two. During a partition it's a hard choice between consistency, all nodes seeing the same data and therefore a safety property, and availability, every request getting a response and therefore a liveness property.

Public blockchains sit at the extreme consistency-over-availability end, stopping finalization when the network splits rather than risking two histories. That's why safety and liveness, not CAP, are what consensus proofs actually pin down, and why CAP rarely shows up in formal verification papers. Two families of tools exist to pin them down.

Model Checkers

Model checkers like TLA+'s TLC, SPIN, and UPPAAL can verify safety and liveness automatically for small, abstract protocol sketches, three or four nodes and a handful of rounds. Past that, they run into the state space explosion problem almost immediately.

Add nodes, rounds, or message types and the reachable state graph grows combinatorially; a protocol that allows k distinct message types across n nodes with a buffer of size m has a state space on the order of ∏i |Si| × (m!)k, and no amount of clever traversal changes the fact that it's finite for any one instance but unbounded across instances. That's a different problem from the "arbitrary n" guarantee a real deployment needs, a limitation Feng and Zhang's 2026 survey of the broader consensus-verification landscape traces across model checkers generally, not just this one case.

Theorem Provers

Interactive theorem proving sidesteps the explosion by proving a universally-quantified statement directly rather than enumerating states: instead of checking that a 4-node instance doesn't violate safety, you prove that no instance, at any n, does.

The standard technique is the inductive invariant: a predicate I(S) over global states, discharged through three proof obligations — (1) a base case (I holds at the initial state), (2) an inductive step (if I(S) holds and a valid transition produces S′, then I(S′) holds too), and (3) entailment (I(S) implies the actual safety property you care about).

Structure of an inductive invariant proof Four steps. First, the initial state S-zero validates the base case, I of S-zero. Second, an arbitrary state S is assumed to satisfy the inductive hypothesis I of S, and a network message m is applied via the transition function delta, yielding a new state S-prime, for all valid m. Third, the mathematical proof engine proves that I of S-prime holds for every valid m. Fourth, the entailment check shows that I of S implies the safety property for all reachable states. Proving an inductive invariant I(S) Initial State S₀ Validates base case: I(S₀) apply message m via δ(S, m) Arbitrary State S Assume inductive hypothesis: I(S) holds → yields new state S′ for all valid m Mathematical Proof Engine Proves I(S′) holds for all valid m entailment Entailment Check I(S) ⇒ Safety(S), for all reachable states
// Figure 4. The three-part structure every inductive invariant proof has to close: base case, inductive step, and entailment.

Establishing one is genuinely hard, because local per-node facts, like "node i has locked block B at round r," have to compose into global facts across the whole quorum structure. The standard BFT quorum-intersection lemma is the canonical example: any two quorums of size ⌈(2n+1)/3⌉ share at least one honest node. The quorum-intersection proof in Part 2 discharges that exact obligation end-to-end, in working Lean 4 rather than in prose.

03 Formal Methods Are Not a Panacea

The cost side is only half of the argument. That consensus bugs are expensive motivates the search for a remedy, but says nothing about whether the remedy on offer, machine-checked proof, can itself be trusted. The other half is that remedy's track record: published proofs, treated as settled, that later turned out to be wrong. That history belongs next to the production incidents above, not treated as a separate story.

The remedy fails in four distinct ways, each striking a different point in the chain. (1) A proof can be simply wrong: it doesn't establish what it claims, and the protocol carries an undiscovered bug for years, as with EPaxos. (2) It can be right but unshipped: it finds a genuine bug in deployed code, then the fix stalls before the network adopts it, as with Mysticeti. (3) It can be partial: it covers a simplified or abstract model, not the implementation that actually runs, as with the HotStuff formalizations. (4) It can be narrow: it certifies the algorithm in isolation, not the composed system a validator runs in production, as with Tendermint. The four cases that follow are one of each.

Wrong, unshipped, partial, narrow. The four failure modes above read as four different stories, but they're failures against the same two yardsticks: safety and liveness. However different their proximate cause, a flawed proof, a stalled patch, an abstracted model, an isolated algorithm, each one ultimately means a validator can either disagree with an honest peer or simply stop making progress. Those are the same two outcomes this post keeps returning to.

Wrong Proof, Undetected Bug

EPaxos, a widely-cited Paxos variant published at SOSP 2013 with an accompanying TLA+ specification and a hand-written safety proof, was treated as settled for the better part of a decade. In 2019, Pierre Sutra found and published a genuine safety violation in both the specification and the reference implementation: under a specific interleaving, replicas could disagree about a command's dependencies, breaking the exact property the original proof claimed to establish. One of EPaxos's own authors later acknowledged the team never got around to formalizing the protocol's recovery path, which is precisely where the bug lived.

Ryabinin et al.'s follow-up paper, presented at OPODIS 2025, was still fixing and simplifying the protocol twelve years after its original publication; its authors' verdict on the original is matter-of-fact: "the protocol is very complex, ambiguously specified and suffers from nontrivial bugs." A hand-written proof and a bounded TLA+ model check are real evidence, but they are not the same claim as a machine-checked proof that holds for arbitrary n. EPaxos is the textbook case for why that gap matters.

Right Proof, Unshipped Fix

The same pattern is playing out right now on a live network, not a decade-old protocol. Qiu et al. built machine-checked safety and liveness proofs for Sui's Mysticeti consensus protocol in the Rocq proof assistant, presented at IEEE S&P 2026. Their test case against the actual deployed implementation found it incorrect, in a way that can lead to real liveness attacks.

Here's the specific bug: Sui's implementation lets an honest node "jump" over a round without creating a vertex there, and the paper constructs an explicit infinite trace, under that behavior, where no leader vertex is ever committed. The authors audited the actual Sui source (commit 2f52a72) and confirmed it matches the vulnerable behavior, then proved a fix, a restriction on which rounds a node is allowed to jump over, backward-compatible with nodes that haven't upgraded, and mechanically verified that the fixed version restores liveness.

As of publication, that fix was proposed and proven, not yet shipped: Qiu et al. state plainly that "we have contacted Mysten Labs and they have acknowledged the issue. We are currently working with them to resolve the liveness issues." A check of the public Sui and IOTA repositories as of this writing finds no implementation of the round-jump restriction; the only round-jump-adjacent change in either project is an unrelated IOTA threshold-clock quirk fix, and Sui's consensus code has evolved considerably since the audited commit without touching the vulnerable behavior.

IOTA, whose chain forks Sui's Mysticeti implementation, is reportedly pursuing a different fix of its own. Qiu et al.'s own related-work section points to Polyanskii, Mueller, and Vorobyev's Starfish paper, which proposes requiring every honest process to create a vertex in every round, a stricter rule than Qiu et al.'s fix and one Starfish requires from the start of protocol execution rather than allowing mid-run adoption. A proof that catches a real bug is exactly what this technology is supposed to do, but catching it and shipping the fix are two different milestones, and only the first one has happened so far.

Proven Model, Unproven Code

Aptos, whose AptosBFT is itself a HotStuff descendant, hasn't had a proof at that level tied to its actual deployed implementation. The formal-verification effort specific to Aptos has gone almost entirely into the Move VM and framework, not the BFT protocol underneath it. Two major, currently-running networks, two very different amounts of scrutiny on the part that actually orders transactions.

HotStuff itself, the protocol underlying both AptosBFT and Diem/Libra's DiemBFT, has drawn more mechanized attention than any single deployment built on it. Jehl, at FORTE 2021, proved safety of a simplified HotStuff using Ivy and the TLA+ Proof System, showing along the way that HotStuff's tree-shaped commit structure, a real departure from the view-by-view model older BFT protocols use, makes the verification problem harder than that older model does. Carr et al. published a machine-checked Agda safety proof of an abstract HotStuff/LibraBFT model at NFM 2022, and, independently, Kukharenko et al. specified and model-checked HotStuff in TLA+/TLC in 2021 for an unrelated industrial ledger project.

None of the three closes the gap Mysticeti's proof did: Jehl's and the Agda proof both cover safety on a simplified or abstract model with no tie to concrete implementation code, and TLC-style model checking runs into the same state-space-explosion ceiling as any other bounded checker. It doesn't hold for arbitrary n.

HotStuff the protocol has been formalized more than once; HotStuff as actually deployed inside Aptos hasn't.

Proven Algorithm, Unproven System

Tendermint tells an even more interesting version of this story. The naïve framing, battle-tested and never formally proven, turns out to be wrong. Tendermint, now maintained as CometBFT, settles blocks for well over a hundred chains in the Cosmos ecosystem, Celestia, dYdX, Injective, Osmosis, and Kava among them, and that scale is real production exposure, not a marketing number.

It also has a real proof. In 2021, Galois and Informal Systems independently verified Tendermint's core safety property, that two well-behaved nodes never disagree given standard quorum-intersection assumptions, plus two accountable-safety properties, that misbehaving validators are identifiable and honest ones can't be framed. They used two different toolchains, Ivy and TLA+/Apalache, that reached the same conclusions. The proof itself is compact: the protocol description runs about 350 lines, the Ivy proof of it only 125.

That adoption predates the proof, though, and isn't downstream of it. Cosmos Hub's mainnet launched in March 2019; the SDK-driven app-chain ecosystem grew from there on developer ergonomics and IBC interoperability, which itself only shipped in 2021, the same year as the Galois/Informal Systems proof, not before it. Nobody picked Tendermint because it had been proven correct; the proof arrived after the adoption case had already been made on other grounds entirely.

Two things complicate the reassurance. An earlier formalization effort, Amoussou-Guenou et al.'s "Dissecting Tendermint" (2019), found real bugs in preliminary versions of the protocol during the process of formalizing it across different network and adversary models, the same EPaxos-shaped lesson that writing the formal model down is itself how some of these bugs surface.

A 2025 paper on Tendermint's termination properties states plainly that prior safety and termination analysis, the 2021 proof included, "has been done in a standalone fashion, with no consideration of the composition with other protocols" it actually runs alongside. The 2021 proof is real and it holds for the algorithm as specified; it still doesn't cover the composed system a validator actually runs, which is the same refinement-proof boundary this post keeps circling back to, one level up.

The production record doesn't contradict any of this. The most visible recent Tendermint-ecosystem chain halt, Cosmos Hub on June 5, 2024, traces to a bug in the Cosmos SDK's staking and interchain-security modules, not the CometBFT consensus algorithm: adding one validator and removing another in the same block briefly pushed a validator-power index past its configured cap. That's a real production failure sitting in the layer around consensus, not the safety property the 2021 proof actually covers. It cuts both ways: either a point in Tendermint's favor, or a demonstration of just how narrow "the consensus algorithm is proven safe" turns out to be once the composed system a validator actually runs is what's in question.

The Gap No Refinement Proof Closes

Even setting the four cases above aside, there's a more structural issue with the whole thesis. A proof only ever certifies conformance to a spec, and nothing in the machine-checking toolchain checks whether the spec itself says what the protocol designer meant it to say. Not the prover's kernel, not the extractor, not a zero-sorry refinement proof.

Follow the pipeline to its end and the same conclusion falls out. The Rust becomes a model; the model is refined against a spec; the refinement is proven; the certificate is issued. None of that machinery ever examines the spec itself, the hand-written statement of what the protocol is supposed to guarantee. An inductive invariant that's subtly too weak, or a quorum-size threshold that's off by a rounding error, will sail through the entire pipeline: the extractor will translate it faithfully, the refinement proof will succeed, and the zero-sorry certificate will be genuine.

The bug just moves up one layer, from "the Rust doesn't match the spec" to "the spec doesn't match reality." That's precisely the distinction the software-engineering literature calls verification versus validation: verification asks "did we build the thing right," validation asks "did we build the right thing," and formal methods have always been much better at the former than the latter. Carrone put the same point succinctly: a proof is only as good as its spec.

The four cases above are each an instance of that boundary doing real work, a decision about the spec's scope rather than a fault in the proof machinery. EPaxos's bug lived in the recovery path its authors never got around to formalizing, outside the spec entirely. Mysticeti's round-jumping behavior wasn't excluded by the original model until Qiu et al. added the restriction; the spec drew its boundary in the wrong place, and the proof of the model it did cover was never broken. HotStuff's formalizations prove the abstract algorithm, not the Rust or Go a validator actually runs, a boundary between model and code rather than between correct and incorrect reasoning. Tendermint's 2021 proof covers the standalone algorithm, not the composed system running alongside the mempool and state-sync plumbing wired around it. Even a perfect pipeline leaves that boundary exactly where the designer put it.
// the honest version of the claim

"Zero-sorry" is a real, meaningful, checkable property, considerably stronger than "it passed our test suite": every proof step in a specific proof chain is machine-verified against Lean 4's trusted kernel, with no admitted gaps.

It does not mean the protocol is bug-free, and it does not mean the spec captures every property an auditor would care about. That's the same category of blind spot testing has always had, just moved to a higher level of abstraction. Conflating "the proof compiles" with "the protocol is safe" is exactly the kind of unverified leap this post argues against, even where the framing above leans toward the more impressive-sounding claim.

This isn't a hypothetical concern specific to consensus. It's the same lesson that applies to AI-generated code more broadly: test suites and even formal specs are only as good as the invariants someone thought to write down. Stubbornly under-specified systems pass every check you thought to run, right up until the one you didn't.

// part 2 This is Part 1 of a two-part post. Part 1 covers why consensus correctness is the actual product, what “correct” formally means, and the four ways formal-verification claims can fail even when the proof itself is real. Part 2 — Lean 4 itself, scaling proofs up, the code-extraction gap, five real-protocol case studies, and the verdict — is coming soon.

References

Citations Checked Against Their Sources
Real Evidence the Citations Don't Mention
Real Tools and Infrastructure Named Above
Prior Case Studies the Citations Never Mention
On Client Diversity and Cross-Client Testing
On Testing, Verification, and Validation
On Consensus-Implementation Bugs
On EPaxos and Mysticeti: Manual Proof Wrong, Machine-Checked Proof Right