From 94c9c0cebca8f40c7be495b1f67c3cc16df35ae3 Mon Sep 17 00:00:00 2001 From: sowle Date: Wed, 16 Nov 2022 02:31:22 +0100 Subject: [PATCH] chaingen: 1) added support of mixins for build_wallets (via proxy stub); 2) add_block_info adatped for zc inputs + minor improvements --- tests/core_tests/chaingen.cpp | 84 ++++++++++++++++++++++++++++++----- tests/core_tests/chaingen.h | 13 ++++-- 2 files changed, 82 insertions(+), 15 deletions(-) diff --git a/tests/core_tests/chaingen.cpp b/tests/core_tests/chaingen.cpp index d1f93321..8c9e3084 100644 --- a/tests/core_tests/chaingen.cpp +++ b/tests/core_tests/chaingen.cpp @@ -193,7 +193,7 @@ bool test_generator::add_block_info(const currency::block& b, const std::listb); - sk.kimage = boost::get(b.miner_tx.vin[1]).k_image; + sk.kimage = get_key_image_from_txin_v(b.miner_tx.vin[1]); sk.block_timestamp = b.timestamp; sk_hash = crypto::cn_fast_hash(&sk, sizeof(sk)); } @@ -259,10 +259,9 @@ bool test_generator::construct_block(currency::block& blk, build_outputs_indext_for_chain(blocks, oi, txs_outs); //build wallets - build_wallets(blocks, coin_stake_sources, txs_outs, wallets); + build_wallets(blocks, coin_stake_sources, txs_outs, oi, wallets); r = find_kernel(coin_stake_sources, blocks, - oi, wallets, pe, won_walled_index, @@ -361,6 +360,7 @@ bool test_generator::sign_block(const tools::wallet2::mining_context& mining_con bool test_generator::build_wallets(const blockchain_vector& blockchain, const std::list& accs, const tx_global_indexes& txs_outs, + const outputs_index& oi, wallets_vector& wallets, const core_runtime_config& cc) { @@ -369,10 +369,12 @@ bool test_generator::build_wallets(const blockchain_vector& blockchain, const tx_global_indexes& m_txs_outs; const blockchain_vector& m_blockchain; const core_runtime_config& m_core_runtime_config; + const outputs_index& m_outputs_index; - stub_core_proxy(const blockchain_vector& blockchain, const tx_global_indexes& txs_outs, const core_runtime_config& crc) + stub_core_proxy(const blockchain_vector& blockchain, const tx_global_indexes& txs_outs, const outputs_index& oi, const core_runtime_config& crc) : m_blockchain(blockchain) , m_txs_outs(txs_outs) + , m_outputs_index(oi) , m_core_runtime_config(crc) {} @@ -412,9 +414,68 @@ bool test_generator::build_wallets(const blockchain_vector& blockchain, return true; } - }; + bool call_COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS(const currency::COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::request& rqt, currency::COMMAND_RPC_GET_RANDOM_OUTPUTS_FOR_AMOUNTS::response& rsp) override + { + for (uint64_t amount : rqt.amounts) + { + rsp.outs.resize(rsp.outs.size() + 1); + auto& rsp_entry = rsp.outs.back(); + rsp_entry.amount = amount; + auto it = m_outputs_index.find(amount); + if (it == m_outputs_index.end()) + continue; - std::shared_ptr tmp_proxy(new stub_core_proxy(blockchain, txs_outs, cc)); + std::vector random_mapping(it->second.size()); + for(size_t i = 0; i < random_mapping.size(); ++i) + random_mapping[i] = i; + std::shuffle(random_mapping.begin(), random_mapping.end(), crypto::uniform_random_bit_generator()); + + for (size_t gindex : random_mapping) + { + const out_index_info& oii = it->second[gindex]; + if (rqt.height_upper_limit != 0 && oii.block_height > rqt.height_upper_limit) + continue; + const transaction& tx = oii.in_block_tx_index == 0 ? m_blockchain[oii.block_height]->b.miner_tx : m_blockchain[oii.block_height]->m_transactions[oii.in_block_tx_index]; + auto& out_v = tx.vout[oii.in_tx_out_index]; + uint8_t mix_attr = 0; + if (!get_mix_attr_from_tx_out_v(out_v, mix_attr)) + continue; + if (mix_attr == CURRENCY_TO_KEY_OUT_FORCED_NO_MIX) + continue; + if (rqt.use_forced_mix_outs && mix_attr == CURRENCY_TO_KEY_OUT_RELAXED) + continue; + if (mix_attr != CURRENCY_TO_KEY_OUT_RELAXED && mix_attr > rqt.decoys_count) + continue; + + if (amount == 0 && out_v.type() == typeid(tx_out_zarcanum)) + { + const tx_out_zarcanum& out_zc = boost::get(out_v); + rsp_entry.outs.emplace_back(gindex, out_zc.stealth_address, out_zc.amount_commitment, out_zc.concealing_point); + } + else if (amount != 0 && out_v.type() == typeid(tx_out_bare)) + { + txout_target_v out_tv = boost::get(out_v).target; + if (out_tv.type() != typeid(txout_to_key)) + continue; + rsp_entry.outs.emplace_back(gindex, boost::get(out_tv).key); + } + if (rsp_entry.outs.size() >= rqt.decoys_count) + break; + } + if (rsp_entry.outs.size() < rqt.decoys_count) + { + rsp.status = API_RETURN_CODE_NOT_ENOUGH_OUTPUTS_FOR_MIXING; + return true; + } + } + + rsp.status = API_RETURN_CODE_OK; + return true; + } + + }; // struct stub_core_proxy + + std::shared_ptr tmp_proxy(new stub_core_proxy(blockchain, txs_outs, oi, cc)); //build wallets wallets.clear(); @@ -471,7 +532,7 @@ bool test_generator::build_wallets(const crypto::hash& blockchain_head, const st get_block_chain(blocks, blockchain_head, std::numeric_limits::max()); build_outputs_indext_for_chain(blocks, oi, txs_outs); - return build_wallets(blocks, accounts, txs_outs, wallets, cc); + return build_wallets(blocks, accounts, txs_outs, oi, wallets, cc); } size_t test_generator::get_tx_out_gindex(const crypto::hash& blockchain_head, const crypto::hash& tx_hash, const size_t output_index) const @@ -509,7 +570,6 @@ uint64_t test_generator::get_timestamps_median(const crypto::hash& blockchain_he bool test_generator::find_kernel(const std::list& accs, const blockchain_vector& blck_chain, - const outputs_index& indexes, wallets_vector& wallets, currency::pos_entry& pe, size_t& found_wallet_index, @@ -577,7 +637,7 @@ bool test_generator::build_outputs_indext_for_chain(const blockchain_vector& blo { uint64_t amount = get_amount_from_variant(blocks[h]->b.miner_tx.vout[out_i]); coinbase_outs.push_back(index[amount].size()); - index[amount].push_back(std::tuple(h, 0, out_i)); + index[amount].push_back(out_index_info{h, 0, out_i}); } for (size_t tx_index = 0; tx_index != blocks[h]->m_transactions.size(); tx_index++) @@ -587,7 +647,7 @@ bool test_generator::build_outputs_indext_for_chain(const blockchain_vector& blo { uint64_t amount = get_amount_from_variant(blocks[h]->m_transactions[tx_index].vout[out_i]); tx_outs_indx.push_back(index[amount].size()); - index[amount].push_back(std::tuple(h, tx_index + 1, out_i)); + index[amount].push_back(out_index_info{h, tx_index + 1, out_i}); } } } @@ -932,7 +992,7 @@ bool test_generator::construct_pow_block_with_alias_info_in_coinbase(const accou struct output_index { const currency::tx_out_v out_v; - uint64_t amount; + uint64_t amount; // actual amount (decoded, cannot be zero) size_t tx_no; // index of transaction in block size_t out_no; // index of out in transaction size_t idx; // global index @@ -969,7 +1029,7 @@ struct output_index }*/ }; -typedef std::map > map_output_t; // amount -> [N -> global out index] +typedef std::map > map_output_t; // amount -> [N -> global out index] (for 'my' outputs, no specific order) typedef std::map > map_output_idx_t; // amount -> [global out index -> 'output_index'] typedef std::pair outloc_t; diff --git a/tests/core_tests/chaingen.h b/tests/core_tests/chaingen.h index 32fa8f86..c4abf92a 100644 --- a/tests/core_tests/chaingen.h +++ b/tests/core_tests/chaingen.h @@ -375,9 +375,16 @@ public: crypto::hash ks_hash; }; - // amount vec_ind, tx_index, out index in tx - typedef std::map > > outputs_index; - typedef std::unordered_map > tx_global_indexes; + + struct out_index_info + { + size_t block_height; + size_t in_block_tx_index; + size_t in_tx_out_index; + }; + + typedef std::map > outputs_index; // amount -> [gindex -> out_index_info] + typedef std::unordered_map > tx_global_indexes; // tx_hash -> vector of tx's outputs global indices typedef std::vector blockchain_vector;