Fix off by one initialising hardforks

This commit is contained in:
doy-lee 2018-12-10 14:54:42 +11:00
parent a07c5d9cba
commit 45af8b928c
5 changed files with 31 additions and 59 deletions

View File

@ -33,7 +33,7 @@
struct gen_bp_tx_validation_base : public test_chain_unit_base
{
static const int NUM_UNLOCKED_BLOCKS = 48;
static const int NUM_UNLOCKED_BLOCKS = 49;
gen_bp_tx_validation_base()
: m_invalid_tx_index(0)
, m_invalid_block_index(0)
@ -100,10 +100,9 @@ private:
template<>
struct get_test_options<gen_bp_tx_validation_base> {
const std::vector<std::pair<uint8_t, uint64_t>> hard_forks = {
std::make_pair(7, 0),
std::make_pair(8, 1),
std::make_pair(7, 1),
std::make_pair(8, 2),
std::make_pair(10, gen_bp_tx_validation_base::NUM_UNLOCKED_BLOCKS + CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW + 1),
std::make_pair(0, 0),
};
const cryptonote::test_options test_options = {

View File

@ -89,7 +89,7 @@ void linear_chain_generator::create_block(const std::vector<cryptonote::transact
}
void linear_chain_generator::continue_until_version(const std::vector<std::pair<uint8_t, uint64_t>> &hard_forks, int hard_fork_version)
void linear_chain_generator::rewind_until_version(const std::vector<std::pair<uint8_t, uint64_t>> &hard_forks, int hard_fork_version)
{
assert(gen_.m_hf_version < hard_fork_version);
@ -114,42 +114,11 @@ void linear_chain_generator::continue_until_version(const std::vector<std::pair<
assert(gen_.m_hf_version == hard_fork_version);
}
void linear_chain_generator::rewind_until_version(const std::vector<std::pair<uint8_t, uint64_t>> &hard_forks, int hard_fork_version)
{
if (hard_forks.size() > 1)
{
gen_.m_hf_version = hard_forks[0].first;
if (blocks_.size() == 0) create_genesis_block();
for (size_t i = 0; i < hard_forks.size() - 1 && gen_.m_hf_version != hard_fork_version; ++i)
{
uint64_t curr_fork_height = hard_forks[i].second;
uint64_t next_fork_height = hard_forks[i + 1].second;
assert(next_fork_height > curr_fork_height);
uint64_t blocks_till_next_hardfork = next_fork_height - curr_fork_height;
rewind_blocks_n(blocks_till_next_hardfork - 1);
gen_.m_hf_version = hard_forks[i + 1].first;
create_block();
}
assert(gen_.m_hf_version == hard_fork_version);
}
}
int linear_chain_generator::get_hf_version() const {
return gen_.m_hf_version;
}
void linear_chain_generator::rewind_until_v9()
{
gen_.m_hf_version = 8;
create_block();
gen_.m_hf_version = 9;
create_block();
}
void linear_chain_generator::rewind_blocks_n(int n)
{
for (auto i = 0; i < n; ++i) {

View File

@ -315,8 +315,6 @@ class linear_chain_generator
int get_hf_version() const;
void rewind_until_v9();
void continue_until_version(const std::vector<std::pair<uint8_t, uint64_t>> &hard_forks, int hard_fork_version);
void rewind_until_version(const std::vector<std::pair<uint8_t, uint64_t>> &hard_forks, int hard_fork_version);
void rewind_blocks_n(int n);
void rewind_blocks();

View File

@ -123,30 +123,31 @@ bool gen_service_nodes::generate(std::vector<test_event_entry> &events) const
{
linear_chain_generator gen(events);
gen.create_genesis_block(); // 1
gen.create_genesis_block();
const auto miner = gen.first_miner();
const auto alice = gen.create_account();
gen.rewind_until_v9(); // 3
gen.rewind_blocks_n(10); // 13
const get_test_options<gen_service_nodes> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
gen.rewind_blocks_n(10);
gen.rewind_blocks(); // 13 + N
gen.rewind_blocks();
const auto tx0 = gen.create_tx(miner, alice, MK_COINS(101));
gen.create_block({tx0}); // 14 + N
gen.create_block({tx0});
gen.rewind_blocks(); // 14 + 2N
gen.rewind_blocks();
const auto reg_tx = gen.create_registration_tx(alice, m_alice_service_node_keys);
gen.create_block({reg_tx}); // 15 + 2N
gen.create_block({reg_tx});
DO_CALLBACK(events, "check_registered");
for (auto i = 0u; i < service_nodes::get_staking_requirement_lock_blocks(cryptonote::FAKECHAIN); ++i) {
gen.create_block();
} // 15 + 2N + M
}
DO_CALLBACK(events, "check_expired");
@ -160,7 +161,7 @@ bool gen_service_nodes::check_registered(cryptonote::core& c, size_t ev_index, c
cryptonote::account_base alice = boost::get<cryptonote::account_base>(events[1]);
std::vector<block> blocks;
size_t count = 15 + (2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW);
size_t count = 16 + (2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW);
bool r = c.get_blocks((uint64_t)0, count, blocks);
CHECK_TEST_CONDITION(r);
std::vector<cryptonote::block> chain;
@ -188,7 +189,7 @@ bool gen_service_nodes::check_expired(cryptonote::core& c, size_t ev_index, cons
const auto stake_lock_time = service_nodes::get_staking_requirement_lock_blocks(cryptonote::FAKECHAIN);
std::vector<block> blocks;
size_t count = 15 + (2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW) + stake_lock_time;
size_t count = 16 + (2 * CRYPTONOTE_MINED_MONEY_UNLOCK_WINDOW) + stake_lock_time;
bool r = c.get_blocks((uint64_t)0, count, blocks);
CHECK_TEST_CONDITION(r);
std::vector<cryptonote::block> chain;
@ -222,7 +223,8 @@ bool test_prefer_deregisters::generate(std::vector<test_event_entry> &events)
const auto miner = gen.first_miner();
const auto alice = gen.create_account();
gen.rewind_until_v9();
const get_test_options<test_prefer_deregisters> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
/// give miner some outputs to spend and unlock them
gen.rewind_blocks_n(60);
@ -305,7 +307,8 @@ bool test_zero_fee_deregister::generate(std::vector<test_event_entry> &events)
gen.create_genesis_block();
gen.rewind_until_v9();
const get_test_options<test_zero_fee_deregister> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
/// give miner some outputs to spend and unlock them
gen.rewind_blocks_n(20);
@ -347,7 +350,8 @@ bool test_deregister_safety_buffer::generate(std::vector<test_event_entry> &even
const auto miner = gen.first_miner();
gen.rewind_until_v9();
const get_test_options<test_deregister_safety_buffer> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
/// give miner some outputs to spend and unlock them
gen.rewind_blocks_n(40);
@ -455,7 +459,8 @@ bool test_deregisters_on_split::generate(std::vector<test_event_entry> &events)
linear_chain_generator gen(events);
gen.create_genesis_block();
gen.rewind_until_v9();
const get_test_options<test_deregisters_on_split> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
/// generate some outputs and unlock them
gen.rewind_blocks_n(20);
@ -560,7 +565,8 @@ bool deregister_too_old::generate(std::vector<test_event_entry>& events)
linear_chain_generator gen(events);
gen.create_genesis_block();
gen.rewind_until_v9();
const get_test_options<deregister_too_old> test_options = {};
gen.rewind_until_version(test_options.hard_forks, network_version_9_service_nodes);
/// generate some outputs and unlock them
gen.rewind_blocks_n(20);
@ -757,7 +763,7 @@ bool test_swarms_basic::generate(std::vector<test_event_entry>& events)
return false;
}
gen.continue_until_version(test_options.hard_forks, network_version_10_bulletproofs);
gen.rewind_until_version(test_options.hard_forks, network_version_10_bulletproofs);
/// test that we now have swarms
DO_CALLBACK(events, "test_initial_swarms");
@ -850,4 +856,4 @@ bool test_swarms_basic::test_after_deregisters(cryptonote::core& c, size_t ev_in
CHECK_EQ(swarms.size(), 2);
return true;
}
}

View File

@ -40,9 +40,9 @@ class test_service_nodes_base : public test_chain_unit_base {};
template<>
struct get_test_options<test_service_nodes_base>
{
const std::vector<std::pair<uint8_t, uint64_t>> hard_forks = { std::make_pair(7, 0),
std::make_pair(8, 1),
std::make_pair(9, 2) };
const std::vector<std::pair<uint8_t, uint64_t>> hard_forks = { std::make_pair(7, 1),
std::make_pair(8, 2),
std::make_pair(9, 3) };
const cryptonote::test_options test_options = { hard_forks };
};
@ -213,4 +213,4 @@ struct get_test_options<test_swarms_basic>
std::make_pair(9, 2),
std::make_pair(10, 150) };
const cryptonote::test_options test_options = { hard_forks };
};
};