hardfork: fix more major/minor issues
Also add some more tests, and rename some instances of "version" and "add" for clarity. NOTE: the starting height values are sometimes wrong. I suspect this is due to the hard fork reorg code being buggy, since they're good when syncing after the fact. However, they're not actually used by the consensus code, so I'm ignoring this for now, but this needs debugging.
This commit is contained in:
@@ -135,6 +135,7 @@ private:
|
||||
static cryptonote::block mkblock(uint8_t version)
|
||||
{
|
||||
cryptonote::block b;
|
||||
b.major_version = version;
|
||||
b.minor_version = version;
|
||||
return b;
|
||||
}
|
||||
@@ -144,7 +145,7 @@ TEST(empty_hardforks, Success)
|
||||
TestDB db;
|
||||
HardFork hf(db);
|
||||
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
hf.init();
|
||||
ASSERT_TRUE(hf.get_state(time(NULL)) == HardFork::Ready);
|
||||
ASSERT_TRUE(hf.get_state(time(NULL) + 3600*24*400) == HardFork::Ready);
|
||||
@@ -163,13 +164,13 @@ TEST(ordering, Success)
|
||||
TestDB db;
|
||||
HardFork hf(db);
|
||||
|
||||
ASSERT_TRUE(hf.add(2, 2, 1));
|
||||
ASSERT_FALSE(hf.add(3, 3, 1));
|
||||
ASSERT_FALSE(hf.add(3, 2, 2));
|
||||
ASSERT_FALSE(hf.add(2, 3, 2));
|
||||
ASSERT_TRUE(hf.add(3, 10, 2));
|
||||
ASSERT_TRUE(hf.add(4, 20, 3));
|
||||
ASSERT_FALSE(hf.add(5, 5, 4));
|
||||
ASSERT_TRUE(hf.add_fork(2, 2, 1));
|
||||
ASSERT_FALSE(hf.add_fork(3, 3, 1));
|
||||
ASSERT_FALSE(hf.add_fork(3, 2, 2));
|
||||
ASSERT_FALSE(hf.add_fork(2, 3, 2));
|
||||
ASSERT_TRUE(hf.add_fork(3, 10, 2));
|
||||
ASSERT_TRUE(hf.add_fork(4, 20, 3));
|
||||
ASSERT_FALSE(hf.add_fork(5, 5, 4));
|
||||
}
|
||||
|
||||
TEST(states, Success)
|
||||
@@ -177,8 +178,8 @@ TEST(states, Success)
|
||||
TestDB db;
|
||||
HardFork hf(db);
|
||||
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, BLOCKS_PER_YEAR, SECONDS_PER_YEAR));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, BLOCKS_PER_YEAR, SECONDS_PER_YEAR));
|
||||
|
||||
ASSERT_TRUE(hf.get_state(0) == HardFork::Ready);
|
||||
ASSERT_TRUE(hf.get_state(SECONDS_PER_YEAR / 2) == HardFork::Ready);
|
||||
@@ -186,7 +187,7 @@ TEST(states, Success)
|
||||
ASSERT_TRUE(hf.get_state(SECONDS_PER_YEAR + (HardFork::DEFAULT_UPDATE_TIME + HardFork::DEFAULT_FORKED_TIME) / 2) == HardFork::UpdateNeeded);
|
||||
ASSERT_TRUE(hf.get_state(SECONDS_PER_YEAR + HardFork::DEFAULT_FORKED_TIME * 2) == HardFork::LikelyForked);
|
||||
|
||||
ASSERT_TRUE(hf.add(3, BLOCKS_PER_YEAR * 5, SECONDS_PER_YEAR * 5));
|
||||
ASSERT_TRUE(hf.add_fork(3, BLOCKS_PER_YEAR * 5, SECONDS_PER_YEAR * 5));
|
||||
|
||||
ASSERT_TRUE(hf.get_state(0) == HardFork::Ready);
|
||||
ASSERT_TRUE(hf.get_state(SECONDS_PER_YEAR / 2) == HardFork::Ready);
|
||||
@@ -201,10 +202,10 @@ TEST(steps_asap, Success)
|
||||
HardFork hf(db, 1,0,1,1,1);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add(9, 6, 3));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add_fork(9, 6, 3));
|
||||
hf.init();
|
||||
|
||||
for (uint64_t h = 0; h < 10; ++h) {
|
||||
@@ -229,9 +230,9 @@ TEST(steps_1, Success)
|
||||
TestDB db;
|
||||
HardFork hf(db, 1,0,1,1,1);
|
||||
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
for (int n = 1 ; n < 10; ++n)
|
||||
ASSERT_TRUE(hf.add(n+1, n, n));
|
||||
ASSERT_TRUE(hf.add_fork(n+1, n, n));
|
||||
hf.init();
|
||||
|
||||
for (uint64_t h = 0 ; h < 10; ++h) {
|
||||
@@ -251,10 +252,10 @@ TEST(reorganize, Same)
|
||||
HardFork hf(db, 1, 0, 1, 1, history, 100);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add(9, 6, 3));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add_fork(9, 6, 3));
|
||||
hf.init();
|
||||
|
||||
// index 0 1 2 3 4 5 6 7 8 9
|
||||
@@ -270,6 +271,10 @@ TEST(reorganize, Same)
|
||||
uint8_t version = hh >= history ? block_versions[hh - history] : 1;
|
||||
ASSERT_EQ(hf.get(hh), version);
|
||||
}
|
||||
ASSERT_EQ(hf.get_start_height(1), 0);
|
||||
ASSERT_EQ(hf.get_start_height(4), 2 + history);
|
||||
ASSERT_EQ(hf.get_start_height(7), 4 + history);
|
||||
ASSERT_EQ(hf.get_start_height(9), 6 + history);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -281,15 +286,15 @@ TEST(reorganize, Changed)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 100);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add(9, 6, 3));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(4, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(7, 4, 2));
|
||||
ASSERT_TRUE(hf.add_fork(9, 6, 3));
|
||||
hf.init();
|
||||
|
||||
// fork 4 7 9
|
||||
// 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 };
|
||||
// fork 4 7 9
|
||||
// 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 };
|
||||
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(block_versions[h]), 0, 0, 0, crypto::hash());
|
||||
@@ -301,6 +306,10 @@ TEST(reorganize, Changed)
|
||||
for (int hh = 0; hh < 16; ++hh) {
|
||||
ASSERT_EQ(hf.get(hh), expected_versions[hh]);
|
||||
}
|
||||
ASSERT_EQ(hf.get_start_height(1), 0);
|
||||
ASSERT_EQ(hf.get_start_height(4), 6);
|
||||
ASSERT_EQ(hf.get_start_height(7), 8);
|
||||
ASSERT_EQ(hf.get_start_height(9), 10);
|
||||
}
|
||||
|
||||
// delay a bit for 9, and go back to 1 to check it stays at 9
|
||||
@@ -321,6 +330,10 @@ TEST(reorganize, Changed)
|
||||
for (int hh = 0; hh < 15; ++hh) {
|
||||
ASSERT_EQ(hf.get(hh), expected_versions_new[hh]);
|
||||
}
|
||||
ASSERT_EQ(hf.get_start_height(1), 0);
|
||||
ASSERT_EQ(hf.get_start_height(4), 6);
|
||||
ASSERT_EQ(hf.get_start_height(7), 11);
|
||||
ASSERT_EQ(hf.get_start_height(9), 14);
|
||||
}
|
||||
|
||||
TEST(voting, threshold)
|
||||
@@ -330,8 +343,8 @@ TEST(voting, threshold)
|
||||
HardFork hf(db, 1, 0, 1, 1, 8, threshold);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 2, 1));
|
||||
hf.init();
|
||||
|
||||
for (uint64_t h = 0; h <= 8; ++h) {
|
||||
@@ -359,10 +372,10 @@ TEST(voting, different_thresholds)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 50); // window size 4
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 5, 0, 1)); // asap
|
||||
ASSERT_TRUE(hf.add(3, 10, 100, 2)); // all votes
|
||||
ASSERT_TRUE(hf.add(4, 15, 3)); // default 50% votes
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 5, 0, 1)); // asap
|
||||
ASSERT_TRUE(hf.add_fork(3, 10, 100, 2)); // all votes
|
||||
ASSERT_TRUE(hf.add_fork(4, 15, 3)); // default 50% votes
|
||||
hf.init();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
|
||||
@@ -386,8 +399,8 @@ TEST(new_blocks, denied)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 50);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 2, 1));
|
||||
hf.init();
|
||||
|
||||
ASSERT_TRUE(hf.add(mkblock(1), 0));
|
||||
@@ -411,8 +424,8 @@ TEST(new_version, early)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 50);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 4, 1));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 4, 1));
|
||||
hf.init();
|
||||
|
||||
ASSERT_TRUE(hf.add(mkblock(2), 0));
|
||||
@@ -433,9 +446,9 @@ TEST(reorganize, changed)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 50);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add(3, 5, 2));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(3, 5, 2));
|
||||
hf.init();
|
||||
|
||||
#define ADD(v, h, a) \
|
||||
@@ -487,9 +500,9 @@ TEST(get, higher)
|
||||
HardFork hf(db, 1, 0, 1, 1, 4, 50);
|
||||
|
||||
// v h t
|
||||
ASSERT_TRUE(hf.add(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add(3, 5, 2));
|
||||
ASSERT_TRUE(hf.add_fork(1, 0, 0));
|
||||
ASSERT_TRUE(hf.add_fork(2, 2, 1));
|
||||
ASSERT_TRUE(hf.add_fork(3, 5, 2));
|
||||
hf.init();
|
||||
|
||||
ASSERT_EQ(hf.get_ideal_version(0), 1);
|
||||
|
||||
Reference in New Issue
Block a user