A history of pool failures, named.
Every pool incident in our public-source set, indexed by date. For each one — what went wrong, what layer of ReserveGrid OS would have caught it, and what reason code would have fired. The atlas argues nothing on its own; it lets the codes argue for themselves. If a row is unwired, it says "unwired." If a code didn't exist before v2.0, it says so.
VOL · 2026
BAD
BLOCKS
ON THE
RECORD.
Public incidents, public sources. Every one mapped to the reason code Veldra would emit, and the trust layer that would have caught it before it left the pool.
Half the network mines without validating · multiple miners lose >$50K.
After a soft-fork activation, several large pools continued building on a chain segment without fully validating it. SPV-mining: trust the previous block's header, mine on top, validate later. The chain segment turned out to contain an invalid block. Multiple pools combined lost more than $50,000 in subsidy and fees. The bitcoin.org alert at the time made the cost of skipping validation explicit.
- §01July 2015
- §02Half of network hashrate mining unvalidated headers
- §03>$50,000 combined direct loss · public estimate
- §04Bitcoin.org issued a network alert
SPV-mining has no v2_invariant_* code — the verifier can't observe a header it never receives. The structural answer is gateway behaviour: validate-then-forward holds regardless of what an upstream pool does, so a misconfigured proxy can't leak unvalidated work through a Veldra-fronted miner.
- [news]bitcoin.org · network alert (Jul 2015)
F2Pool ships two invalid blocks · custom sigops patch in production.
F2Pool deployed a custom Bitcoin Core patch that lowered the coinbase-reserved sigops budget. Two blocks at heights 783,426 and 784,121 were emitted with sigops accounting that disagreed with the network. Both were rejected. The patch was internal, the failure was external.
- §01Heights 783,426 · 784,121
- §02Custom patch reduced reserved sigops
- §03Coinbase sigops abnormal · sigops budget warning
- §04Public source: BitMEX Research, b10c
v2_invariant_sigops_mismatch fires on declared-vs-derived divergence; v2_invariant_sigops_exceed_max fires on the structural breach. Either rejects the template at the gateway.
- [blog]BitMEX Research · F2Pool sigops
- [blog]b10c · sigops budget anomaly
F2Pool censors 6 blocks of OFAC-sanctioned transactions.
Across November 2023, six F2Pool-mined blocks were missing transactions involving OFAC-sanctioned addresses that were otherwise accepted by the rest of the network. The censorship was opaque — no public policy, no public reason. Whether one agrees with the policy or not, structured filtering with named codes is more auditable than silent omission.
- §016 blocks · Nov 2023
- §02Sanctioned txs absent · accepted elsewhere
- §03No public policy disclosure at the time
- §04Public coverage: CoinDesk, TheMinerMag, b10c
Veldra does not enforce a censorship policy in either direction. It does insist that a filter that is applied is named — operators get an audit trail of which filter ran on which template.
- [news]CoinDesk · F2Pool OFAC filtering
- [news]TheMinerMag · censorship report
- [blog]b10c · F2Pool tx omissions
Antpool serves empty-block jobs for 30 seconds after every tip.
Antpool's job distribution emits empty templates for the first ~30 seconds after every new block, until a full template is available. Industry norm is <1% empty blocks; Antpool has held at ~2% across the year. Operationally legal; economically lossy.
- §01~30 seconds of empty jobs per new tip
- §02~2% empty block rate · vs <1% network norm
- §03Pattern stable across the year · not an outage
- §04Operator can opt out of the practice with policy
L1 emits template_tx_count_low_warning under default policy. Operators choosing to surface this as a verdict_warn_forward get a structured signal in their telemetry instead of an opaque pattern in the chain.
- [blog]b10c · empty block report
- [chain]mempool.space · empty block tracker
Antpool fleet emits 17 seconds of jobs with a stale coinbase value.
During a brief fork at heights 874,037 / 873,559 / 875,590, Antpool's job-distribution path served work whose coinbase value was cached against the prior tip. The cached path bypassed the policy that would have rejected a zero/stale coinbase. 17 seconds of hashrate was burned on jobs that could not have been valid.
- §01Heights 874,037 · 873,559 · 875,590
- §0217 seconds of stale-coinbase jobs distributed
- §03Cached coinbase values from the prior tip
- §04No block accepted on the bad templates
v2_invariant_coinbase_value_mismatch is computed from the raw coinbase outputs every template — there is no cached path the verifier consults. Stale coinbase fails the re-derivation comparator immediately.
- [blog]b10c · December 2024 coinbase fork notes
Foundry triggers a 2-block reorg at height 941,881.
A Foundry-mined block produced a chain segment that orphaned an AntPool block and a ViaBTC block. The reason code that fires today is weight_ratio_exceeded; the v2.0.0 invariant codes name the declared-vs-derived gap and the structural-exceed-max condition independently of the policy threshold.
- §01Height 941,881 · 2 confirmations rolled back
- §02AntPool block · ViaBTC block · both orphaned
- §03Reason code that fires today: weight_ratio_exceeded
- §04Found post-hoc by independent observers (b10c)
v2_invariant_template_weight_mismatch fires before the template is forwarded to the miner. No reorg, no orphan, no payout dispute.
- [blog]b10c · 2-block reorg analysis
- [chain]mempool.space · block 941881 history
F2Pool ships a half-empty block · 87 seconds after the prior tip.
Block 878,889 came in roughly 50% empty. Cause: the pool's block-maker node had been restarted without mempool.dat, so its mempool view was sparse. The block was valid; the operator simply earned half the fees they would have. A v3.x mempool-divergence detector would have flagged the gap before submission.
- §01Height 878,889 · ~50% template fill
- §0287 seconds after previous block
- §03Block-maker restarted without mempool.dat
- §04Block valid · fee revenue forgone
v2.0.0 Class M cross-references the template tx set against an independent mempool view. A 50% gap exceeds the default 4% tolerance by an order of magnitude · v2_invariant_mempool_tolerance_exceeded fires.
- [chain]mempool.space · mononautical thread
- [news]PANews · F2Pool half-empty block
This is what we built around.
Eight cases. Three loss classes. One pattern: a defect named in the bytes but unnamed by the surface that produced the work.
Veldra v2.0.0 names them. Twenty-two invariant codes wired in the same release. Phase 1.5 adds seven more after the production observation cycle.
Sources cited per incident. No claim is made that Veldra was deployed at any of these pools at the time. The argument is that the v2.0.0 reason-code surface is the surface that names these failures; that is testable against the historical record.
Read the architecture →