$_ stdout

Client Diversity, Generated

Client diversity — running several independently-written implementations of the same protocol so no single bug can finalize an invalid chain — has always been the right fix for consensus risk: even a mathematically perfect protocol still has to be implemented in code, and no proof of the algorithm touches the bugs that creep in during that translation. It's also always been the expensive one: a production-grade client is years of engineering and tens of millions of dollars, which is why most chains have one dominant client and a thin second one, not five.

AI coding agents are genuinely changing that cost curve — engineers could be shipping working execution clients, in Rust, Go, and Zig, in weeks instead of years. What they aren't automatically changing is the fifty-year-old catch built into N-Version Programming (NVP), the fault-tolerance theory that makes N implementations worth more than one: majority voting only masks bugs that fail independently, and the evidence on whether AI-generated clients clear that bar is a lot shakier than the headline case studies suggest.

The cost-collapse holds up: Rustock, ETH2030, XVI/Guillotine, and SHiNode are genuine, working clients. What doesn't hold up is treating cheaper client-writing as equivalent to more client diversity in the sense that actually matters — NVP's fault-masking guarantee has needed an asterisk since Knight and Leveson's 1986 study, and the current evidence on AI-generated ensembles says the same thing: real fault reduction is achievable, full independence isn't.

Yet many questions remain: can a shared, machine-checked specification generate a consistent family of full nodes, light clients, and indexers instead of today's unrelated one-off agent projects, how to actually measure failure independence at scale, and whether anyone will pay a validator to run the minority client once it exists.

BL Dr. Ben Livshits August 23, 2026 · 49 commits

The claim behind this post is simple and, on the evidence, mostly right: autonomous AI coding agents — Claude Code, Cursor, Gemini — can now mostly synthesize working blockchain clients from scratch, without a team of engineers spending years on it.

Infographic titled 'AI & The Future of Client Diversity: Breaking the Cost Curve,' split into three bands. Top left, the High Cost/Slow Manual Era: factory machinery, gears, and stacked cash, captioned 'From $10M+ to $7,100,' noting AI agents built ETH2030 for roughly $7,100 in API tokens over eight days. Top right, the Low Cost/Fast AI Era: a stylized brain/circuit illustration under 'Years Shrink to Weeks' (Rustock and SHiNode delivered working prototypes in weeks instead of years) and '\
// Figure 1. This post's own visual summary of the argument above and below — the cost collapse, the reference-as-spec problem solved by mainnet-replay oracles, and the NVP reliability gap the rest of this post spends most of its time on. Two things worth flagging on its own terms: the mini case-study table lists only three of the four projects (XVI/Guillotine doesn't appear), and its “under 24 hours” for SHiNode's sync time is looser than the roughly six hours SHiNode's own README states, covered precisely below.

Before we get into any of that: it's worth being explicit about why this is worth writing about at all.

Testing blockchain infrastructure is unusually hard, for a reason ordinary software mostly doesn't share — the client's correctness is the integrity guarantee. In a centralized system, a database bug is a bug: annoying, costly, fixable with a patch and an apology. In a decentralized one, there's no operator to trust and no maintenance window to fix things quietly — the client's behavior has to be right across a state space no test suite can fully enumerate, forever, with real money on the line the moment it isn't.

This blog's own two-part look at verified consensus covers the most rigorous attempt to close that gap — machine-checked proofs of the consensus algorithm itself — and Part 2's verdict is that even those proofs stop at the algorithm, never quite reaching the production binary actually running.

That's the entire reason to want more than one implementation in the first place. Decentralization isn't an aesthetic preference — it's what lets a network survive a captured, coerced, or simply broken operator without asking anyone's permission to keep running.

It's also not one dimension: Buterin's own framing of the meaning of decentralization splits it into political (how many people or organizations control the nodes), architectural (how many machines can fail at once without taking the system down), and logical (whether the system presents as one unified state or an amorphous swarm) — largely independent axes, so a chain can score well on one while quietly failing another.

Client diversity is squarely an architectural decentralization mechanism: a blockchain can be politically decentralized, with thousands of unrelated operators, and still have almost no architectural decentralization if all of them are running the same binary. A blockchain with one client, one company, or one point of control has quietly become the centralized system it was built to replace; censorship resistance and the promise that no single party can freeze funds or rewrite history both depend on nobody's individual mistake being able to take the whole network down.

Client diversity is that promise's most direct technical expression, not a nice-to-have on top of it.

History backs up how easily that promise — that no single client's mistake can take down the whole network — fails when there's nothing but luck standing behind it. Both incidents below happened while Bitcoin ran on what was effectively one client, with no second implementation around to disagree.

On August 15, 2010, an integer overflow in Bitcoin's own client (CVE-2010-5139) let a single transaction mint roughly 184 billion BTC out of nothing; the network caught it and forked to a corrected chain within about five hours, only because Satoshi and a handful of early developers happened to be watching closely enough.

Less than three years later, in March 2013, Bitcoin split into two competing chains for roughly five hours when v0.8 clients — freshly migrated to LevelDB — accepted a large block that v0.7 clients, still bound by Berkeley DB's 10,000-lock limit, rejected outright.

Not an attack, just two versions of the same reference client quietly disagreeing about what a valid block was, resolved only because miners coordinated by hand to roll back to the older version. Both bugs lived in the most-trusted software on the network, undetected, until real money made the cost of finding out unavoidable.

01 Client Diversity

Client diversity is one of those fixes that is obviously right and yet routinely skipped — this section covers the mechanism that makes it work: catching a bug because two independent implementations disagree about what actually happened.

In a distributed state machine, every node has to independently compute the same state root after replaying the same transactions. Client diversity — running multiple independently-written implementations of the same protocol side by side — exists because a bug in the dominant implementation is a bug in the network whenever enough validators run it.

This directly cuts into the difference between the algorithm and its implementation discussed in the consensus posts.

Ethereum's own community guidance is explicit about the threshold: no single execution or consensus client should cross roughly a third of the network's validation power, because that's the point past which a client-specific bug can finalize an invalid chain outright rather than just embarrassing the minority running it.

That's not a hypothetical concern.

Two historical client-bug incidents on a timeline A horizontal timeline of the Bitcoin network. In August 2010 a value-overflow bug, CVE-2010-5139, minted roughly 184 billion BTC; the chain forked and was fixed within about five hours. In March 2013 the BIP-50 fork split Bitcoin into two chains for roughly five hours when v0.8 clients accepted a large block that v0.7 clients rejected; miners rolled the network back by hand. Each event shows the chain line deviating and rejoining. Aug 2010 · overflow CVE-2010-5139 · 184B BTC minted forked, fixed in ~5h minority client, patched Mar 2013 · BIP-50 v0.8 LevelDB vs v0.7 BDB two chains for ~5h rolled back by hand
// Figure 2. Two historical moments where a single client's bug nearly took the network down — and diversity, or luck, contained it. August 2010: the value-overflow incident minted roughly 184 billion BTC; the chain forked and was patched within hours. March 2013: BIP-50 split Bitcoin into two chains for about five hours when v0.8 and v0.7 clients disagreed about a valid block; miners rolled back by hand.

The mechanism is old and unglamorous: disagreement between independent implementations is itself a bug detector, catching exactly the class of fault — one implementation's subtle deviation from spec — that no amount of internal testing catches by definition, because a single codebase can't disagree with itself.

The question at the heart of this post is whether AI-generated clients give the network more of that property, or just more code that looks like it.

02 Why Nobody Builds a Second Client

If disagreement between clients is such a useful bug detector, the obvious and natural question is why most chains don't have five independent implementations already. Three structural reasons, and none of them are exotic:

Three Structural Reasons

As mentioned, what AI coding agents plausibly change is the first of those three, and only partially.

An agent can write hundreds of thousands of lines of EVM execution logic in days rather than years — the second and third problems, matching reference-implementation quirks and overcoming an incumbent's trust advantage, are unaffected by how fast the first draft gets written.

ChainProduction clientsNamed clientsDominant client's share
Ethereum (execution)5Geth, Nethermind, Besu, Reth, ErigonGeth ~50%
Ethereum (consensus)6+Lighthouse, Prysm, Teku, Nimbus, Lodestar, GrandineLighthouse ~51%
Bitcoin2Bitcoin Core, Bitcoin KnotsCore ~75–85%
Solana3Agave, Jito-Solana, FiredancerJito-Solana ~72–88% of stake
Avalanche1AvalancheGo~100%
Rootstock (RSK)1rskj~100%
// Figure 3. Client counts in actual production use, not GitHub stars. Ethereum's split is unusually healthy precisely because clientdiversity.org and execution-diversity.info make the numbers public and embarrassing once one client crosses a third of the network — most chains, including several of the largest by market cap, still run on a single implementation. (Bitcoin Knots' share has fluctuated widely across 2025 snapshots; Cosmos Hub and BNB Chain are omitted here because their "second implementations" are forks of an existing client rather than independently-built ones.)

The Cost of a Second Client

The table above puts a number on the gap between the boring fix and how often chains actually have it: how many independently-built clients the largest networks run in production today, and how lopsided the split still is even where diversity nominally exists.

Ethereum's row above is the exception, not the rule — and it took years of public shaming by exactly the dashboards cited in that caption to get there. The gap between that row and everyone else's is the market these case studies are selling into.

Split-panel screenshot from execution-diversity.info and clientdiversity.org. Left panel, Consensus Clients, flags "Lighthouse has a majority, switch to a multinode client!" and lists Lighthouse 51.1%, Prysm 20.73%, Nimbus 9.06%, Teku 7.86%, Erigon 3.81%, Lodestar 3.22%, Unknown 2.45%, Grandine 1.76%, Other 0%, data via Miga Labs. Right panel, Execution Clients, flags "Switch from Nethermind, Geth to a multinode client!" and a "Data is stale" warning, listing Nethermind 43%, Geth 43%, Besu 8%, Reth 3%, Erigon 3%, Other 0%, data via supermajority.info based on 59.4% self-reported network coverage.
// Figure 4. The dashboards themselves, live — clientdiversity.org and execution-diversity.info — consensus clients are past the one-third warning line, with Lighthouse at 51.1%; execution clients split almost evenly between Nethermind and Geth at 43% each, not the single client clearing ~50% that Figure 3's snapshot suggests. Both panels flag their own numbers as stale or self-reported, which is the whole point: these percentages move, and "the dominant client has ~50%" is only ever true as of whenever you looked.

Numbers this volatile are exactly why a snapshot table isn't the whole story: the real question isn't what either dashboard says today, but whether AI-generated clients make building a second implementation cheap enough for these percentages to keep moving in the right direction.

The cost of a second client, before and after AI coding agents Two parallel horizontal tracks. Top track, the traditional path: a production-grade client built by a dedicated engineering team, spanning multiple years and tens of millions of dollars, implementing an EVM/state-transition engine, cryptographic precompiles, state trie persistence, peer-to-peer networking, and JSON-RPC APIs, arriving at a trusted production client. Bottom track, the AI-agent path: an agent-generated client built in weeks by a handful of engineers using tools like Claude Code, Cursor, and Gemini, arriving quickly at a candidate client — but that candidate still has to pass a live-chain differential-sync oracle, replaying mainnet against a reference implementation, before it earns the same trust the traditional path arrives at directly. Traditional path Dedicated eng team assembled & funded EVM engine · precompiles · state trie P2P networking · JSON-RPC, built by hand Trusted production client 2–4 years $10M–$50M+ AI-agent path One to a few engineers Claude Code · Cursor · Gemini Agent-synthesized client weeks, not years Candidate client still has to earn trust Live-chain differential-sync oracle mainnet replay against a reference client
// Figure 5. Fewer engineer-hours isn't the whole story on the AI-agent path — the candidate client still has to pass the same trust gate a hand-built client is presumed to clear by construction.

03 Four Case Studies, Read Carefully

All four projects the source names trace back to something real: Rustock and ETH2030 are AI-generated full and execution clients that already sync against live chains, XVI and Guillotine are two parallel EVM execution engines at very different stages of AI involvement, and SHiNode is a lightweight history indexer running on the least verification of the four.

Rustock

// github.com/javicid/rustock · Medium post · full node — syncs mainnet from genesis, not production-ready

Javier Cid's Medium post is the primary source for this case study. The three-toolchain workflow is real: Gemini 3 on Google Antigravity for architectural decomposition, Cursor running Claude Opus 4.5 for the hard EVM precompiles (the BTC–RSK Bridge, REMASC), and Claude Code running long, unattended background sync loops under a CLAUDE.md policy file. That file isn't actually committed to the public repo, so its contents aren't independently checkable.

The oracle strategy is the genuinely interesting part: unit tests generated by the same models that wrote the code kept missing subtle protocol nuances, so the author used live-chain mainnet replay against rskj as ground truth instead of the generated unit tests — running the client, catching a divergence, querying the reference implementation's database, fixing, resuming, unattended.

The Rustock repository itself backs up the sync claim and adds detail the source doesn't mention: 242 commits over roughly five months, 786 tests across consensus validation, the full Unitrie world-state implementation, every RSK precompile including the complete Bridge surface, RLPx P2P networking, and an rskj-compatible JSON-RPC server — a genuinely substantial full node under sustained development, not a one-shot generation. It also opens with a warning banner:

Rustock is a prototype implemented in an AI-assisted manner. It should never be used in production. The code has not been reviewed in depth and has not been security audited. It may — and will — break and contain bugs.

The repository's own docs/ directory is the best evidence for the "reference as spec" problem described in the previous section. Its quirks catalogue documents byte-level rskj behaviors that were never a deliberate design choice — an unconditional write, a missed reset — but hardened into consensus anyway because historical mainnet blocks now depend on them.

Rustock's differential-sync oracle loop A cycle of boxes. Sync mainnet from genesis, replay blocks and compute state, then check for divergence from the rskj reference implementation. If there is no divergence, keep syncing. If a divergence is found, query the rskj reference database, patch the code, and resume the sync loop. A red dashed box at the bottom notes that unit tests generated by the same models that wrote the code kept missing protocol nuances — the live divergence check catches them instead. Sync mainnet from genesis RLPx · header + block download Replay blocks, compute state Unitrie world state Divergence from rskj? state root mismatch no — keep syncing yes Query rskj DB reference state Patch code resume sync resume Unit tests from same models kept missing protocol nuances
// Figure 6. Rustock's differential-sync oracle loop — the genuinely interesting part of the case study: unit tests generated by the same models that wrote the code kept missing protocol nuances, so the author used live mainnet replay against rskj as ground truth instead. Sync, catch a divergence, query the reference database, patch, resume — unattended.

ETH2030

// github.com/jiayaoqijia/eth2030 · eth2030.com · execution client — passes EF state tests, not production-grade

This one is the best-documented of the four, and it goes deeper than the scale claim once you follow it. The repository and project site back up the headline number — 65 roadmap items built by integrating against a go-ethereum v1.17.0 base rather than from a blank file, not a from-scratch rewrite — and it passes all 36,126 Ethereum Foundation state tests it targets, matching the source's figure exactly. The line count keeps moving: roughly 702,000 at the time the source cites it, and past 790,000 by the time this post was checked, since the repo hasn't stopped growing.

The repo's own Development Stats table discloses the build itself in the same three-toolchain-style detail Rustock's post does, and the source doesn't mention any of it: Claude Code running Opus 4 and 4.6 over roughly eight days, 3.42 billion tokens billed across 34,172 API calls, 966 session transcripts — nine main sessions, 957 sub-agent runs — for an estimated $7,100 total, about $10.19 per thousand lines of the result.

The commit graph complicates the implied solo-build framing, though. 877 commits between February 17 and April 22, 2026, split across four contributors — and the named author, jiayaoqijia, isn't the one who wrote most of it: fyInALT holds 592 commits, 67% of the total, against jiayaoqijia's 277. The eight-day build figure and the roughly ten-week commit span aren't necessarily in tension — token-billed session time and calendar time are different clocks, and nothing here rules out compressed, high-intensity sessions spread across two months — but the same discipline this section keeps applying to the source cuts both ways: don't repeat a solo-author framing the commit log doesn't actually support.

The repo's own gap analysis is ETH2030's version of Rustock's quirks catalogue, and just as specific:

That's a concrete engineering constraint, not a hedge — the same "matching the reference down to the byte" problem Rustock's quirks catalogue documents, just showing up as an unexported Go type instead of a byte-encoding quirk.

What doesn't survive the trip back to the source is the framing of Ethereum co-founder Vitalik Buterin's endorsement. He reacted publicly, calling it an "impressive experiment" — but in the same breath, hedged it explicitly: the project "almost certainly" contains critical bugs and stub implementations, and his interest was in what agentic coding can prototype quickly, not a claim that the output is production-grade. Citing that tweet as validation of AI-generated-client readiness, without the hedge attached to it, inflates what its own author said.

The roadmap ETH2030 targets is real, too, not an invented label: the L1 Strawman is the Ethereum Foundation Architecture team's own long-range simplification roadmap, publicly floated by Justin Drake out of a January 2026 EF workshop and tracked at strawmap.org — ETH2030 is one attempt to actually build against a roadmap several teams are still just discussing.

XVI and Guillotine

// github.com/evmts/xvi · github.com/evmts/guillotine · EVM execution engine — no sync yet

Real and findable, and one of the two previously-unverifiable specifics now checks out: Smithers, the workflow-orchestration tool, is a real, public repository — a React/JSX multi-agent orchestrator with <Task>, <Sequence>, <Parallel>, and a looping <Ralph> component, state persisted to SQLite, outputs validated against Zod schemas, resumable after a crash rather than starting over. XVI's own README links it directly, with a code sample — an actual piece of infrastructure, not a name-drop.

The other unverifiable specific doesn't just stay unverified — it's contradicted by the project's own second primary source. XVI's README states Guillotine is "100% ethereum/tests passing, Frontier through Prague." Guillotine's own README, current as of this writing, says something different: 2,251 tests executed, 1,165 passing (~52%), 1,086 failing (~48%), with most of the failures concentrated in ecmul/BN254 elliptic-curve tests. Both are live, actively-updated repos, so the mismatch could be simple staleness on XVI's side rather than deliberate inflation — but two primary sources for the same underlying engine disagreeing by fifty points is exactly the kind of gap a reader shouldn't have to go find for themselves.

Guillotine itself turns out to be a different kind of project than the case study implies. It isn't an obscure, purely AI-generated engine — it's led by named humans (Will Cory, GitHub handle roninjin10, with 1,954 of 3,634 commits, 54% of the total; also polarzero and Vlad/vladfdp), backs the existing Tevm project, and carries Ethereum Foundation funding. Its own README welcomes "AI-assisted contributions, with proper disclosure" as one contribution path among several, not the whole story the way Rustock's or ETH2030's is. Guillotine's own status line is blunt regardless of authorship: Early Alpha, "DO NOT USE IN PRODUCTION," mainnet-only, no OP Stack or Arbitrum support yet.

XVI's own README badge calls it "100% vibecoded," stating every line of source, including the README itself, was written by AI agents, with the human role limited to architecture and orchestration through Smithers.

But it's also less far along than the case study suggests:

Unlike Rustock or ETH2030, XVI cannot sync a chain yet — it's an EVM execution engine wrapped in a client shell, not a working node.

SHiNode

// shinode.rs · github.com/vicnaum/shinode · light history indexer — no verification yet

SHiNode, developer vicnaum's lightweight Ethereum history indexer, has its own README that states the build process as plainly as Rustock's or ETH2030's: "100% AI-coded... every line of code, documentation, and infrastructure... written by AI (Cursor, Claude, Codex)." The commit history backs that framing up in a different sense too — essentially a solo project, 235 of 236 commits from vicnaum alone, active from mid-January to mid-March 2026.

One claim in this post's own comparison table needs a direct correction, not just a caveat: the table below previously listed SHiNode's verification mechanism as P2P log verification and header-chain indexing. The project's own README says the opposite: "No verification yet — data is fetched from P2P peers without proof validation," with receipt-hash verification and an optional consensus-layer node for full integrity checking both listed as planned, not shipped. Of the four case studies, SHiNode is the one currently running on the least trust of any kind — every mainnet log it serves is exactly as trustworthy as whichever peer happened to answer the request.

The sync-speed claim itself holds up precisely: SHiNode's own numbers are over 1,000 blocks per second, full mainnet history in about six hours on SSD storage (under a day on spinning disk), for roughly 800GB of full data or about 250GB in an events-only mode.

The scope stays narrow by design, not oversight: mainnet only, because — per the project's own reasoning — L2s don't expose the same P2P receipt data mainnet does, and eth_call, state access, and tracing endpoints aren't implemented; eth_getBlockByHash and the remaining receipt endpoints are listed as planned.

Of the four, it's still the narrowest in scope — a log-serving indexer, not a consensus-critical client — which is exactly why an unverified security claim in its own favor was the last thing this case study needed.
ProjectTech stackAI agent toolingSystem scopePrimary verification mechanism
RustockRustGemini 3, Claude Opus 4.5, Claude CodeFull node & light clientLive mainnet chain sync against rskj reference DB
ETH2030GoClaude Code (Opus 4 / 4.6), ~8-day buildExecution client (65 roadmap items)Ethereum Foundation state tests & mainnet execution
XVI/GuillotineZig / Effect-TSSmithers (XVI); human-led + AI-assisted (Guillotine)EVM execution engine (no sync yet)100% claimed (XVI) vs. ~52% actual per Guillotine's own README
SHiNodeRust / TypeScriptCursor, Claude, CodexLight history nodeNone yet — unverified P2P fetch (receipt-hash verification planned)
// Figure 7. The four case studies, corrected against their own primary sources — not just the source PDF's claims, but each project's own current README where it turned out to say something different. "Primary verification mechanism" means what each project checked itself against (or, for SHiNode, didn't), not an independent audit.

04 N-Version Programming, Not a New Idea

The idea of generating multiple client implementations and voting on the output isn't new; it's N-Version Programming (NVP), a software fault-tolerance technique Algirdas Avižienis introduced in the 1970s and formalized in his 1985 IEEE paper. In NVP, N functionally equivalent versions are built independently from the same specification by separate teams; all execute the same input, and a decision algorithm — typically majority voting — picks the output most versions agree on, masking any individual version's fault.

First page of Algirdas Avižienis's 1985 paper "The N-Version Approach to Fault-Tolerant Software," IEEE Transactions on Software Engineering, Vol. SE-11, No. 12, December 1985, page 1491 — the two-column title page with abstract and introduction.
// Page one of the paper this whole section traces back to — Avižienis, 1985.

Applied to AI-generated blockchain clients, the appeal splits into at least two distinct modes.

Pool-level sampling. A validator set where each operator independently picks which AI-generated implementation to run is really just client diversity at the network's existing scale, made cheaper: each validator is effectively sampling from the space of possible client implementations, the same mechanism the Client Diversity section above already covered — AI just compresses the cost of standing up each option in that sample.

Local ensembles. The more literal reading of NVP, and the one usually meant by the "run more versions" pitch: instead of one validator running one client, a single operator runs a local ensemble of two or three lightweight AI-generated clients in parallel and only broadcasts a state root once a majority of the internal versions agree — catching a bug locally, before it reaches the network, rather than relying on the whole validator set to catch it after the fact.

N-Version Programming applied to AI-generated blockchain clients One protocol specification at the top branches into three independently AI-generated client implementations: Client A in Rust from one model, Client B in Go from a second model, Client C in Zig from a third model. Each produces a state-root output, and all three feed into a majority-vote decision algorithm, producing a single attested state root. A dashed callout box notes that this masking of individual faults only holds if the three implementations fail independently, and that shared training data across models makes that independence an open, unverified assumption rather than a given. Protocol Specification Client A Rust · Model 1 Client B Go · Model 2 Client C Zig · Model 3 state root state root state root Majority-Vote Decision masks a minority-client fault Attested State Root Fault-masking holds only if A, B, C fail independently shared training data makes that independence unverified, not given
// Figure 8. Classical N-Version Programming's fault-masking guarantee, applied to AI-generated clients — the majority vote only protects the network if the dashed assumption at the bottom actually holds.

The problem is that NVP's founding empirical result already complicated the "just run more versions" story, decades before LLMs existed.

// Knight & Leveson, 1986, independently-failing

Knight and Leveson's 1986 study — the field's canonical independence test — had 27 programming teams independently implement the same specification. They found that versions failed on the same inputs far more often than chance would predict, against the independence assumption NVP's fault-masking guarantee depends on.

That result has stood for four decades as the reason NVP is a real technique with a real asterisk, not a free lunch: independently-written doesn't reliably mean independently-failing.

"The results of the tests revealed that the programs were individually extremely reliable but that the number of tests in which more than one program failed was substantially more than expected."

Knight and Leveson's result was about human teams. LLM-generated clients have a more specific version of the same problem: models trained on overlapping public code — the same GitHub repositories, the same Stack Overflow threads, the same Ethereum and Rootstock documentation — share statistical priors and reach for the same shortcuts. When a protocol specification is ambiguous, independently-prompted models don't just occasionally converge on the same bug — they're drawing from the same well, a structural reason to expect correlated failure, not an incidental one.

That's not speculation extrapolated from forty-year-old data about human teams — it's already been tested directly against AI-generated code.

Ron (2026) re-ran the Knight–Leveson experiment with modern coding agents: 48 agent-generated implementations of a complex specification, tested against a million inputs.

Common-mode failures showed up clearly, as expected — but three-version majority-voting ensembles still cut the average failure count from 387.44 down to 130.99, a real, roughly two-thirds reduction, not the near-elimination full independence would potentially deliver.

Nogueira et al. (2026) quantified the gap more precisely: across 224 coding problems, twelve LLMs, five languages, and three prompting strategies, ensembles captured only 0.43–0.44 of the reliability gain a theoretically independent ensemble would deliver — a ratio that drops below 0.3 when the ensemble is the same model prompted multiple times rather than structurally different models.

The one piece of good news in that number: heterogeneous ensembles — different base models, not the same model sampled repeatedly — do meaningfully better than same-model ones. If AI-driven client diversity is going to work at all, which models write which client isn't a cosmetic choice — it's the whole ballgame.

05 Open Problems

Five open problems come out of this cleanly, and they're legitimately open rather than solved-but-uncredited — two about a more ambitious architecture nobody's built yet, three about what's still unmeasured or unpaid for in what already exists.

Automated Specification Extraction

Most reference-as-spec chains, Rootstock included, have no machine-provable formal specification to generate variants against in the first place — an agent extracting one from rskj's Java source risks inheriting the exact quirks and bugs the extraction was supposed to leave behind. This is where Monperrus's finding, covered in Related Work below, earns its keep: if the specification, not any one implementation, is the artifact of record, "N versions" stops meaning "N codebases to maintain forever" and starts meaning "N regenerable outputs of one maintained spec" — which quietly weakens the resource-overhead argument from Why Nobody Builds a Second Client.

This blog's own look at agentic underspecification is the concrete precedent for what that extraction risk actually looks like: CCC, a multi-agent loop's from-spec C compiler, passed all 8,421 GCC torture-test cases and 91% of the LLVM regression battery — then produced 19 silent miscompilations in just 202 runs the moment an independent fuzzer used inputs the build loop hadn't anticipated. An agent-extracted rskj spec that passes every test it's checked against could be hollow in exactly the same way, and wouldn't know it until something outside its own test suite went looking.

That framing needs its own caveat, though, held up against this post's own N-Version Programming argument: a single shared spec generating every implementation is a potentially tighter common-mode-failure coupling than today's separately-trained AI-generated codebases, not a looser one. Different LLMs trained on overlapping public code still each read that code slightly differently; N clients generated from one literal machine-checked specification inherit exactly the same gaps in that specification, with no independent reading of anything to catch what the spec itself got wrong.

Does a shared spec trade correlated implementation bugs for correlated specification bugs? These are arguably easier to audit, one artifact instead of N, but aren't automatically safer, and nobody has tested whether it actually is.

The Client Scope Spectrum, Generated

The source's own four open problems don't name it directly, but the four case studies above aren't actually building the same kind of thing. Rustock and ETH2030 are full execution clients maintaining complete state; Guillotine is narrower — an isolated EVM execution engine meant to plug into different node shells; SHiNode is narrower still — a light-client-style indexer that only validates headers and serves logs, never touching full state. Treating "client diversity" as one target obscures that these sit on a spectrum — full node, light client, indexer — each trading completeness for resource cost, and each currently built as a separate, unrelated agent project rather than tiered outputs of anything shared.

If Monperrus's framing (below) is right and the specification becomes the artifact of record rather than any one implementation, that spectrum stops being three things to babysit independently. A full-state executor, a header-and-log-only indexer, and a stateless light client could in principle be three generated projections of one machine-checked spec, provably consistent with each other because they trace to the same source rather than three independent guesses at what a Java reference client does.

The client infrastructure stack, from chain to wallet A tall dashed box on the left, spanning the full height of the diagram, marks the open-problem ideal: one machine-checked specification, with four short dashed arrows pointing right into a vertical stack of five tiers on the right side. That stack, bottom to top: the chain — blocks, state root, consensus — the ground truth; full node, keeps full state, validates and proposes blocks, serves RPC; light client, verifies headers and state proofs, no full state; indexer, replays blocks to serve logs and queries, no full state; wallet or dApp, signs transactions and talks RPC only. Downward arrows within the stack mark what each tier reads from: RPC, syncs, reads, syncs. A right-side axis notes that state completeness and resource cost fall together as you move up. The spec box's four arrows generate the wallet, indexer, light-client, and full-node tiers as consistent projections; the chain itself is not one of those arrows, since it is ground truth rather than a generated client. ONE MACHINE-CHECKED SPEC generates every tier on the right as one consistent projection (the open-problem ideal — no case study does this yet) Wallet / dApp signs tx · RPC only RPC Indexer (SHiNode) logs & queries · no full state syncs Light client (Guillotine) headers + state proofs · no full state reads Full node (Rustock · ETH2030) full state · validates & proposes · serves RPC syncs The chain — blocks · state root · consensus ground truth less state · less cost full state · most cost
// Figure 9. The tall dashed box at left is the open-problem ideal from this section — one machine-checked spec generating the wallet, indexer, light-client, and full-node tiers as consistent projections, rather than today's four separate, unrelated agent projects. On the right, the client infrastructure stack those projections would target, from the chain up to the wallet: each tier reads from the one below it, and completeness and resource cost fall together as you move up. Only a full node keeps and proposes the complete state, a light client verifies headers and state proofs, an indexer replays blocks to serve logs and queries, and a wallet talks RPC to whatever surface it can reach. The chain itself isn't one of the spec box's arrows — it's ground truth, not a generated client.
Nobody in the four case studies above is doing that yet — but it's the more ambitious version of the specification-extraction problem, and arguably the more valuable one: not proving one client correct, but generating a whole consistent family of them from a single source of truth.

Quantifying Failure Independence

Nogueira et al.'s methodology, covered in Related Work below, is a real answer to "how would you even measure this," and it's more textured than a single independence ratio. They measure three things separately — structural diversity (how differently two implementations are written, via pairwise CodeBLEU similarity), behavioral diversity (whether two implementations fail the same test inputs more often than a hypergeometric independence baseline predicts), and N-version reliability (what majority voting over three or five implementations actually buys you) — then add a manual fault-analysis pass, because two implementations can fail identical tests for different underlying reasons, or fail different tests for the identical underlying bug; pass/fail overlap alone can't tell those apart.

The headline number from applying all of that to 224 competitive-programming problems, twelve LLMs, five languages, and three prompting strategies: majority voting over five independently-generated implementations raises average reliability from 0.88 to 0.91 — a real improvement, but less than half of what a genuinely independent five-version ensemble would have delivered, and the paper found that gain depends far more on which models get mixed (heterogeneous beats same-model) than on which language or prompting strategy is used.

The manual fault analysis underneath that number is the more unsettling finding: implementations that looked structurally distinct kept failing for the same root cause, exactly the failure mode majority voting exists to catch and, here, mostly couldn't.

However, a methodology isn't a deployed metric — nobody is running anything like it against live validator sets today, so there's no equivalent number for Rustock, ETH2030, XVI/Guillotine, or SHiNode, only for the twelve models Nogueira et al. tested in isolation.

Full-Node Formal Proof Generation

This blog's own two-part look at verified consensus covers the closest existing precedent: Lean 4, Rust-to-Lean transpilation via Aeneas and Charon, and AI-orchestrated proof search have real, machine-checked traction on consensus algorithms specifically — five named protocol case studies, genuine zero-sorry proofs — but, as Part 2 found, not one of them closes the loop end-to-end, from a hand-written formal spec straight through to the actual production binary.

The same toolchain is, in principle, available for a full execution client too, not just its consensus layer — the open question isn't whether the tools exist, but how much of an EVM engine, state trie, and P2P stack that machinery can actually reach before the person-years catch up with it.

In-Protocol Diversity Incentives

Nothing today pays a validator more for running a minority or AI-generated client; the client-monopoly trap from Why Nobody Builds a Second Client is an economic problem, and cryptographic proof-of-diverse-execution schemes remain a research direction, not shipped infrastructure — the closest thing to a working prototype is Ron et al. (2025), from the same Ron and Monperrus already cited above: a zkVM- or TEE-generated proof of which client a validator is actually running, checked on-chain, feeding a reward that pays out specifically to minority-client operators.

They modified Ethereum's Lighthouse client to demonstrate the mechanism end-to-end and measured the proof overhead — a real answer to "how would you even pay for this," but a modified fork of one consensus client under lab conditions, not a reward scheme live on any production network.

Deploying these schemes across thousands of validators in the wild remains as future work.

06 Related Work

Ron (2026), "N-Version Programming with Coding Agents," and Nogueira et al. (2026), "A Systematic Methodology for Evaluating Failure Independence in LLM-Generated Code," are the category's two really load-bearing papers — the actual empirical case behind this post's central claim, covered in full, with numbers, above. The one thing the source's own framing leans away from is just how sobering Nogueira et al.'s independence ratio actually is.

Ron et al. (2025)'s Galápagos is the most directly relevant prior system named in Related Work: it couples multi-language LLM code generation with formal equivalence checkers, aiming to protect against compiler miscompilation faults by construction rather than by hoping for independence after the fact — closer to what full client-diversity tooling would eventually need.

Monperrus (2026), "Bootstrapping Coding Agents: The Specification Is the Program," checks out cleanly too: a coding agent bootstraps itself from a natural-language specification, and the paper's finding is that the specification — not the generated code — becomes the stable artifact of record, regenerated and reverified on demand rather than hand-maintained forever. It's the odd one out among the four, less about measuring independence and more about what these clients would need to stay maintainable long-term — which is exactly the open problem it got put to work on, above.

Larsen et al. (2014), "SoK: Automated Software Diversity," systematized more than two decades of prior work on generating multiple variants of the same program — but for a different purpose than any of the four papers above.

Their diversity is a security mechanism (randomizing a binary's internals so a single exploit can't be replayed across every copy of it), not a fault-tolerance one (masking an implementation bug by majority vote). Two research communities have used the word "diversity" for two decades without much cross-talk between them; a client-diversity effort aimed at AI-generated blockchain nodes sits closer to the fault-tolerance tradition, but the security-diversification literature is exactly where the "common-mode failure" problem above has already been studied under a different name — correlated weaknesses across supposedly-independent variants, just with an attacker instead of a bug picking the input.

A second adjacent tradition, also worth naming honestly rather than stretching to fit: Lefeuvre et al. (2024)'s "SoK: Software Compartmentalization" systematizes 211 research efforts on the opposite direction from generation — taking one already-written system and splitting it into privilege-limited components after the fact, for containment rather than diversity. It doesn't touch AI generation or blockchain clients at all.

What it does share with the full-node/light-client/indexer split discussed above is the underlying shape of the problem: components that have to interoperate through a well-defined boundary while staying independently reasoned-about. A generated family of clients would need exactly that boundary discipline — compartmentalization's two decades of hard-won lessons on where such boundaries tend to leak are a reasonable place to start looking, even though nobody has yet connected that literature to component generation the way this open problem would need.

// the actual bottleneck NVP's fault-masking guarantee was never "N independently-written versions" — it was "N versions that fail on different inputs." Knight and Leveson showed human teams don't reliably deliver that. The current evidence on AI agents says the same thing, with a number attached: real fault reduction, well short of independence, worse for same-model ensembles, better for heterogeneous ones. That's the actual research frontier — not whether AI can write a client fast, which it demonstrably can.

07 Conclusions

Building a second blockchain client implementation used to require years and a dedicated team, and AI coding agents have genuinely collapsed that to weeks and a handful of engineers. Rustock, ETH2030, XVI/Guillotine, and SHiNode are real projects that really did that — checked against their own repositories.

What doesn't hold up as cleanly is the implicit conclusion that cheaper client-writing equals more client diversity in the sense that actually matters. N-Version Programming's fault-masking guarantee has needed an asterisk since Knight and Leveson's 1986 study, decades before an LLM ever wrote a line of Rust — and the best current evidence on AI-generated ensembles specifically, Ron's and Nogueira et al.'s 2026 results, says real fault reduction is achievable, full independence isn't, and same-model ensembles are the weakest version of the idea, not the strongest.

Rustock's own README says the quiet part out loud: a fast, working client is a genuine milestone, and "safe to run in production, alongside rskj, as a real second vote in the network's consensus" is a different one — not yet reached by any of the four.

None of that is an argument against trying. It's an argument for reading the case studies the way their own authors did: Javier Cid's own post warns the code he wrote "could fork the network without warning." Vitalik Buterin called ETH2030 an impressive experiment, not a production client, in the same sentence where he said so.

Client diversity generated by AI agents is a real and promising direction — the honest version of that claim includes the caveats the sources themselves already wrote down.

References

Primary Sources for the Case Studies
On N-Version Programming and Common-Mode Failure
On Client Diversity in Production
On Historical Client Bugs
On Component Boundaries (Adjacent, Not Directly Applicable)