@ -41,6 +41,11 @@ using namespace cryptonote;
# define BLOCKS_PER_YEAR 525960
# define SECONDS_PER_YEAR 31557600
# define ADD_BLOCK_DEFAULT(db, block) \
do { \
db . add_block ( ( block ) , 0 , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ; \
} while ( 0 ) ; \
namespace
{
@ -53,6 +58,7 @@ public:
, const difficulty_type & cumulative_difficulty
, const uint64_t & coins_generated
, uint64_t num_rct_outs
, uint64_t num_rct_outs_coinbase
, const crypto : : hash & blk_hash
) override {
blocks . push_back ( blk ) ;
@ -107,20 +113,20 @@ TEST(major, Only)
ASSERT_FALSE ( hf . add ( mkblock ( 0 , 2 ) , 0 ) ) ;
ASSERT_FALSE ( hf . add ( mkblock ( 2 , 2 ) , 0 ) ) ;
ASSERT_TRUE ( hf . add ( mkblock ( 1 , 2 ) , 0 ) ) ;
db. add_block ( mkblock ( 1 , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( 1 , 1 ) ) ;
// block height 1, only version 1 is accepted
ASSERT_FALSE ( hf . add ( mkblock ( 0 , 2 ) , 1 ) ) ;
ASSERT_FALSE ( hf . add ( mkblock ( 2 , 2 ) , 1 ) ) ;
ASSERT_TRUE ( hf . add ( mkblock ( 1 , 2 ) , 1 ) ) ;
db. add_block ( mkblock ( 1 , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( 1 , 1 ) ) ;
// block height 2, only version 2 is accepted
ASSERT_FALSE ( hf . add ( mkblock ( 0 , 2 ) , 2 ) ) ;
ASSERT_FALSE ( hf . add ( mkblock ( 1 , 2 ) , 2 ) ) ;
ASSERT_FALSE ( hf . add ( mkblock ( 3 , 2 ) , 2 ) ) ;
ASSERT_TRUE ( hf . add ( mkblock ( 2 , 2 ) , 2 ) ) ;
db. add_block ( mkblock ( 2 , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( 2 , 1 ) ) ;
}
TEST ( empty_hardforks , Success )
@ -134,7 +140,7 @@ TEST(empty_hardforks, Success)
ASSERT_TRUE ( hf . get_state ( time ( NULL ) + 3600 * 24 * 400 ) = = HardFork : : Ready ) ;
for ( uint64_t h = 0 ; h < = 10 ; + + h ) {
db. add_block ( mkblock ( hf , h , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 1 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
ASSERT_EQ ( hf . get ( 0 ) , 1 ) ;
@ -168,14 +174,14 @@ TEST(check_for_height, Success)
for ( uint64_t h = 0 ; h < = 4 ; + + h ) {
ASSERT_TRUE ( hf . check_for_height ( mkblock ( 1 , 1 ) , h ) ) ;
ASSERT_FALSE ( hf . check_for_height ( mkblock ( 2 , 2 ) , h ) ) ; // block version is too high
db. add_block ( mkblock ( hf , h , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 1 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
for ( uint64_t h = 5 ; h < = 10 ; + + h ) {
ASSERT_FALSE ( hf . check_for_height ( mkblock ( 1 , 1 ) , h ) ) ; // block version is too low
ASSERT_TRUE ( hf . check_for_height ( mkblock ( 2 , 2 ) , h ) ) ;
db. add_block ( mkblock ( hf , h , 2 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 2 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
}
@ -192,19 +198,19 @@ TEST(get, next_version)
for ( uint64_t h = 0 ; h < = 4 ; + + h ) {
ASSERT_EQ ( 2 , hf . get_next_version ( ) ) ;
db. add_block ( mkblock ( hf , h , 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 1 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
for ( uint64_t h = 5 ; h < = 9 ; + + h ) {
ASSERT_EQ ( 4 , hf . get_next_version ( ) ) ;
db. add_block ( mkblock ( hf , h , 2 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 2 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
for ( uint64_t h = 10 ; h < = 15 ; + + h ) {
ASSERT_EQ ( 4 , hf . get_next_version ( ) ) ;
db. add_block ( mkblock ( hf , h , 4 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 4 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
}
@ -245,7 +251,7 @@ TEST(steps_asap, Success)
hf . init ( ) ;
for ( uint64_t h = 0 ; h < 10 ; + + h ) {
db. add_block ( mkblock ( hf , h , 9 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , 9 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
@ -272,7 +278,7 @@ TEST(steps_1, Success)
hf . init ( ) ;
for ( uint64_t h = 0 ; h < 10 ; + + h ) {
db. add_block ( mkblock ( hf , h , h + 1 ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , h + 1 ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
@ -297,7 +303,7 @@ TEST(reorganize, Same)
// index 0 1 2 3 4 5 6 7 8 9
static const uint8_t block_versions [ ] = { 1 , 1 , 4 , 4 , 7 , 7 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 } ;
for ( uint64_t h = 0 ; h < 20 ; + + h ) {
db. add_block ( mkblock ( hf , h , block_versions [ h ] ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , block_versions [ h ] ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
@ -328,7 +334,7 @@ TEST(reorganize, Changed)
static const uint8_t block_versions [ ] = { 1 , 1 , 4 , 4 , 7 , 7 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 , 9 } ;
static const uint8_t expected_versions [ ] = { 1 , 1 , 1 , 1 , 1 , 1 , 4 , 4 , 7 , 7 , 9 , 9 , 9 , 9 , 9 , 9 } ;
for ( uint64_t h = 0 ; h < 16 ; + + h ) {
db. add_block ( mkblock ( hf , h , block_versions [ h ] ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , block_versions [ h ] ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
@ -348,7 +354,7 @@ TEST(reorganize, Changed)
ASSERT_EQ ( db . height ( ) , 3 ) ;
hf . reorganize_from_block_height ( 2 ) ;
for ( uint64_t h = 3 ; h < 16 ; + + h ) {
db. add_block ( mkblock ( hf , h , block_versions_new [ h ] ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , block_versions_new [ h ] ) ) ;
bool ret = hf . add ( db . get_block_from_height ( h ) , h ) ;
ASSERT_EQ ( ret , h < 15 ) ;
}
@ -372,7 +378,7 @@ TEST(voting, threshold)
for ( uint64_t h = 0 ; h < = 8 ; + + h ) {
uint8_t v = 1 + ! ! ( h % 8 ) ;
db. add_block ( mkblock ( hf , h , v ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , v ) ) ;
bool ret = hf . add ( db . get_block_from_height ( h ) , h ) ;
if ( h > = 8 & & threshold = = 87 ) {
// for threshold 87, we reach the treshold at height 7, so from height 8, hard fork to version 2, but 8 tries to add 1
@ -406,7 +412,7 @@ TEST(voting, different_thresholds)
static const uint8_t expected_versions [ ] = { 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 } ;
for ( uint64_t h = 0 ; h < sizeof ( block_versions ) / sizeof ( block_versions [ 0 ] ) ; + + h ) {
db. add_block ( mkblock ( hf , h , block_versions [ h ] ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , block_versions [ h ] ) ) ;
bool ret = hf . add ( db . get_block_from_height ( h ) , h ) ;
ASSERT_EQ ( ret , true ) ;
}
@ -459,7 +465,7 @@ TEST(voting, info)
ASSERT_EQ ( expected_thresholds [ h ] , threshold ) ;
ASSERT_EQ ( 4 , voting ) ;
db. add_block ( mkblock ( hf , h , block_versions [ h ] ) , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ;
ADD_BLOCK_DEFAULT( db , mkblock ( hf , h , block_versions [ h ] ) ) ;
ASSERT_TRUE ( hf . add ( db . get_block_from_height ( h ) , h ) ) ;
}
}
@ -522,7 +528,7 @@ TEST(reorganize, changed)
# define ADD(v, h, a) \
do { \
cryptonote : : block b = mkblock ( hf , h , v ) ; \
db. add_block ( b , 0 , 0 , 0 , 0 , 0 , crypto : : hash ( ) ) ; \
ADD_BLOCK_DEFAULT( db , b ) ; \
ASSERT_ # # a ( hf . add ( b , h ) ) ; \
} while ( 0 )
# define ADD_TRUE(v, h) ADD(v, h, TRUE)