mirror of
				https://github.com/bitcoin/bips.git
				synced 2025-11-03 14:19:40 +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:
		
							parent
							
								
									9a119ce46a
								
							
						
					
					
						commit
						afe97b2eee
					
				@ -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.
 | 
			
		||||
 | 
			
		||||
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===
 | 
			
		||||
 | 
			
		||||
@ -175,11 +175,23 @@ block, indexed by its parent.
 | 
			
		||||
 | 
			
		||||
===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 ((block.nVersion & 0xE0000000) != 0x20000000 || ((block.nVersion >> bit) & 1) != 1) {
 | 
			
		||||
            return state.Invalid(BlockValidationResult::RECENT_CONSENSUS_CHANGE, "bad-version-bip8-must-signal");
 | 
			
		||||
        int nonsignal = 0;
 | 
			
		||||
        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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user