chaingen: 1) shuffle_source_entries impemented; 2) zarcanum_txs_with_big_decoy_set improved for pre-HF4 part

This commit is contained in:
sowle 2022-11-09 16:57:48 +01:00
parent 266a0556ce
commit c542b86200
No known key found for this signature in database
GPG key ID: C07A24B2D89D49FC
3 changed files with 58 additions and 20 deletions

View file

@ -2087,6 +2087,29 @@ bool check_mixin_value_for_each_input(size_t mixin, const crypto::hash& tx_id, c
return true;
}
// randomly shuffles tx_source_entry, restores the correct real_output afterwards
bool shuffle_source_entry(tx_source_entry& se)
{
if (se.outputs.size() < 2)
return true;
tx_source_entry::output_entry real_out_entry = se.outputs[se.real_output]; // store the real one
std::shuffle(se.outputs.begin(), se.outputs.end(), crypto::uniform_random_bit_generator{}); // shuffle
auto it = std::find(se.outputs.begin(), se.outputs.end(), real_out_entry); // where is the real one now?
CHECK_AND_ASSERT_MES(it != se.outputs.end(), false, "cannot find the real one output entry");
se.real_output = it - se.outputs.begin(); // restore the real output index
return true;
}
// randomly shuffles std::vector<tx_source_entry>, restores the correct real_output afterwards
bool shuffle_source_entries(std::vector<tx_source_entry>& sources)
{
for(auto& se : sources)
if (!shuffle_source_entry(se))
return false;
return true;
}
//------------------------------------------------------------------------------
void test_chain_unit_base::register_callback(const std::string& cb_name, verify_callback cb)

View file

@ -694,6 +694,9 @@ bool check_ring_signature_at_gen_time(const std::vector<test_event_entry>& event
bool check_mixin_value_for_each_input(size_t mixin, const crypto::hash& tx_id, currency::core& c);
bool shuffle_source_entry(currency::tx_source_entry& se);
bool shuffle_source_entries(std::vector<currency::tx_source_entry>& sources);
//--------------------------------------------------------------------------
template<class t_test_class>
auto do_check_tx_verification_context(const currency::tx_verification_context& tvc, bool tx_added, size_t event_index, const currency::transaction& tx, t_test_class& validator, int)

View file

@ -408,7 +408,7 @@ bool zarcanum_pos_block_math::generate(std::vector<test_event_entry>& events) co
zarcanum_txs_with_big_decoy_set::zarcanum_txs_with_big_decoy_set()
{
m_hardforks.set_hardfork_height(ZANO_HARDFORK_04_ZARCANUM, 100);
m_hardforks.set_hardfork_height(ZANO_HARDFORK_04_ZARCANUM, 24);
}
bool zarcanum_txs_with_big_decoy_set::generate(std::vector<test_event_entry>& events) const
@ -430,38 +430,29 @@ bool zarcanum_txs_with_big_decoy_set::generate(std::vector<test_event_entry>& ev
REWIND_BLOCKS_N_WITH_TIME(events, blk_0r, blk_0, miner_acc, CURRENCY_MINED_MONEY_UNLOCK_WINDOW);
uint64_t alice_amount = CURRENCY_BLOCK_REWARD;
MAKE_TX(events, tx_0, miner_acc, alice_acc, alice_amount, blk_0r);
MAKE_NEXT_BLOCK_TX1(events, blk_1, blk_0r, miner_acc, tx_0);
MAKE_TX(events, tx_0_a, miner_acc, alice_acc, alice_amount, blk_0r);
MAKE_TX(events, tx_0_b, miner_acc, alice_acc, alice_amount, blk_0r);
std::list<transaction> txs{ tx_0_a, tx_0_b };
MAKE_NEXT_BLOCK_TX_LIST(events, blk_1, blk_0r, miner_acc, txs);
REWIND_BLOCKS_N_WITH_TIME(events, blk_1r, blk_1, miner_acc, CURRENCY_MINED_MONEY_UNLOCK_WINDOW);
// do a gen-time balance check
CREATE_TEST_WALLET(alice_wlt, alice_acc, blk_0);
REFRESH_TEST_WALLET_AT_GEN_TIME(events, alice_wlt, blk_1r, 2 * CURRENCY_MINED_MONEY_UNLOCK_WINDOW + 1);
CHECK_TEST_WALLET_BALANCE_AT_GEN_TIME(alice_wlt, alice_amount);
CHECK_TEST_WALLET_BALANCE_AT_GEN_TIME(alice_wlt, 2 * alice_amount);
DO_CALLBACK_PARAMS(events, "check_balance", params_check_balance(ALICE_ACC_IDX, alice_amount, alice_amount, 0, 0, 0));
DO_CALLBACK_PARAMS(events, "check_balance", params_check_balance(ALICE_ACC_IDX, 2 * alice_amount, 2 * alice_amount, 0, 0, 0));
std::vector<tx_source_entry> sources;
std::vector<tx_destination_entry> destinations;
// tx_1: Alice -> miner, all coins back
size_t nmix = 10; // use big decoy set
// tx_1: Alice -> miner with big decoy set
size_t nmix = 10;
CHECK_AND_ASSERT_MES(fill_tx_sources_and_destinations(events, blk_1r, alice_acc, miner_acc, alice_amount - TESTS_DEFAULT_FEE, TESTS_DEFAULT_FEE, nmix, sources, destinations), false, "");
// randomly move the real output for each source entry
for(auto& src : sources)
{
if (src.outputs.size() > 1)
{
uint64_t rnd_from_1_to_max = 1 + crypto::rand<uint64_t>() % (src.outputs.size() - 1);
uint64_t new_real_output = (src.real_output + rnd_from_1_to_max) % src.outputs.size(); // to avoid new_real_output == src.real_output
tx_source_entry::output_entry tmp = src.outputs[new_real_output];
src.outputs[new_real_output] = src.outputs[src.real_output];
src.outputs[src.real_output] = tmp;
src.real_output = new_real_output;
}
}
// randomly source entries (real_output will be changed accordingly)
CHECK_AND_ASSERT_MES(shuffle_source_entries(sources), false, "shuffle_source_entries failed");
transaction tx_1{};
r = construct_tx(alice_acc.get_keys(), sources, destinations, empty_attachment, tx_1, get_tx_version_from_events(events), 0 /* unlock time */);
@ -469,8 +460,29 @@ bool zarcanum_txs_with_big_decoy_set::generate(std::vector<test_event_entry>& ev
ADD_CUSTOM_EVENT(events, tx_1);
MAKE_NEXT_BLOCK_TX1(events, blk_2, blk_1r, miner_acc, tx_1);
// tx_2 (the same as tx_1): Alice -> miner, big decoy set, all coins are back now
sources.clear();
destinations.clear();
nmix = 10;
CHECK_AND_ASSERT_MES(fill_tx_sources_and_destinations(events, blk_2, alice_acc, miner_acc, alice_amount - TESTS_DEFAULT_FEE, TESTS_DEFAULT_FEE, nmix, sources, destinations), false, "");
CHECK_AND_ASSERT_MES(shuffle_source_entries(sources), false, "shuffle_source_entries failed");
transaction tx_2{};
r = construct_tx(alice_acc.get_keys(), sources, destinations, empty_attachment, tx_2, get_tx_version_from_events(events), 0 /* unlock time */);
CHECK_AND_ASSERT_MES(r, false, "construct_tx failed");
ADD_CUSTOM_EVENT(events, tx_2);
MAKE_NEXT_BLOCK_TX1(events, blk_3, blk_2, miner_acc, tx_2);
// make sure Alice has no coins left
DO_CALLBACK_PARAMS(events, "check_balance", params_check_balance(ALICE_ACC_IDX, 0, 0, 0, 0, 0));
// now do the same after HF4
// make sure the hardfork goes well
DO_CALLBACK_PARAMS(events, "check_hardfork_inactive", static_cast<size_t>(ZANO_HARDFORK_04_ZARCANUM));
MAKE_NEXT_BLOCK(events, blk_4, blk_3, miner_acc);
DO_CALLBACK_PARAMS(events, "check_hardfork_active", static_cast<size_t>(ZANO_HARDFORK_04_ZARCANUM));
/*