PARALLAX

Home/Datasets/Scaling War

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.

Price

$19

Tables

4

Rows

1,037,870

Download

14.6 MB

In 10 seconds · free vs paid

Free finding = full era-by-era story and controls. Paid file = full signalling series as Parquet + CSV.

Schema + sample rows Free kit Buy Free finding

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.

Live seal metadata (from free manifest)

Title

generated_utc

Age

Root

Rows

Fetch

Free finding vs paid file

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 →

Parquet CSV SHA-256 root OTS 14.6 MB zip $19 · 16,000 sats

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

ColumnType
proposalVARCHAR
heightBIGINT
block_timeTIMESTAMP WITH TIME ZONE
versionBIGINT
era_ruleVARCHAR

Sample rows

proposalheightblock_timeversionera_rule
BIP101_XT3704342015-08-18 18:09:27+00536870919exact version 0x20000007
BIP101_XT3706612015-08-20 05:10:32+00536870919exact version 0x20000007
BIP101_XT3708172015-08-21 07:36:52+00536870919exact version 0x20000007
BIP101_XT3711852015-08-23 17:28:02+00536870919exact version 0x20000007
BIP101_XT3713722015-08-24 21:50:15+00536870919exact version 0x20000007
BIP101_XT3714562015-08-25 11:04:23+00536870919exact version 0x20000007
BIP101_XT3714822015-08-25 17:58:50+00536870919exact version 0x20000007
BIP101_XT3717362015-08-27 09:42:19+00536870919exact version 0x20000007

Download full free sample CSV → · Free kit · Full schema

Seal root (SHA-256): 6a9e8c9543e1aae312c561333b6a1ab206a018ba40b657e37d23027c67a2bd98
root.hash · root.hash.ots · manifest.json

Buy this dataset

One-time purchase. Instant download, no account, no subscription.

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

Four tables, delivered as both Parquet (ZSTD) and CSV.
TableRowsParquetCSVWhat it is
block_versions960,0446.72 MB41.36 MBThe raw seam: height, time, version (signed and unsigned)
signal_blocks77,5970.57 MB6.55 MBEvery era-bounded signalling block, per proposal
bip9_signalling_monthly211< 0.01 MB0.01 MBMonthly signalling share per bit
version_rolling_by_year18< 0.01 MB< 0.01 MBRolling 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_rule column. Disagree with one, and you can re-derive the whole table from block_versions under your own rule.