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
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(bit0x40), 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/nSequencemeaning restored;OP_CLTV/OP_CSVrevert 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_RETURNrestored: 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_RETURNcarrying the protocol idcftx(a 4-byte ASCII pushdata).The message is
VERSION (1 byte) ‖ ORDERHASH (20 bytes) ‖ LOCATIONHINT, whereORDERHASHisRIPEMD160of the 256-bit confiscation-order hash.The
OP_RETURNpayload is ≤ 80 bytes and the whole output ≤ 83 bytes.New maturity rule: a confiscation output cannot be spent until
CONFISCATION_MATURITY = 1000blocks 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_CHRONICLEbit (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
