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

Formats

Parquet + CSV

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.


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.