Dataset · v1 · sealed 2026-07-29
The Scaling War
Bitcoin's governance history, read out of one 4-byte field.
Every block carries a version number. For six years, miners used it as a ballot — voting on Bitcoin XT, Bitcoin Classic, CSV, SegWit and Taproot. Then the machines took the field over and turned it into extra mining entropy.
This is that entire history, extracted block by block from genesis to tip, with each signal bounded to the era in which it actually meant something.
Free finding = full era-by-era story and controls. Paid file = full signalling series as Parquet + CSV.
Measured twice
Independent second pass and controls that must be able to fail.
Own node
Raw blocks parsed on our archival hardware — no rented API.
Bitcoin-anchored
Root hash committed on-chain via OpenTimestamps.
Verify free first
Title
…
generated_utc
…
Age
…
Root
…
Rows
…
Fetch
…
The free finding walks every era (XT, Classic, CSV, SegWit, Taproot, rolling) with controls and traps. The paid file is the full block-level and monthly series as queryable Parquet/CSV so you can cut your own slices.
Era bounds and version-bit series are already computed. Buy if you need the underlying rows, not another blog summary. Read free finding →
Preview · free sample
Schema and sample rows
Preview: first rows of the free sample (real sealed data, not mock). Full schemas for every table are also in manifest.json and below under Contents.
Columns · signal_blocks
| Column | Type |
|---|---|
proposal | VARCHAR |
height | BIGINT |
block_time | TIMESTAMP WITH TIME ZONE |
version | BIGINT |
era_rule | VARCHAR |
Sample rows
proposal | height | block_time | version | era_rule |
|---|---|---|---|---|
| BIP101_XT | 370434 | 2015-08-18 18:09:27+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 370661 | 2015-08-20 05:10:32+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 370817 | 2015-08-21 07:36:52+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 371185 | 2015-08-23 17:28:02+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 371372 | 2015-08-24 21:50:15+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 371456 | 2015-08-25 11:04:23+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 371482 | 2015-08-25 17:58:50+00 | 536870919 | exact version 0x20000007 |
| BIP101_XT | 371736 | 2015-08-27 09:42:19+00 | 536870919 | exact version 0x20000007 |
Download full free sample CSV → · Free kit · Full schema
Seal root (SHA-256): 6a9e8c9543e1aae312c561333b6a1ab206a018ba40b657e37d23027c67a2bd98
root.hash ·
root.hash.ots ·
manifest.json
Judge the seal before you pay. These files are free right now:
One-time purchase. Instant download, no account, no subscription.
Send exactly this amount to this address. It is derived fresh for your order, from our own wallet — no payment processor sits in between.
Amount
Address
Order — copy and keep this order id. It is the only record. Paste it under Recover if you close the tab. It re-derives your address and download link.
Watching the chain…
Everything needed to judge this dataset — manifest, samples, verifier, Bitcoin timestamp — is free below, right now.
Lost payment or closed the tab?
Bitcoin: your order id re-derives the invoice address and unlocks the download when the payment is seen. Paste it below (this browser) or keep the order id from the pay screen.
Card: checkout returns a success page with the download when payment completes. Use the same browser session if Stripe redirected you; there is no account email from us.
Free kit paths (always public):
/products/scaling-war/manifest.json ·
verify.py · root.hash · samples on this page.
Root-level /manifest.json is not used — see verify kits.
Why this isn't free data
The era bound is the product
A block's height and version are in every free chain dump on the internet. Extracting them is worth nothing. Knowing what they meant, and when, is the whole job.
Bit 28 is the clearest case. In 2016 it means "I vote for Bitcoin Classic." From 2018 the same bit is mining entropy, because BIP320's version-rolling mask covers bits 13 through 28. Ask the obvious question — how many blocks signalled Classic? — and the answer depends entirely on whether you knew that:
Era-bounded (correct)
2,176
Unbounded (wrong)
64,928
Error factor
29.8×
Thirty times wrong — and the wrong number looks completely reasonable. We know because our own first query returned it. Both figures ship in the manifest, side by side, so you can run them yourself and see exactly what the bound is worth.
Bits 0, 1 and 2 — CSV, SegWit and Taproot — sit outside the rolling mask and need no such restriction. Knowing which bits need bounding is the same job.
Check us before you pay
Free downloads
Sample rows
1,000 real rows of the era-bounded signal table, and the complete version-rolling-by-year series.
The manifest
Schemas, per-column digests, and every figure with the exact SQL behind it — including the deliberately wrong one.
The proof
Root hash and OpenTimestamps receipt, committing this dataset to the Bitcoin blockchain.
The verifier
Recomputes everything from the files alone, and re-runs every control against your own copy.
6a9e8c9543e1aae312c561333b6a1ab206a018ba40b657e37d23027c67a2bd98
Contents
What's in the box
| Table | Rows | Parquet | CSV | What it is |
|---|---|---|---|---|
| block_versions | 960,044 | 6.72 MB | 41.36 MB | The raw seam: height, time, version (signed and unsigned) |
| signal_blocks | 77,597 | 0.57 MB | 6.55 MB | Every era-bounded signalling block, per proposal |
| bip9_signalling_monthly | 211 | < 0.01 MB | 0.01 MB | Monthly signalling share per bit |
| version_rolling_by_year | 18 | < 0.01 MB | < 0.01 MB | Rolling share and distinct version count per year |
signal_blocks carries an era_rule column stating, in plain
text on every row, the exact rule that admitted it. The bounds are not buried in our
code — they travel with the data.
Schema
block_versions height BIGINT · block_time TIMESTAMP · version INTEGER
version_unsigned BIGINT
signal_blocks proposal VARCHAR · height BIGINT · block_time TIMESTAMP
version BIGINT · era_rule VARCHAR
bip9_signalling_monthly month · blocks · csv_bit0_pct · segwit_bit1_pct
taproot_bit2_pct (and companions)
version_rolling_by_year year INTEGER · blocks BIGINT · rolled_pct DOUBLE
distinct_versions BIGINT
Use version_unsigned for any bit masking. The version field is stored
signed, and the signed form silently inverts every high-bit test — a trap we ship
pre-sprung rather than let you find.
Quality
The controls this build had to pass
The export deletes its own output if any of these fail. All four run against the delivered files — not our internal database — so you can re-run every one of them:
- classic_bit28_absent_in_2015 — Bitcoin Classic did not exist in 2015, so its bit must be unset for the whole year. This is the control that proves the era bound does real work instead of being decoration.
- taproot_silent_before_deployment — April 2021, the month before signalling opened: zero of 4,073 blocks.
- versions_normalise_unsigned — if normalisation failed, every mask in the dataset would invert.
- seam_is_gapless — one row per block from genesis, no holes. A gapped seam under-counts every signal without ever looking wrong.
Honest limits
What this is not
- Signalling records stated intent, not identity. A set bit says a block template carried it, not who ran the miner.
- Pool attribution is not included in this dataset. Coinbase tags are self-reported and proxy pools blur them.
- It is a snapshot to block 960,043. The chain keeps moving.
- Era bounds are our judgement, stated explicitly in the
era_rulecolumn. Disagree with one, and you can re-derive the whole table fromblock_versionsunder your own rule.