From a83dedf2a46a805de5b5e5ebd2964195017dc604 Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Sun, 30 Apr 2023 00:43:49 +0200 Subject: [PATCH] multiple fixes over old block verification tests --- src/currency_core/blockchain_storage.cpp | 17 +++++++++- src/currency_core/core_runtime_config.h | 6 ++++ src/currency_core/currency_config.h | 7 ++-- tests/core_tests/block_validation.cpp | 41 +++++++++++++---------- tests/core_tests/block_validation.h | 42 ++++++++++++------------ tests/core_tests/chaingen.cpp | 2 +- tests/core_tests/chaingen.h | 38 ++++++++++++++++++--- tests/core_tests/chaingen_main.cpp | 15 +++++++++ 8 files changed, 121 insertions(+), 47 deletions(-) diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index e601b888..40354f06 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -6392,8 +6392,14 @@ bool blockchain_storage::is_hardfork_active(size_t hardfork_id) const //------------------------------------------------------------------ bool blockchain_storage::prevalidate_block(const block& bl) { + uint64_t block_height = get_block_height(bl); + + //before hard_fork1 + if (bl.major_version == BLOCK_MAJOR_VERSION_INITIAL && m_core_runtime_config.is_hardfork_active_for_height(1, block_height)) + return true; + // HF0 if (!m_core_runtime_config.is_hardfork_active_for_height(1, block_height)) { @@ -6409,7 +6415,16 @@ bool blockchain_storage::prevalidate_block(const block& bl) return true; } - // >= HF3 + // HF3 and !HF4 + if (m_core_runtime_config.is_hardfork_active_for_height(3, block_height) && + !m_core_runtime_config.is_hardfork_active_for_height(4, block_height)) + { + CHECK_AND_ASSERT_MES(bl.major_version == HF3_BLOCK_MAJOR_VERSION, false, "HF3 incorrect block major version: " << (int)bl.major_version); + CHECK_AND_ASSERT_MES(bl.minor_version <= HF3_BLOCK_MINOR_VERSION, false, "HF3 incorrect block minor version: " << (int)bl.minor_version); + return true; + } + + // rule for unknown versions if (bl.major_version > CURRENT_BLOCK_MAJOR_VERSION) { LOG_ERROR("prevalidation failed for block " << get_block_hash(bl) << ": major block version " << static_cast(bl.major_version) << " is incorrect, " << CURRENT_BLOCK_MAJOR_VERSION << " is expected" << ENDL diff --git a/src/currency_core/core_runtime_config.h b/src/currency_core/core_runtime_config.h index 8c058ac3..583add64 100644 --- a/src/currency_core/core_runtime_config.h +++ b/src/currency_core/core_runtime_config.h @@ -5,6 +5,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #pragma once +#include "boost/serialization/array.hpp" #include "misc_language.h" #include "string_tools.h" @@ -75,6 +76,11 @@ namespace currency else return CURRENT_BLOCK_MAJOR_VERSION; } + + uint8_t get_block_minor_version_by_height(uint64_t height) const + { + return HF3_BLOCK_MINOR_VERSION; + } }; diff --git a/src/currency_core/currency_config.h b/src/currency_core/currency_config.h index 8e70a2be..b229e932 100644 --- a/src/currency_core/currency_config.h +++ b/src/currency_core/currency_config.h @@ -33,6 +33,7 @@ #define TRANSACTION_VERSION_POST_HF4 2 #define HF1_BLOCK_MAJOR_VERSION 1 #define HF3_BLOCK_MAJOR_VERSION 2 +#define HF3_BLOCK_MINOR_VERSION 0 #define CURRENT_BLOCK_MAJOR_VERSION 3 #define CURRENT_BLOCK_MINOR_VERSION 0 @@ -253,9 +254,9 @@ #define ZANO_HARDFORK_04_AFTER_HEIGHT 999999999 #else /////// Zarcanum Testnet Pre-Alpha ////////////////////////////// -#define ZANO_HARDFORK_01_AFTER_HEIGHT 1 -#define ZANO_HARDFORK_02_AFTER_HEIGHT 1 -#define ZANO_HARDFORK_03_AFTER_HEIGHT 1 +#define ZANO_HARDFORK_01_AFTER_HEIGHT 0 +#define ZANO_HARDFORK_02_AFTER_HEIGHT 0 +#define ZANO_HARDFORK_03_AFTER_HEIGHT 0 #define ZANO_HARDFORK_04_AFTER_HEIGHT CURRENCY_MAX_BLOCK_NUMBER #endif diff --git a/tests/core_tests/block_validation.cpp b/tests/core_tests/block_validation.cpp index 85e9aa1f..d210a6b2 100644 --- a/tests/core_tests/block_validation.cpp +++ b/tests/core_tests/block_validation.cpp @@ -54,6 +54,7 @@ namespace bool gen_block_big_major_version::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); block blk_1; generator.construct_block_manually(blk_1, blk_0, miner_account, test_generator::bf_major_ver, CURRENT_BLOCK_MAJOR_VERSION + 1); @@ -67,6 +68,7 @@ bool gen_block_big_major_version::generate(std::vector& events bool gen_block_big_minor_version::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); block blk_1; generator.construct_block_manually(blk_1, blk_0, miner_account, test_generator::bf_minor_ver, 0, CURRENT_BLOCK_MINOR_VERSION + 1); @@ -80,6 +82,7 @@ bool gen_block_big_minor_version::generate(std::vector& events bool gen_block_ts_not_checked::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); REWIND_BLOCKS_N(events, blk_0r, blk_0, miner_account, BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW - 2); block blk_1; @@ -94,6 +97,7 @@ bool gen_block_ts_not_checked::generate(std::vector& events) c bool gen_block_ts_in_past::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); REWIND_BLOCKS_N(events, blk_0r, blk_0, miner_account, BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW - 1); uint64_t ts_below_median = boost::get(events[BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW / 2 - 1]).timestamp; @@ -109,7 +113,7 @@ bool gen_block_ts_in_past::generate(std::vector& events) const bool gen_block_ts_in_future::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); block blk_1; generator.construct_block_manually(blk_1, blk_0, miner_account, test_generator::bf_timestamp, 0, 0, time(NULL) + 60*60 + CURRENCY_BLOCK_FUTURE_TIME_LIMIT); events.push_back(blk_1); @@ -122,7 +126,7 @@ bool gen_block_ts_in_future::generate(std::vector& events) con bool gen_block_invalid_prev_id::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); block blk_1; crypto::hash prev_id = get_block_hash(blk_0); reinterpret_cast(prev_id) ^= 1; @@ -145,7 +149,7 @@ bool gen_block_invalid_prev_id::check_block_verification_context(const currency: bool gen_block_invalid_nonce::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); std::vector timestamps; std::vector commulative_difficulties; if (!lift_up_difficulty(events, timestamps, commulative_difficulties, generator, 2, blk_0, miner_account)) @@ -175,7 +179,7 @@ bool gen_block_invalid_nonce::generate(std::vector& events) co bool gen_block_no_miner_tx::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); transaction miner_tx; miner_tx = AUTO_VAL_INIT(miner_tx); @@ -207,7 +211,7 @@ bool gen_block_unlock_time_is_low::generate(std::vector& event bool gen_block_unlock_time_is_high::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); set_tx_unlock_time(miner_tx, get_tx_max_unlock_time(miner_tx) + 1); @@ -239,7 +243,7 @@ bool gen_block_unlock_time_is_timestamp_in_past::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); set_tx_unlock_time(miner_tx, blk_0.timestamp + 3 * CURRENCY_MINED_MONEY_UNLOCK_WINDOW * DIFFICULTY_BLOCKS_ESTIMATE_TIMESPAN); @@ -255,7 +259,7 @@ bool gen_block_unlock_time_is_timestamp_in_future::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); boost::get(miner_tx.vin[0]).height--; @@ -271,7 +275,7 @@ bool gen_block_height_is_low::generate(std::vector& events) co bool gen_block_height_is_high::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); boost::get(miner_tx.vin[0]).height++; @@ -287,7 +291,7 @@ bool gen_block_height_is_high::generate(std::vector& events) c bool gen_block_miner_tx_has_2_tx_gen_in::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); txin_gen in; @@ -306,6 +310,7 @@ bool gen_block_miner_tx_has_2_tx_gen_in::generate(std::vector& bool gen_block_miner_tx_has_2_in::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); REWIND_BLOCKS(events, blk_0r, blk_0, miner_account); GENERATE_ACCOUNT(alice); @@ -348,8 +353,9 @@ bool gen_block_miner_tx_has_2_in::generate(std::vector& events } bool gen_block_miner_tx_with_txin_to_key::generate(std::vector& events) const -{ +{ BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); // This block has only one output block blk_1 = AUTO_VAL_INIT(blk_1); @@ -397,7 +403,7 @@ bool gen_block_miner_tx_with_txin_to_key::generate(std::vector bool gen_block_miner_tx_out_is_small::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); boost::get( miner_tx.vout[0]).amount /= 2; @@ -413,7 +419,7 @@ boost::get( miner_tx.vout[0]).amount /= 2; bool gen_block_miner_tx_out_is_big::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); boost::get( miner_tx.vout[0]).amount *= 2; @@ -429,7 +435,7 @@ boost::get( miner_tx.vout[0]).amount *= 2; bool gen_block_miner_tx_has_no_out::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); miner_tx.vout.clear(); @@ -445,7 +451,7 @@ bool gen_block_miner_tx_has_no_out::generate(std::vector& even bool gen_block_miner_tx_has_out_to_alice::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); GENERATE_ACCOUNT(alice); keypair txkey; @@ -474,7 +480,7 @@ boost::get( miner_tx.vout[0]).amount -= out_to_alice.amo bool gen_block_has_invalid_tx::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); std::vector tx_hashes; tx_hashes.push_back(crypto::hash()); @@ -490,7 +496,7 @@ bool gen_block_has_invalid_tx::generate(std::vector& events) c bool gen_block_is_too_big::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); // Creating a huge miner_tx, it will have a lot of outs MAKE_MINER_TX_MANUALLY(miner_tx, blk_0); static const size_t tx_out_count = CURRENCY_BLOCK_GRANTED_FULL_REWARD_ZONE / 2; @@ -537,7 +543,7 @@ gen_block_invalid_binary_format::gen_block_invalid_binary_format() bool gen_block_invalid_binary_format::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); - + SET_HARDFORKS_TO_OLD_TESTS(); //wide_difficulty_type cummulative_diff = 1; // Unlock blk_0 outputs @@ -705,6 +711,7 @@ bool gen_block_wrong_version_agains_hardfork::c1(currency::core& c, size_t ev_in bool gen_block_wrong_version_agains_hardfork::generate(std::vector& events) const { BLOCK_VALIDATION_INIT_GENERATE(); + SET_HARDFORKS_TO_OLD_TESTS(); DO_CALLBACK(events, "c1"); return true; } \ No newline at end of file diff --git a/tests/core_tests/block_validation.h b/tests/core_tests/block_validation.h index 0ce700ba..70543890 100644 --- a/tests/core_tests/block_validation.h +++ b/tests/core_tests/block_validation.h @@ -35,7 +35,7 @@ public: return true; } - currency::hard_forks_descriptor m_hardforks; + mutable currency::hard_forks_descriptor m_hardforks; }; template @@ -56,7 +56,7 @@ struct gen_block_accepted_base : public test_chain_unit_base } }; -struct gen_block_big_major_version : public gen_block_verification_base<1> +struct gen_block_big_major_version : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; @@ -76,83 +76,83 @@ struct gen_block_ts_in_past : public gen_block_verification_base& events) const; }; -struct gen_block_ts_in_future : public gen_block_verification_base<1> +struct gen_block_ts_in_future : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_invalid_prev_id : public gen_block_verification_base<1> +struct gen_block_invalid_prev_id : public gen_block_verification_base<2> { bool generate(std::vector& events) const; bool check_block_verification_context(const currency::block_verification_context& bvc, size_t event_idx, const currency::block& /*blk*/); }; -struct gen_block_invalid_nonce : public gen_block_verification_base<3> +struct gen_block_invalid_nonce : public gen_block_verification_base<4> { bool generate(std::vector& events) const; }; -struct gen_block_no_miner_tx : public gen_block_verification_base<1> +struct gen_block_no_miner_tx : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_unlock_time_is_low : public gen_block_verification_base<1> +struct gen_block_unlock_time_is_low : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_unlock_time_is_high : public gen_block_verification_base<1> +struct gen_block_unlock_time_is_high : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_unlock_time_is_timestamp_in_past : public gen_block_verification_base<1> +struct gen_block_unlock_time_is_timestamp_in_past : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_unlock_time_is_timestamp_in_future : public gen_block_verification_base<1> +struct gen_block_unlock_time_is_timestamp_in_future : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_height_is_low : public gen_block_verification_base<1> +struct gen_block_height_is_low : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_height_is_high : public gen_block_verification_base<1> +struct gen_block_height_is_high : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_has_2_tx_gen_in : public gen_block_verification_base<1> +struct gen_block_miner_tx_has_2_tx_gen_in : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_has_2_in : public gen_block_verification_base +struct gen_block_miner_tx_has_2_in : public gen_block_verification_base { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_with_txin_to_key : public gen_block_verification_base +struct gen_block_miner_tx_with_txin_to_key : public gen_block_verification_base { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_out_is_small : public gen_block_verification_base<1> +struct gen_block_miner_tx_out_is_small : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_out_is_big : public gen_block_verification_base<1> +struct gen_block_miner_tx_out_is_big : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_miner_tx_has_no_out : public gen_block_verification_base<1> +struct gen_block_miner_tx_has_no_out : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; @@ -162,17 +162,17 @@ struct gen_block_miner_tx_has_out_to_alice : public gen_block_accepted_base<2> bool generate(std::vector& events) const; }; -struct gen_block_has_invalid_tx : public gen_block_verification_base<1> +struct gen_block_has_invalid_tx : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_is_too_big : public gen_block_verification_base<1> +struct gen_block_is_too_big : public gen_block_verification_base<2> { bool generate(std::vector& events) const; }; -struct gen_block_wrong_version_agains_hardfork : public gen_block_verification_base<1> +struct gen_block_wrong_version_agains_hardfork : public gen_block_verification_base<2> { public: gen_block_wrong_version_agains_hardfork(); diff --git a/tests/core_tests/chaingen.cpp b/tests/core_tests/chaingen.cpp index 8822e469..380cfaed 100644 --- a/tests/core_tests/chaingen.cpp +++ b/tests/core_tests/chaingen.cpp @@ -907,7 +907,7 @@ bool test_generator::construct_block(int64_t manual_timestamp_adjustment, { size_t height = get_block_height(prev_block) + 1; blk.major_version = actual_params & bf_major_ver ? major_ver : BLOCK_MAJOR_VERSION_INITIAL; - blk.minor_version = actual_params & bf_minor_ver ? minor_ver : CURRENT_BLOCK_MINOR_VERSION; + blk.minor_version = actual_params & bf_minor_ver ? minor_ver : m_hardforks.get_block_minor_version_by_height(height); blk.timestamp = actual_params & bf_timestamp ? timestamp : (height > 10 ? prev_block.timestamp + DIFFICULTY_BLOCKS_ESTIMATE_TIMESPAN: prev_block.timestamp + DIFFICULTY_BLOCKS_ESTIMATE_TIMESPAN-POW_DIFF_UP_TIMESTAMP_DELTA); // Keep difficulty unchanged blk.prev_id = actual_params & bf_prev_id ? prev_id : get_block_hash(prev_block); blk.tx_hashes = actual_params & bf_tx_hashes ? tx_hashes : std::vector(); diff --git a/tests/core_tests/chaingen.h b/tests/core_tests/chaingen.h index a6222192..0d96d8b4 100644 --- a/tests/core_tests/chaingen.h +++ b/tests/core_tests/chaingen.h @@ -201,6 +201,17 @@ private: } }; +struct core_hardforks_config +{ + std::array hardforks; + + template + void serialize(Archive & ar, const unsigned int /*version*/) + { + ar & hardforks; + } +}; + VARIANT_TAG(binary_archive, callback_entry, 0xcb); VARIANT_TAG(binary_archive, currency::account_base, 0xcc); VARIANT_TAG(binary_archive, serialized_block, 0xcd); @@ -208,8 +219,10 @@ VARIANT_TAG(binary_archive, serialized_transaction, 0xce); VARIANT_TAG(binary_archive, event_visitor_settings, 0xcf); VARIANT_TAG(binary_archive, event_special_block, 0xd0); VARIANT_TAG(binary_archive, event_core_time, 0xd1); +VARIANT_TAG(binary_archive, core_hardforks_config, 0xd2); -typedef boost::variant test_event_entry; + +typedef boost::variant test_event_entry; typedef std::unordered_map map_hash2tx_t; enum test_tx_split_strategy { tests_void_split_strategy, tests_null_split_strategy, tests_digits_split_strategy, tests_random_split_strategy }; @@ -248,7 +261,7 @@ private: callbacks_map m_callbacks; protected: - currency::hard_forks_descriptor m_hardforks; + mutable currency::hard_forks_descriptor m_hardforks; }; struct offers_count_param @@ -568,7 +581,7 @@ public: private: bool m_ignore_last_pow_in_wallets; - currency::hard_forks_descriptor m_hardforks; + mutable currency::hard_forks_descriptor m_hardforks; std::unordered_map m_blocks_info; static test_gentime_settings m_test_gentime_settings; @@ -938,7 +951,11 @@ bool test_generator::construct_block_gentime_with_coinbase_cb(const currency::bl return false; currency::wide_difficulty_type diff = get_difficulty_for_next_block(prev_id, true); - r = construct_block_manually(b, prev_block, acc, test_generator::block_fields::bf_miner_tx, 0, 0, 0, prev_id, diff, miner_tx); + r = construct_block_manually(b, prev_block, acc, + test_generator::block_fields::bf_miner_tx| test_generator::block_fields::bf_major_ver | test_generator::block_fields::bf_minor_ver, + m_hardforks.get_block_major_version_by_height(height), + m_hardforks.get_block_minor_version_by_height(height), + 0, prev_id, diff, miner_tx); CHECK_AND_ASSERT_MES(r, false, "construct_block_manually failed"); return true; @@ -1238,6 +1255,19 @@ void append_vector_by_another_vector(U& dst, const V& src) #define ADD_CUSTOM_EVENT(VEC_EVENTS, EVENT_OBJ) PRINT_EVENT_N_TEXT(VEC_EVENTS, #EVENT_OBJ); VEC_EVENTS.push_back(EVENT_OBJ) + +#define SET_HARDFORKS_TO_OLD_TESTS() \ + core_hardforks_config hardforks_update = AUTO_VAL_INIT(hardforks_update); \ + hardforks_update.hardforks = get_default_core_runtime_config().hard_forks.m_height_the_hardfork_n_active_after; \ + hardforks_update.hardforks[1] = 1440; \ + hardforks_update.hardforks[2] = 1800; \ + hardforks_update.hardforks[3] = 1801; \ + currency::hard_forks_descriptor hardforks_desc = AUTO_VAL_INIT(hardforks_desc); \ + hardforks_desc.m_height_the_hardfork_n_active_after = hardforks_update.hardforks; \ + generator.set_hardforks(hardforks_desc); \ + m_hardforks.m_height_the_hardfork_n_active_after = hardforks_desc.m_height_the_hardfork_n_active_after; \ + events.push_back(hardforks_update); + // --- gentime wallet helpers ----------------------------------------------------------------------- #define CREATE_TEST_WALLET(WLT_VAR, ACCOUNT, GENESIS_BLOCK) \ diff --git a/tests/core_tests/chaingen_main.cpp b/tests/core_tests/chaingen_main.cpp index 7e0c0169..f8627801 100644 --- a/tests/core_tests/chaingen_main.cpp +++ b/tests/core_tests/chaingen_main.cpp @@ -526,6 +526,20 @@ public: return true; } + bool operator()(const core_hardforks_config& e) const + { + currency::core_runtime_config crc = m_c.get_blockchain_storage().get_core_runtime_config(); + crc.hard_forks.m_height_the_hardfork_n_active_after = e.hardforks; + m_c.get_blockchain_storage().set_core_runtime_config(crc); + std::stringstream ss; ss << "core_hardforks updated:" << ENDL; + for (size_t i = 0; i != crc.hard_forks.m_height_the_hardfork_n_active_after.size(); i++) + { + ss << i << ": " << crc.hard_forks.m_height_the_hardfork_n_active_after[i] << ENDL; + } + log_event(ss.str()); + return true; + } + private: void log_event(const std::string& event_type) const { @@ -790,6 +804,7 @@ int main(int argc, char* argv[]) // TODO // GENERATE_AND_PLAY(wallet_spend_form_auditable_and_track); + GENERATE_AND_PLAY(gen_block_big_major_version); GENERATE_AND_PLAY(pos_minting_tx_packing);