Skip to content
BIP ATLAS

BIPs 0009 · 0008

How does a soft fork switch on?

Miners mark blocks with a bit; nodes count the marks in fixed windows of 2,016 blocks. A count crossing a threshold locks a change in, and only a period later do its rules apply.

A soft fork tightens the rules in a backward-compatible way. Once it is active, blocks that older software would accept can be rejected, so everyone needs to know from which block the new rules apply. BIP 9, assigned in 2015 and recorded as deployed, is the mechanism that told them for the csv and segwit soft forks. BIP 8, assigned in 2017 and now recorded as complete, is an alternative that counts in block heights and can force the outcome.1234

Both read the same field: the version number at the top of every block header. BIP 9 stops treating it as a number and reads it as a row of bits, each of which can track one proposed change, so several deployments can run at the same time.4

Source revision
bitcoin/bips @ 3a10b5b
Source checked
1 October 2026
Review state
Draft — independent technical review applied; awaiting human sign-off
Source details

This chapter is an independent explanation, not the proposals themselves. Preamble fields are shown as recorded in the pinned files, with author e-mail addresses omitted. Status is the proposal’s own field, not an endorsement or a sign of consensus.

BIP 9: Version bits with timeout and delay

BIP
9
Title
Version bits with timeout and delay
Authors
Pieter Wuille
Peter Todd
Greg Maxwell
Rusty Russell
Status
Deployed
Type
Informational
Assigned
2015-10-04
License
PD

Pinned source · Reader view on bips.dev
SHA-256 0ffa7b1ad84e1f32c7499d8a8756721c737037cbc91c825d05d11640ed5fedda
Git blob ca6db79568ff6787a977c269c01429ee3bac0743

BIP 8: Version bits with lock-in by height

BIP
8
Title
Version bits with lock-in by height
Authors
Shaolin Fry
Luke Dashjr
Status
Complete
Type
Informational
Assigned
2017-02-01
License
BSD-3-Clause OR CC0-1.0
Version
1.0.0

Pinned source · Reader view on bips.dev
SHA-256 e86abe98ea522c919377db46206fac2bbb34c007c67ddbb2f92bcab9d2d617a2
Git blob 91379f039894fe16182c66de588565f3bad678ed

FIG. A11.1 One bit per deployment
  • Bits 31–29 = 001. Any other top bits and the block signals nothing, whatever its lower bits say.
  • Bit 0: csv. A block signalling only for it has version 0x20000001.
  • Bit 1: segwit. A block signalling only for it has version 0x20000002.
  • Both at once: 0x20000003. Signalling versions run from 0x20000000 to 0x3fffffff.

Bits from BIP 9’s assignment table; versions computed by the tested version-bits model.

A block version as BIP 9 reads it: the top three bits must be 001; the other 29 are free for deployments. csv used bit 0 and segwit bit 1.256

Why bits

Before BIP 9, soft forks were signalled by raising the version number. BIP 9’s authors list the problems with that: only one change could be rolled out at once, a proposal could never be rejected for good, and every upgrade permanently ruled out some version values.7

Reading the field as bits fixes all three. A signalling block must have 001 as its top three bits, which gives versions from 0x20000000 to 0x3FFFFFFF; a block whose top bits are anything else counts as signalling nothing. That leaves 29 bits for deployments, and two other top-bit patterns for future mechanisms.56

Each deployment names its bit, from 0 to 28, a starttime and a timeout. BIP 9 suggests a start about a month after a release that includes the change, and a timeout one year later. The timeout is what lets a bit be reused: in the authors’ words, a new use of a bit then clearly refers to a new BIP.8910

Reuse is allowed but not encouraged. A later deployment may take a bit once the previous one has timed out or activated, and BIP 9 recommends a pause in between. The authors give that fallow period two jobs: it helps detect buggy software still acting on the old meaning, and it leaves time for warnings and upgrades after a soft fork succeeds.11

Five states, counted in periods

Every deployment is in one of five states: DEFINED, STARTED, LOCKED_IN, ACTIVE or FAILED. States change only at the boundaries of 2,016-block retarget periods, and every block in a period shares one. A block’s state never depends on its own version, only on its ancestors.1213

The clock is not the wall clock. BIP 9 compares starttime and timeout with the median time past of the block before each period begins, a value the chain itself makes monotonic. Once that reaches starttime, the deployment is STARTED and the bit means something.814

At each boundary in STARTED, nodes count how many of the previous 2,016 blocks set the bit. At least 1,916 of them, 95 percent, moves the deployment to LOCKED_IN; on testnet the threshold was 1,512. If the timeout has passed, the deployment fails instead, and that check comes first.15

The order matters because bits are shared over time. If counting came first, the authors explain, two deployments on the same bit could collide: an old one locking in while a new one starts, both demanding that miners set the bit. Checking the timeout first rules that out.1516

FIG. A11.2 From signalling to rules Interactive

A · Interactive

Static view: a hypothetical csv run in which period 10 reaches the threshold, played to the end. With JavaScript you can choose a deployment, step through the periods and set which periods reach the threshold.

Schematic run · hypothetical signalling counts · rules from the tested model

  1. DEFINED
  2. STARTED
  3. LOCKED_IN
  4. ACTIVE
  5. FAILED
0DEF1STA<2STA<3STA<4STA<5STA<6STA<7STA<8STA<9STA<10STA≥11LCK12ACT13ACT14ACT15ACT16ACT17ACT18ACT19ACT20ACT21ACT22ACT23ACT24ACT25ACT26ACT27ACT28ACT29ACT

DEF DEFINED · STA STARTED · LCK LOCKED_IN · ACT ACTIVE · FLD FAILED · ≥ / < reaches / misses the threshold

window opens: period 1timeout passes: period 27

Period 29 · blocks 58,464–60,479 of this run · ACTIVE

Decided at the period’s first block: ACTIVE is terminal.

The new rules are enforced in this period’s blocks.

What actually happened (mainnet, as BIP 9’s table records it): csv on bit 0, active since block 419,328. By the rules above, that means LOCKED_IN from block 417,312, after blocks 415,296–417,311 included at least 1,916 signalling blocks.

Schematic clock: the window is drawn as 26 periods, the span BIP 8 equates with about a year (52,416 blocks); for BIP 9 deployments the median time past is placed linearly between starttime and timeout. Each period either reaches the threshold (1,916) or falls one short (1,915). Real per-period counts are not in the pinned sources.

B · Worked example

The csv deployment on mainnet, as BIP 9’s assignment table records it, read backwards from its activation height with BIP 9’s rules.

12345
  1. The deployment's parameters: bit 0, a start, a timeout, a threshold

    starttime
    2016-05-01 00:00:00 UTC = 1462060800
    timeout
    2017-05-01 00:00:00 UTC = 1493596800
    threshold
    1,916 of 2016 blocks
  2. Once the median time past reaches starttime, a block signals by setting bit 0

    signalling version
    0x20000001

    Top bits 001 and the deployment bit set. Signalling changes no rule by itself.

  3. Blocks 415,296–417,311: at least 1,916 of the period's 2016 signal

    period
    206 (heights ÷ 2016)

    Inferred: the table records only the activation height, and BIP 9's rules put the successful count two periods before it.

  4. From block 417,312: LOCKED_IN for one period

    state
    LOCKED_IN — nothing counted, rules not yet enforced
  5. From block 419,328: ACTIVE

    recorded
    active since #419328

    From this block on, the rules of BIPs 68, 112, 113 are enforced.

Source: BIP 9 assignments, line 18; dates cross-checked against the deployment section of BIP 68. Implied periods computed by the tested model.

The tested state machine over a schematic run of periods. Choose a deployment, mark which periods reach the threshold, and step through the boundaries.1215171819

Then nothing is counted for one period. LOCKED_IN lasts exactly one period, after which the deployment becomes ACTIVE automatically, and only ACTIVE blocks enforce the new rules. Miners are asked to keep setting the bit while locked in, so that uptake stays visible, but that has no effect on the rules.1720

Nodes that have not upgraded still notice. BIP 9 has software track unexpected bits as an unknown upgrade, and says it should warn loudly when one locks in.21

What the table records

BIP 9 keeps a small table of deployments. It records csv, the bundle of BIPs 68, 112 and 113, on bit 0 with a mainnet window from 1 May 2016 to 1 May 2017, and segwit on bit 1 from 15 November 2016 to 15 November 2017. The dates match the Unix times written in the deployment sections of BIP 68 and BIP 141, and this site’s build fails if they ever disagree.222

FIG. A11.3 Reading back from an activation height

csv · bit 0 · BIPs 68, 112, 113

csv: start, timeout, recorded activation and implied lock-in
NetworkStart (MTP)TimeoutRecordedImplied by BIP 9’s rules
mainnet2016-05-011,462,060,8002017-05-011,493,596,800block 419,328period 208LOCKED_IN from 417,312blocks 415,296–417,311 reached 1,916
testnet2016-03-011,456,790,4002017-05-011,493,596,800block 770,112period 382LOCKED_IN from 768,096blocks 766,080–768,095 reached 1,512

segwit · bit 1 · BIPs 141, 143, 147

segwit: start, timeout, recorded activation and implied lock-in
NetworkStart (MTP)TimeoutRecordedImplied by BIP 9’s rules
mainnet2016-11-151,479,168,0002017-11-151,510,704,000block 481,824period 239LOCKED_IN from 479,808blocks 477,792–479,807 reached 1,916
testnet2016-05-011,462,060,8002017-05-011,493,596,800block 834,624period 414LOCKED_IN from 832,608blocks 830,592–832,607 reached 1,512

Dates and states from BIP 9’s assignment table (lines 18, 28); start and timeout cross-checked at build time against the Unix times in each BIP’s own deployment section. The last column is inferred from the activation height by the tested model.

The two deployments in BIP 9’s table, with the lock-in period their recorded activation heights imply.22223

The table records only where each deployment became active: block 419,328 for csv and 481,824 for segwit, both multiples of 2,016. The rules let us read backwards. csv must have been LOCKED_IN from block 417,312, which means blocks 415,296 to 417,311 included at least 1,916 that signalled; segwit was LOCKED_IN from 479,808.151723

Those dates are history, not a schedule. A deployment’s parameters describe one attempt at one time; the table’s states say how each attempt ended.224

Heights and a forced ending

BIP 8 sets out to correct what its authors call perceived mistakes in BIP 9. Among them: a near-unanimous hashrate threshold lets a small minority of non-signalling miners veto a change, and timestamps meant a sudden loss of hashrate could interfere with a late activation. Block times are unreliable, and triggering at the first retarget after a date is non-intuitive. Heights, they argue, are more reliable, since each block adds exactly one.25

So a BIP 8 deployment counts in heights: startheight and timeoutheight, both on retarget boundaries and at least 4,032 blocks apart. Its suggested threshold is lower, 1,815 blocks or 90 percent, and its suggested window is probably at least a year, 52,416 blocks. A minimum activation height can hold a locked-in deployment back so that nodes have time to upgrade; set to 0, LOCKED_IN lasts one period, as in BIP 9.262728

The new part is lockinontimeout. Without it, a deployment that never reaches the threshold fails at the timeout. With it, the last period before the timeout becomes MUST_SIGNAL: once 2,016 minus the threshold blocks in it have failed to signal, any further block that fails to signal is invalid, and the deployment locks in regardless.1819

BIP 8 is candid about the cost. Nodes that set lockinontimeout may follow a lower-work chain than nodes that do not, for an extended period, and may need to connect preferentially to each other to avoid a split. The BIP suggests the flag for soft forks facing political opposition from a non-negligible share of miners.2729

One distinction runs through both proposals. Signalling counts blocks, which measures mining; it does not show that users or their nodes have adopted the rules. BIP 8’s motivation draws the same line: hash-power activation enforces new rules in lieu of full nodes upgrading, while all consensus rules are ultimately enforced by full nodes.30

BIP 8’s own history is in its changelog: rejected after a three-year timeout in 2020, revised with MUST_SIGNAL and a minimum activation height, and advanced to complete in 2026. Its pinned assignments file lists no deployments.2431

Evidence

Each numbered marker in the text points here, and the ↩ links lead back to every place that cites an entry. Quotes are verbatim from the BIP files at commit 3a10b5b, including their wiki markup; links open the exact lines; the quoted text sits under each entry. Labels say what kind of statement each is: a rule, the author’s rationale, history, a test vector, or our own inference.

  1. ↩ History BIP 9 (Wuille, Todd, Maxwell, Russell) was assigned in 2015 and is recorded as Deployed; BIP 8 (Fry, Dashjr) was assigned in 2017 and is recorded as Complete. Both are Informational.

    Quoted source text (2)

    Title: Version bits with timeout and delay Authors: Pieter Wuille <pieter.wuille@gmail.com> Peter Todd <pete@petertodd.org> Greg Maxwell <greg@xiph.org> Rusty Russell <rusty@rustcorp.com.au> Status: Deployed Type: Informational Assigned: 2015-10-04

    BIP 9, lines 3–10

    Title: Version bits with lock-in by height Authors: Shaolin Fry <shaolinfry@protonmail.ch> Luke Dashjr <luke+bip@dashjr.org> Status: Complete Type: Informational Assigned: 2017-02-01

    BIP 8, lines 3–8
  2. ↩ a b c d e History BIP 9's assignment table records csv (bit 0; mainnet 1 May 2016 to 1 May 2017; active since block 419,328) and segwit (bit 1; mainnet 15 November 2016 to 15 November 2017; active since block 481,824).

    Quoted source text (2)

    | csv | 0 | 2016-05-01 00:00:00 | 2017-05-01 00:00:00 | active since #419328

    BIP 9 (assignments.mediawiki), lines 18–22

    | segwit | 1 | 2016-11-15 00:00:00 | 2017-11-15 00:00:00 | active since #481824

    BIP 9 (assignments.mediawiki), lines 28–32
  3. ↩ Rule BIP 8 is an alternative to BIP 9 that uses block heights instead of timestamps for start and timeout, and adds a parameter that can guarantee activation.

    Quoted source text (1)

    This document specifies an alternative to [[bip-0009.mediawiki|BIP9]] that corrects for a number of perceived mistakes. Block heights are used for start and timeout rather than POSIX timestamps. It additionally introduces an activation parameter that can guarantee activation of backward-compatible changes

    BIP 8, lines 15–17
  4. ↩ a b Rule BIP 9 reads the block version field as a bit vector, so several backward-compatible changes (soft forks) can be deployed in parallel, each tracked on its own bit; BIP 8 reads the field the same way.

    Quoted source text (2)

    allowing multiple backward-compatible changes (further called "soft forks") to be deployed in parallel. It relies on interpreting the version field as a bit vector, where each bit can be used to track an independent change.

    BIP 9, line 16

    The nVersion block header field is to be interpreted as a 32-bit little-endian integer (as present), and bits are selected within this integer as values (1 << N) where N is the bit number.

    BIP 8, lines 73–76
  5. ↩ a b Rule A signalling block's top three version bits must be 001, giving versions 0x20000000 to 0x3FFFFFFF; a version without those top bits counts as signalling nothing.

    Quoted source text (2)

    The top 3 bits of such blocks must be 001, so the range of actually possible nVersion values is [0x20000000...0x3FFFFFFF], inclusive.

    BIP 9, lines 59–60

    When a block nVersion does not have top bits 001, it is treated as if all bits are 0 for the purposes of deployments.

    BIP 9, lines 65–66
  6. ↩ a b Author’s rationale Restricting the top bits to 001 leaves 29 deployment bits and keeps top bits 010 and 011 for two future mechanisms.

    Quoted source text (1)

    By restricting the top 3 bits to 001 we get 29 out of those for the purposes of this proposal, and support two future upgrades for different mechanisms (top bits 010 and 011).

    BIP 9, lines 63–64
  7. ↩ Author’s rationale BIP 9's motivation: BIP 34's integer version comparison allowed only one change at a time, could not reject a proposal permanently, and every upgrade permanently removed version values.

    Quoted source text (2)

    As it relies on comparing version numbers as integers however, it only supports one single change being rolled out at once, requiring coordination between proposals, and does not allow for permanent rejection

    BIP 9, line 20

    every upgrade permanently restricts the set of allowed nVersion field values.

    BIP 9, line 22
  8. ↩ a b Rule A BIP 9 deployment has a name, a bit from 0 to 28, a starttime (a minimum median time past) and a timeout after which it is considered failed if not locked in.

    Quoted source text (1)

    It is chosen from the set {0,1,2,...,28}. # The '''starttime''' specifies a minimum median time past of a block at which the bit gains its meaning. # The '''timeout''' specifies a time at which the deployment is considered failed.

    BIP 9, lines 29–31
  9. ↩ Author’s rationale BIP 9 suggests a starttime about a month after a release including the soft fork, and a timeout one year (31,536,000 seconds) later.

    Quoted source text (2)

    '''starttime''' should be set to some date in the future, approximately one month after a software release date including the soft fork.

    BIP 9, lines 39–40

    '''timeout''' should be 1 year (31536000 seconds) after starttime.

    BIP 9, line 40
  10. ↩ Author’s rationale The authors give the timeout as a way to reuse bits even when a soft fork never activates, so a new use of a bit clearly refers to a new BIP.

    Quoted source text (1)

    The failure timeout allows eventual reuse of bits even if a soft fork was never activated, so it's clear that the new use of the bit refers to a new BIP.

    BIP 9, lines 216–218
  11. ↩ Author’s rationale A later deployment may reuse a bit once the previous one has timed out or activated, though BIP 9 discourages it until necessary and recommends a pause; the authors say the fallow period after an attempt helps detect buggy clients and leaves time for warnings and upgrades.

    Quoted source text (2)

    A later deployment using the same bit is possible as long as the starttime is after the previous one's timeout or activation, but it is discouraged until necessary, and even then recommended to have a pause in between to detect buggy software.

    BIP 9, lines 42–43

    The fallow period at the conclusion of a soft fork attempt allows some detection of buggy clients, and allows time for warnings and software upgrades for successful soft forks.

    BIP 9, lines 222–224
  12. ↩ a b c Rule The states are DEFINED, STARTED, LOCKED_IN (for one period after a period in which at least threshold blocks set the bit), ACTIVE and FAILED.

    Quoted source text (2)

    '''DEFINED''' is the first state that each soft fork starts out as.

    BIP 9, lines 49–53

    '''LOCKED_IN''' for one retarget period after the first retarget period with STARTED blocks of which at least threshold have the associated bit set in nVersion. # '''ACTIVE''' for all blocks after the LOCKED_IN retarget period. # '''FAILED''' for one retarget period past the timeout time, if LOCKED_IN was not reached.

    BIP 9, lines 51–53
  13. ↩ Rule All blocks in one 2016-block retarget period have the same state, and a block's state never depends on its own version, only on its ancestors'.

    Quoted source text (2)

    All blocks within a retarget period have the same state.

    BIP 9, lines 86–88

    Note that a block's state never depends on its own nVersion; only on that of its ancestors.

    BIP 9, line 118
  14. ↩ Rule BIP 9's clock is the median time past of the period's first block's parent, treated as a monotonic clock defined by the chain.

    Quoted source text (1)

    The expression GetMedianTimePast(block.parent) is referred to as MTP in the diagram above, and is treated as a monotonic clock defined by the chain.

    BIP 9, lines 98–100
  15. ↩ a b c d Rule BIP 9's lock-in threshold is at least 1,916 of a period's 2,016 blocks (95%), or 1,512 (75%) on testnet; failure takes precedence over counting.

    Quoted source text (1)

    The threshold is ≥1916 blocks (95% of 2016), or ≥1512 for testnet (75% of 2016). The transition to FAILED takes precedence, as otherwise an ambiguity can arise.

    BIP 9, lines 113–114
  16. ↩ Author’s rationale The authors explain why failure takes precedence: otherwise two non-overlapping deployments on the same bit could both demand the bit, one locking in while the other starts.

    Quoted source text (1)

    The transition to FAILED takes precedence, as otherwise an ambiguity can arise. There could be two non-overlapping deployments on the same bit, where the first one transitions to LOCKED_IN while the other one simultaneously transitions to STARTED, which would mean both would demand setting the bit.

    BIP 9, lines 114–116
  17. ↩ a b c d Rule After one period of LOCKED_IN the deployment becomes ACTIVE automatically; ACTIVE and FAILED are terminal.

    Quoted source text (2)

    After a retarget period of LOCKED_IN, we automatically transition to ACTIVE.

    BIP 9, line 137

    And ACTIVE and FAILED are terminal states, which a deployment stays in once they're reached.

    BIP 9, line 142
  18. ↩ a b c Rule With lockinontimeout set, the last period before the timeout is MUST_SIGNAL: once 2,016 minus threshold blocks in it have failed to signal, further non-signalling blocks are invalid, and LOCKED_IN follows.

    Quoted source text (3)

    '''MUST_SIGNAL''' for one retarget period prior to the timeout, if LOCKED_IN was not reached and '''lockinontimeout''' is true.

    BIP 8, line 66

    During the MUST_SIGNAL phase, if '''(2016 - threshold)''' blocks in the retarget period have already failed to signal, any further blocks that fail to signal are invalid.

    BIP 8, line 90

    If we have finished a period of MUST_SIGNAL, we transition directly to LOCKED_IN.

    BIP 8, line 152
  19. ↩ a b Rule Without lockinontimeout, a deployment that has not reached the threshold fails at the timeout height; the count is checked first. (BIP 8's state diagram labels lock-in "height < timeoutheight AND threshold reached"; this site follows the pseudocode, which counts first, so a threshold-reaching period can still lock in at the timeout height, consistent with the parameter text's "excluding this block's bit state".)

    Quoted source text (3)

    If the threshold hasn't been met and we reach the timeout, we transition directly to FAILED.

    BIP 8, line 130

    if (count >= threshold) { return LOCKED_IN; } else if (lockinontimeout && block.height + 2016 >= timeoutheight) { return MUST_SIGNAL; } else if (block.height >= timeoutheight) { return FAILED; }

    BIP 8, lines 143–149

    Once this height has been reached, if the soft fork has not yet locked in (excluding this block's bit state), the deployment is considered failed on all descendants of the block.

    BIP 8, line 38
  20. ↩ a b Rule Miners should keep setting the bit in LOCKED_IN so uptake stays visible, but this has no effect on consensus rules; the new rules are enforced only in ACTIVE blocks.

    Quoted source text (2)

    Miners should continue setting the bit in LOCKED_IN phase so uptake is visible, though this has no effect on consensus rules.

    BIP 9, lines 68–69

    The new consensus rules for each soft fork are enforced for each block that has ACTIVE state.

    BIP 9, line 73
  21. ↩ Rule BIP 9 has software track unexpected version bits as an extra unknown upgrade, and says it should warn loudly when one locks in.

    Quoted source text (1)

    To support upgrade warnings, an extra "unknown upgrade" is tracked, using the "implicit bit" mask = (block.nVersion & ~expectedVersion) != 0. Mask will be non-zero whenever an unexpected bit is set in nVersion. Whenever LOCKED_IN for the unknown upgrade is detected, the software should warn loudly about the upcoming soft fork.

    BIP 9, line 163
  22. ↩ a b History Those dates match the Unix times in the deployment sections of BIP 68 and BIP 141.

    Quoted source text (2)

    midnight 1st May 2016 UTC (Epoch timestamp 1462060800) and BIP9 '''timeout''' will be midnight 1st May 2017 UTC (Epoch timestamp 1493596800)

    BIP 68, line 226

    midnight 15 November 2016 UTC (Epoch timestamp 1479168000) and BIP9 timeout will be midnight 15 November 2017 UTC (Epoch timestamp 1510704000)

    BIP 141, line 308
  23. ↩ a b Test vector Read with BIP 9's rules, csv's activation at block 419,328 means LOCKED_IN from block 417,312 and a threshold-reaching count in blocks 415,296 to 417,311; segwit's at 481,824 means LOCKED_IN from 479,808. Each recorded activation height is a multiple of 2,016.

    Quoted source text (2)

    active since #419328

    BIP 9 (assignments.mediawiki), line 22

    active since #481824

    BIP 9 (assignments.mediawiki), line 32
  24. ↩ a b History BIP 8's changelog records it moving to Rejected after a three-year timeout in 2020, being revised (MUST_SIGNAL, a minimum_activation_height parameter, a 90% recommendation), and advancing to Complete in 2026.

    Quoted source text (5)

    * '''1.0.0''' (2026-08-03): ** Advance to Complete.

    BIP 8, lines 280–281

    ** Reduce recommended threshold from 95% to 90%.

    BIP 8, line 284

    ** Replace FAILING state with MUST_SIGNAL phase.

    BIP 8, line 293

    ** Add minimum_activation_height parameter.

    BIP 8, line 300

    * '''0.0.2''' (2020-02-26): ** Move to Rejected due to 3-year time-out.

    BIP 8, lines 304–305
  25. ↩ Author’s rationale BIP 8 sets out to correct what its authors call perceived mistakes in BIP 9: a near-unanimous hashrate requirement that lets a small minority veto, timestamps that let a sudden hashrate loss interfere with a late activation, unreliable block times, and a non-intuitive trigger at the first retarget after a given time.

    Quoted source text (5)

    This document specifies an alternative to [[bip-0009.mediawiki|BIP9]] that corrects for a number of perceived mistakes.

    BIP 8, line 15

    Activation is dependent on near unanimous hashrate signalling which may be impractical and result in veto by a small minority of non-signalling hashrate.

    BIP 8, line 23

    Due to using timestamps rather than block heights, it was found to be a risk that a sudden loss of significant hashrate could interfere with a late activation.

    BIP 8, line 25

    Since each new block must increase the height by one, thresholds based on block height are much more reliable and intuitive and can be calculated exactly for difficulty retarget.

    BIP 8, line 27

    Block time is somewhat unreliable and may be intentionally or unintentionally inaccurate, so thresholds based on block time are not ideal. Secondly, BIP9 specified triggers based on the first retarget after a given time, which is non-intuitive.

    BIP 8, line 27
  26. ↩ Rule A BIP 8 deployment adds startheight, timeoutheight, a threshold, minimum_activation_height and the lockinontimeout flag, with heights on retarget boundaries and the timeout at least 4,032 blocks after the start.

    Quoted source text (3)

    The '''startheight''' specifies the height of the first block at which the bit gains its meaning.

    BIP 8, lines 37–41

    The '''lockinontimeout''' boolean if set to true, blocks are required to signal in the final period, ensuring the soft fork has locked in by timeoutheight.

    BIP 8, line 41

    '''startheight''', '''timeoutheight''', and '''minimum_activation_height''' must be an exact multiple of 2016 (ie, at a retarget boundary), and '''timeoutheight''' must be at least 4032 blocks (2 retarget intervals) after '''startheight'''.

    BIP 8, line 58
  27. ↩ a b Author’s rationale BIP 8 suggests a threshold of 1,815 blocks (90%), a timeout of probably at least a year or 52,416 blocks after the start, and lockinontimeout true for a soft fork facing political opposition from a non-negligible share of miners.

    Quoted source text (2)

    probably at least 1 year, or 52416 blocks (26 retarget intervals) after '''startheight'''. # '''threshold''' should be 1815 blocks (90% of 2016), or 1512 (75%) for testnet.

    BIP 8, lines 50–51

    '''lockinontimeout''' should be set to true for any softfork that is expected or found to have political opposition from a non-negligible percent of miners.

    BIP 8, line 53
  28. ↩ Rule minimum_activation_height lets LOCKED_IN last longer so nodes can upgrade; setting it to 0 keeps LOCKED_IN to a single period.

    Quoted source text (2)

    This allows more time to be spent in the LOCKED_IN state so that nodes can upgrade. This may be set to 0 to have the LOCKED_IN state be a single retarget period.

    BIP 8, line 52

    Regardless of the value of '''lockinontimeout''', if LOCKED_IN is reached, ACTIVE will be reached either one retarget period later, or at '''minimum_activation_height''', whichever comes later.

    BIP 8, line 97
  29. ↩ Rule BIP 8 warns that nodes with lockinontimeout set may follow a lower-work chain than nodes without it for an extended period, and may need to connect preferentially to each other.

    Quoted source text (1)

    Implementations with ''lockinontimeout'' set to true may potentially follow a lower work chain than nodes with ''lockinontimeout'' set to false for an extended period. In order for this not to result in a net split nodes with ''lockinontimeout'' set to true, those nodes may need to preferentially connect to each other.

    BIP 8, line 209
  30. ↩ Test vector BIP 8's pinned assignments file has a heading and a note but no deployment rows (this site's parser finds none).

    Quoted source text (1)

    ==Deployments== List of deployments. State can be defined, active, failed. Dates are in UTC.

    BIP 8 (assignments.mediawiki), lines 1–5