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:
moneromooo-monero 2015-11-24 20:46:10 +00:00
parent 3b47ca2d7d
commit d887c18e33
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
4 changed files with 83 additions and 68 deletions

View file

@ -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);