1
0
mirror of https://github.com/bitcoin/bips.git synced 2025-05-12 12:03:29 +00:00

BIP8: allow some MUST_SIGNAL blocks to not signal

Using the same threshold for MUST_SIGNAL as STARTED means that any chain
that would have resulted in activation with lockinontimeout=false will
also result in activation with lockinontimeout=true (and vice-versa).
This reduces the ways in which a consensus split can occur, and avoids
a way in which miners could attempt to discourage users from setting
lockinontimeout=true.
This commit is contained in:
Anthony Towns 2020-10-17 18:18:27 +10:00
parent 9a119ce46a
commit afe97b2eee

View File

@ -83,7 +83,7 @@ Miners should continue setting the bit in LOCKED_IN phase so uptake is visible,
The new consensus rules for each soft fork are enforced for each block that has ACTIVE state. The new consensus rules for each soft fork are enforced for each block that has ACTIVE state.
During the MUST_SIGNAL phase, blocks that fail to signal are invalid. 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.
===State transitions=== ===State transitions===
@ -175,11 +175,23 @@ block, indexed by its parent.
===Mandatory signalling=== ===Mandatory signalling===
Blocks received while in the MUST_SIGNAL phase must be checked to ensure that they signal. For example: Blocks received while in the MUST_SIGNAL phase must be checked to ensure that they signal as required. For example:
if (GetStateForBlock(block) == MUST_SIGNAL) { if (GetStateForBlock(block) == MUST_SIGNAL) {
if ((block.nVersion & 0xE0000000) != 0x20000000 || ((block.nVersion >> bit) & 1) != 1) { int nonsignal = 0;
return state.Invalid(BlockValidationResult::RECENT_CONSENSUS_CHANGE, "bad-version-bip8-must-signal"); int count = 1 + (block.nHeight % 2016);
walk = block;
while (count > 0) {
--count;
if ((walk.nVersion & 0xE0000000) != 0x20000000 || ((walk.nVersion >> bit) & 1) != 1) {
++nonsignal;
if (nonsignal + threshold > 2016) {
return state.Invalid(BlockValidationResult::RECENT_CONSENSUS_CHANGE, "bad-version-bip8-must-signal");
}
} else if (nonsignal == 0) {
break;
}
walk = walk.parent;
} }
} }