For the complete documentation index, see llms.txt. This page is also available as Markdown.

Protocol Upgrade History

The consensus upgrade timeline — which validity rules apply at which height

This section records the consensus upgrades to the BSV protocol: the changes that altered which transactions or blocks are valid, and the block heights at which each took effect. It is the reference that lets a reader determine which rules apply at which point in the chain.

Only validity-affecting changes are listed. Upgrades that changed only default configuration (relay/mining policy) are noted where relevant but are not protocol changes — see the note on Quasar.

Ground truth. Activation heights are taken from chainparams.cpp in bitcoin-sv/bitcoin-sv (pinned to release v1.2.2, commit 879fc8b); the description of each change is taken from the consensus specifications in bitcoin-sv-specs/protocol updates/, cross-checked against the code.

The "UTXO height" rule

From Genesis onward, the rules applied to an input are those in force when the output it spends was confirmed — not the rules at the height of the spending transaction. So the era of a script is determined per input by the height of the UTXO being spent. Heights below are mainnet.

Timeline

Date
Upgrade
Mainnet height
Nature of change

2017-08-01

UAHF

fork by time (MTP)

Big blocks; mandatory SIGHASH_FORKID replay protection; EDA.

2017-11-13

Nov 2017

fork by time

LOW_S + NULLFAIL enforced; EDA → DAA.

2018-05

May 2018

fork by time

Re-enabled opcodes; canonical number encoding.

2018-11-15

Nov 2018

fork by time

Re-enabled more opcodes; op-count 201 → 500.

2019-07-24

Quasar

—

No consensus change (config only).

2020-02-04

Genesis

620,538

Large-scale rule reset (see below).

2022-11-11

Confiscation

by EnforceAtHeight

New confiscation-transaction class.

2026-04-07

Chronicle

943,816

OTDA restored; opcodes re-instated; malleability opt-outs.

UAHF (2017-08-01)

Source: updates/uahf-technical-spec.md. The fork that created BSV's lineage. Consensus changes:

  • Blocks larger than 1 MB become valid; for a block over 1 MB the maximum signature operations per block is 20000 × ceil(size / 1 MB) and the maximum transaction size is 1 MB.

  • Mandatory replay protection: signatures must set SIGHASH_FORKID (bit 0x40), and the fork id is mixed into a BIP143-adapted signature digest (see Sighash).

  • Mandatory STRICTENC (strict signature/pubkey encoding).

  • Emergency Difficulty Adjustment (EDA).

Nov 2017

Source: updates/nov-13-hardfork-spec.md. Enforce LOW_S (BIP146) and NULLFAIL; replace EDA with the current DAA (a 144-block-window retarget with a clamped timespan). See Blocks for the DAA.

May 2018

Sources: updates/may-2018-hardfork.md, updates/may-2018-reenabled-opcodes.md. Re-enabled OP_CAT, OP_SPLIT, OP_AND, OP_OR, OP_XOR, OP_DIV, OP_MOD, OP_NUM2BIN, OP_BIN2NUM; introduced canonical numeric encoding (little-endian, sign bit, ≤ 4 bytes, minimal). The block-size default rose to 32 MB — a configuration default, not a consensus rule.

Nov 2018

Sources: updates/2018-11-15 BCH Upgrade Spec.md, updates/2018-11-15 Re-enabling Old Opcodes.md, updates/2018-11-15 Increase Opcode Limit.md. Re-enabled OP_MUL, OP_INVERT, OP_LSHIFT, OP_RSHIFT; raised the operation-count limit from 201 to 500. The accepted/generated block-size defaults were configuration, not consensus.

Quasar (2019)

Source: updates/2019-07-24 Quasar Protocol Upgrade.md. Out of scope as a protocol change — it raised only default block-size configuration (generated and accepted defaults). It changed no consensus rule: no previously-valid block or transaction became invalid, and vice versa. Listed here only so the timeline is complete.

Genesis (2020-02-04)

Source: updates/genesis-spec.md. Mainnet height 620,538 (Testnet 1,344,302; STN 100; Regtest 10,000). The largest rule change, restoring much of the original protocol and removing many limits. Consensus changes include:

  • Block size becomes a configurable consensus cap (no fixed protocol maximum).

  • Removed the per-MB and per-transaction sigop limits.

  • Maximum transaction size raised to 1 GB.

  • Original nLockTime/nSequence meaning restored; OP_CLTV/OP_CSV revert to NOPs.

  • Formal script grammar introduced; unlocking scripts may contain only push data.

  • Numeric value length raised to 750,000 bytes; multisig pubkey count raised to 2³²−1 (UINT32_MAX).

  • Removed the max script element size, max stack element count, max script size, and max ops-per-script limits, replacing them with the stack-memory-usage consensus rule Σ(32 + element_size).

  • P2SH sunset: an output matching the P2SH template (OP_HASH160 <20 bytes> OP_EQUAL) makes the transaction invalid.

  • OP_RETURN restored: it terminates the script with validity taken from the top stack item.

  • Disabled OP_2MUL, OP_2DIV, OP_VERIF, OP_VERNOTIF.

The UTXO height rule (above) was introduced here: inputs are judged under the rules in force when the spent UTXO confirmed.

Confiscation Transactions (2022-11-11)

Source: updates/confiscation-transactions.md. Adds a new transaction class that skips script verification for whitelisted, consensus-frozen inputs. A confiscation transaction is valid only if it is txid-whitelisted and the height is at or beyond its EnforceAtHeight. Key points:

  • Identified by the first output being an OP_RETURN carrying the protocol id cftx (a 4-byte ASCII pushdata).

  • The message is VERSION (1 byte) ‖ ORDERHASH (20 bytes) ‖ LOCATIONHINT, where ORDERHASH is RIPEMD160 of the 256-bit confiscation-order hash.

  • The OP_RETURN payload is ≤ 80 bytes and the whole output ≤ 83 bytes.

  • New maturity rule: a confiscation output cannot be spent until CONFISCATION_MATURITY = 1000 blocks have passed (see Consensus Rules).

  • Consensus-frozen outputs invalidate blocks/transactions that spend them; the whitelist overrides this for valid confiscation transactions.

(The associated RPCs, configuration flags, and mempool/reorg mechanics are implementation, not protocol, and are out of scope.)

Chronicle (2026-04-07)

Source: updates/chronicle-spec.md. Mainnet height 943,816 (Testnet 1,713,168; Regtest 15,000). Consensus changes:

  • Restores the Original Transaction Digest Algorithm (OTDA) alongside BIP143, selected per signature via the SIGHASH_CHRONICLE bit (0x20) and mixable across inputs (see Sighash).

  • Raises the maximum script number length from 750,000 bytes to 32 MB.

  • For transactions with version > 1, removes selective malleability restrictions — minimal encoding, LOW_S, NULLFAIL/NULLDUMMY, MINIMALIF, clean-stack, and the Genesis data-only-in-unlocking-script rule (functional opcodes are again allowed in unlocking scripts). See Script.

  • Re-instates the opcodes OP_VER (0x62), OP_VERIF (0x65), OP_VERNOTIF (0x66), OP_SUBSTR (0xb3), OP_LEFT (0xb4), OP_RIGHT (0xb5), OP_2MUL (0x8d), OP_2DIV (0x8e), OP_LSHIFTNUM (0xb6), OP_RSHIFTNUM (0xb7) — see Opcodes.

Last updated