@ -1,4 +1,4 @@
// Copyright (c) 2014-2015 The Bitcoin Core developers
// Copyright (c) 2014-2016 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -30,6 +30,7 @@ public:
bool Condition ( const CBlockIndex * pindex , const Consensus : : Params & params ) const { return ( pindex - > nVersion & 0x100 ) ; }
bool Condition ( const CBlockIndex * pindex , const Consensus : : Params & params ) const { return ( pindex - > nVersion & 0x100 ) ; }
ThresholdState GetStateFor ( const CBlockIndex * pindexPrev ) const { return AbstractThresholdConditionChecker : : GetStateFor ( pindexPrev , paramsDummy , cache ) ; }
ThresholdState GetStateFor ( const CBlockIndex * pindexPrev ) const { return AbstractThresholdConditionChecker : : GetStateFor ( pindexPrev , paramsDummy , cache ) ; }
int GetStateSinceHeightFor ( const CBlockIndex * pindexPrev ) const { return AbstractThresholdConditionChecker : : GetStateSinceHeightFor ( pindexPrev , paramsDummy , cache ) ; }
} ;
} ;
# define CHECKERS 6
# define CHECKERS 6
@ -78,6 +79,16 @@ public:
return * this ;
return * this ;
}
}
VersionBitsTester & TestStateSinceHeight ( int height ) {
for ( int i = 0 ; i < CHECKERS ; i + + ) {
if ( ( insecure_rand ( ) & ( ( 1 < < i ) - 1 ) ) = = 0 ) {
BOOST_CHECK_MESSAGE ( checker [ i ] . GetStateSinceHeightFor ( vpblock . empty ( ) ? NULL : vpblock . back ( ) ) = = height , strprintf ( " Test %i for StateSinceHeight " , num ) ) ;
}
}
num + + ;
return * this ;
}
VersionBitsTester & TestDefined ( ) {
VersionBitsTester & TestDefined ( ) {
for ( int i = 0 ; i < CHECKERS ; i + + ) {
for ( int i = 0 ; i < CHECKERS ; i + + ) {
if ( ( insecure_rand ( ) & ( ( 1 < < i ) - 1 ) ) = = 0 ) {
if ( ( insecure_rand ( ) & ( ( 1 < < i ) - 1 ) ) = = 0 ) {
@ -137,53 +148,64 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
{
{
for ( int i = 0 ; i < 64 ; i + + ) {
for ( int i = 0 ; i < 64 ; i + + ) {
// DEFINED -> FAILED
// DEFINED -> FAILED
VersionBitsTester ( ) . TestDefined ( )
VersionBitsTester ( ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1 , TestTime ( 1 ) , 0x100 ) . TestDefined ( )
. Mine ( 1 , TestTime ( 1 ) , 0x100 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 11 , TestTime ( 11 ) , 0x100 ) . TestDefined ( )
. Mine ( 11 , TestTime ( 11 ) , 0x100 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 989 , TestTime ( 989 ) , 0x100 ) . TestDefined ( )
. Mine ( 989 , TestTime ( 989 ) , 0x100 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 999 , TestTime ( 20000 ) , 0x100 ) . TestDefined ( )
. Mine ( 999 , TestTime ( 20000 ) , 0x100 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1000 , TestTime ( 20000 ) , 0x100 ) . TestFailed ( )
. Mine ( 1000 , TestTime ( 20000 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
. Mine ( 1999 , TestTime ( 30001 ) , 0x100 ) . TestFailed ( )
. Mine ( 1999 , TestTime ( 30001 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
. Mine ( 2000 , TestTime ( 30002 ) , 0x100 ) . TestFailed ( )
. Mine ( 2000 , TestTime ( 30002 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
. Mine ( 2001 , TestTime ( 30003 ) , 0x100 ) . TestFailed ( )
. Mine ( 2001 , TestTime ( 30003 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
. Mine ( 2999 , TestTime ( 30004 ) , 0x100 ) . TestFailed ( )
. Mine ( 2999 , TestTime ( 30004 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
. Mine ( 3000 , TestTime ( 30005 ) , 0x100 ) . TestFailed ( )
. Mine ( 3000 , TestTime ( 30005 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 1000 )
// DEFINED -> STARTED -> FAILED
// DEFINED -> STARTED -> FAILED
. Reset ( ) . TestDefined ( )
. Reset ( ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x100 ) . TestDefined ( ) // One second more and it would be defined
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x100 ) . TestDefined ( ) . TestStateSinceHeight ( 0 ) // One second more and it would be defined
. Mine ( 2000 , TestTime ( 10000 ) , 0x100 ) . TestStarted ( ) // So that's what happens the next period
. Mine ( 2000 , TestTime ( 10000 ) , 0x100 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // So that's what happens the next period
. Mine ( 2051 , TestTime ( 10010 ) , 0 ) . TestStarted ( ) // 51 old blocks
. Mine ( 2051 , TestTime ( 10010 ) , 0 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 51 old blocks
. Mine ( 2950 , TestTime ( 10020 ) , 0x100 ) . TestStarted ( ) // 899 new blocks
. Mine ( 2950 , TestTime ( 10020 ) , 0x100 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 899 new blocks
. Mine ( 3000 , TestTime ( 20000 ) , 0 ) . TestFailed ( ) // 50 old blocks (so 899 out of the past 1000)
. Mine ( 3000 , TestTime ( 20000 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 ) // 50 old blocks (so 899 out of the past 1000)
. Mine ( 4000 , TestTime ( 20010 ) , 0x100 ) . TestFailed ( )
. Mine ( 4000 , TestTime ( 20010 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 )
// DEFINED -> STARTED -> FAILED while threshold reached
// DEFINED -> STARTED -> FAILED while threshold reached
. Reset ( ) . TestDefined ( )
. Reset ( ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x101 ) . TestDefined ( ) // One second more and it would be defined
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x101 ) . TestDefined ( ) . TestStateSinceHeight ( 0 ) // One second more and it would be defined
. Mine ( 2000 , TestTime ( 10000 ) , 0x101 ) . TestStarted ( ) // So that's what happens the next period
. Mine ( 2000 , TestTime ( 10000 ) , 0x101 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // So that's what happens the next period
. Mine ( 2999 , TestTime ( 30000 ) , 0x100 ) . TestStarted ( ) // 999 new blocks
. Mine ( 2999 , TestTime ( 30000 ) , 0x100 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 999 new blocks
. Mine ( 3000 , TestTime ( 30000 ) , 0x100 ) . TestFailed ( ) // 1 new block (so 1000 out of the past 1000 are new)
. Mine ( 3000 , TestTime ( 30000 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 ) // 1 new block (so 1000 out of the past 1000 are new)
. Mine ( 3999 , TestTime ( 30001 ) , 0 ) . TestFailed ( )
. Mine ( 3999 , TestTime ( 30001 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 4000 , TestTime ( 30002 ) , 0 ) . TestFailed ( )
. Mine ( 4000 , TestTime ( 30002 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 14333 , TestTime ( 30003 ) , 0 ) . TestFailed ( )
. Mine ( 14333 , TestTime ( 30003 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 24000 , TestTime ( 40000 ) , 0 ) . TestFailed ( )
. Mine ( 24000 , TestTime ( 40000 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 3000 )
// DEFINED -> STARTED -> LOCKEDIN at the last minute -> ACTIVE
// DEFINED -> STARTED -> LOCKEDIN at the last minute -> ACTIVE
. Reset ( ) . TestDefined ( )
. Reset ( ) . TestDefined ( )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( )
. Mine ( 1 , TestTime ( 1 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x101 ) . TestDefined ( ) // One second more and it would be defined
. Mine ( 1000 , TestTime ( 10000 ) - 1 , 0x101 ) . TestDefined ( ) . TestStateSinceHeight ( 0 ) // One second more and it would be defined
. Mine ( 2000 , TestTime ( 10000 ) , 0x101 ) . TestStarted ( ) // So that's what happens the next period
. Mine ( 2000 , TestTime ( 10000 ) , 0x101 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // So that's what happens the next period
. Mine ( 2050 , TestTime ( 10010 ) , 0x200 ) . TestStarted ( ) // 50 old blocks
. Mine ( 2050 , TestTime ( 10010 ) , 0x200 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 50 old blocks
. Mine ( 2950 , TestTime ( 10020 ) , 0x100 ) . TestStarted ( ) // 900 new blocks
. Mine ( 2950 , TestTime ( 10020 ) , 0x100 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 900 new blocks
. Mine ( 2999 , TestTime ( 19999 ) , 0x200 ) . TestStarted ( ) // 49 old blocks
. Mine ( 2999 , TestTime ( 19999 ) , 0x200 ) . TestStarted ( ) . TestStateSinceHeight ( 2000 ) // 49 old blocks
. Mine ( 3000 , TestTime ( 29999 ) , 0x200 ) . TestLockedIn ( ) // 1 old block (so 900 out of the past 1000)
. Mine ( 3000 , TestTime ( 29999 ) , 0x200 ) . TestLockedIn ( ) . TestStateSinceHeight ( 3000 ) // 1 old block (so 900 out of the past 1000)
. Mine ( 3999 , TestTime ( 30001 ) , 0 ) . TestLockedIn ( )
. Mine ( 3999 , TestTime ( 30001 ) , 0 ) . TestLockedIn ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 4000 , TestTime ( 30002 ) , 0 ) . TestActive ( )
. Mine ( 4000 , TestTime ( 30002 ) , 0 ) . TestActive ( ) . TestStateSinceHeight ( 4000 )
. Mine ( 14333 , TestTime ( 30003 ) , 0 ) . TestActive ( )
. Mine ( 14333 , TestTime ( 30003 ) , 0 ) . TestActive ( ) . TestStateSinceHeight ( 4000 )
. Mine ( 24000 , TestTime ( 40000 ) , 0 ) . TestActive ( ) ;
. Mine ( 24000 , TestTime ( 40000 ) , 0 ) . TestActive ( ) . TestStateSinceHeight ( 4000 )
// DEFINED multiple periods -> STARTED multiple periods -> FAILED
. Reset ( ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 999 , TestTime ( 999 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 1000 , TestTime ( 1000 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 2000 , TestTime ( 2000 ) , 0 ) . TestDefined ( ) . TestStateSinceHeight ( 0 )
. Mine ( 3000 , TestTime ( 10000 ) , 0 ) . TestStarted ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 4000 , TestTime ( 10000 ) , 0 ) . TestStarted ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 5000 , TestTime ( 10000 ) , 0 ) . TestStarted ( ) . TestStateSinceHeight ( 3000 )
. Mine ( 6000 , TestTime ( 20000 ) , 0 ) . TestFailed ( ) . TestStateSinceHeight ( 6000 )
. Mine ( 7000 , TestTime ( 20000 ) , 0x100 ) . TestFailed ( ) . TestStateSinceHeight ( 6000 ) ;
}
}
// Sanity checks of version bit deployments
// Sanity checks of version bit deployments