From 41308d86a6a4d5cdb4cc466094d577abcd07c510 Mon Sep 17 00:00:00 2001 From: sowle Date: Fri, 9 Sep 2022 20:16:14 +0200 Subject: [PATCH] wallet: pos code clean up (mining_context, etc) --- src/wallet/wallet2.cpp | 72 +++++++++++------------------ src/wallet/wallet2.h | 68 ++++++++------------------- src/wallet/wallets_manager.cpp | 6 +-- tests/core_tests/chaingen_helpers.h | 4 +- 4 files changed, 51 insertions(+), 99 deletions(-) diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 3c1e6377..910f255e 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -3533,16 +3533,6 @@ bool wallet2::get_pos_entries(std::vector& entries) if (!is_transfer_okay_for_pos(tr, stake_unlock_time)) continue; - // We don't need to prefetch PoS outputs anymore as gindex in not required and fetched in construct_miner_tx - // I commented this out, CZ, please, review this change -- sowle - //if (tr.m_global_output_index == WALLET_GLOBAL_OUTPUT_INDEX_UNDEFINED) - //{ - // //TODO: this code needed mostly for coretests, since in real life cases only mobile wallet supposed to - // // have WALLET_GLOBAL_OUTPUT_INDEX_UNDEFINED, and mobile wallet is not supposed to do PoS mining - // std::vector indicies; indicies.push_back(i); - // prefetch_global_indicies_if_needed(indicies); - //} - pos_entry pe = AUTO_VAL_INIT(pe); pe.amount = tr.amount(); pe.g_index = tr.m_global_output_index; @@ -3621,16 +3611,6 @@ bool wallet2::prepare_and_sign_pos_block(currency::block& b, return false; // to get rid of warning } //------------------------------------------------------------------ -bool wallet2::build_kernel(const pos_entry& pe, const stake_modifier_type& stake_modifier, const uint64_t timestamp, stake_kernel& kernel) -{ - PROFILE_FUNC("build_kernel"); - kernel = stake_kernel(); - kernel.kimage = pe.keyimage; - kernel.stake_modifier = stake_modifier; - kernel.block_timestamp = timestamp; - return true; -} -//---------------------------------------------------------------------------------------------------- bool wallet2::fill_mining_context(mining_context& ctx) { //bool r = get_pos_entries(ctx.sp.pos_entries); // TODO: Remove this call. Transfers are filtered in scan_pos @@ -3638,7 +3618,7 @@ bool wallet2::fill_mining_context(mining_context& ctx) currency::COMMAND_RPC_GET_POS_MINING_DETAILS::request pos_details_req = AUTO_VAL_INIT(pos_details_req); currency::COMMAND_RPC_GET_POS_MINING_DETAILS::response pos_details_resp = AUTO_VAL_INIT(pos_details_resp); - ctx.rsp.status = API_RETURN_CODE_NOT_FOUND; + ctx.status = API_RETURN_CODE_NOT_FOUND; m_core_proxy->call_COMMAND_RPC_GET_POS_MINING_DETAILS(pos_details_req, pos_details_resp); if (pos_details_resp.status != API_RETURN_CODE_OK) return false; @@ -3652,10 +3632,10 @@ bool wallet2::fill_mining_context(mining_context& ctx) ctx.last_pow_block_id_hashed = crypto::hash_helper_t::hs(CRYPTO_HDS_ZARCANUM_LAST_POW_HASH, ctx.sm.last_pow_id); } - ctx.rsp.last_block_hash = pos_details_resp.last_block_hash; - ctx.rsp.is_pos_allowed = pos_details_resp.pos_mining_allowed; - ctx.rsp.starter_timestamp = pos_details_resp.starter_timestamp; - ctx.rsp.status = API_RETURN_CODE_OK; + ctx.last_block_hash = pos_details_resp.last_block_hash; + ctx.is_pos_allowed = pos_details_resp.pos_mining_allowed; + ctx.starter_timestamp = pos_details_resp.starter_timestamp; + ctx.status = API_RETURN_CODE_OK; return true; } //------------------------------------------------------------------ @@ -3669,7 +3649,7 @@ bool wallet2::try_mint_pos(const currency::account_public_address& miner_address mining_context ctx = AUTO_VAL_INIT(ctx); WLT_LOG_L1("Starting PoS mining iteration"); fill_mining_context(ctx); - if (!ctx.rsp.is_pos_allowed) + if (!ctx.is_pos_allowed) { WLT_LOG_YELLOW("POS MINING NOT ALLOWED YET", LOG_LEVEL_0); return true; @@ -3691,12 +3671,12 @@ bool wallet2::try_mint_pos(const currency::account_public_address& miner_address return true; }, m_core_runtime_config); - if (ctx.rsp.status == API_RETURN_CODE_OK) + if (ctx.status == API_RETURN_CODE_OK) { build_minted_block(ctx, miner_address); } - WLT_LOG_L0("PoS mining: " << ctx.iterations_processed << " iterations finished, status: " << ctx.rsp.status << ", " << ctx.total_items_checked << " entries with total amount: " << print_money_brief(ctx.total_amount_checked)); + WLT_LOG_L0("PoS mining: " << ctx.iterations_processed << " iterations finished, status: " << ctx.status << ", " << ctx.total_items_checked << " entries with total amount: " << print_money_brief(ctx.total_amount_checked)); return true; } @@ -3747,8 +3727,8 @@ bool wallet2::do_pos_mining_iteration(mining_context& cxt, size_t transfer_index } if (found) { - //cxt.rsp.index = pos_entry_index; - cxt.rsp.block_timestamp = ts; + //cxt.index = pos_entry_index; + cxt.block_timestamp = ts; LOG_PRINT_GREEN("Found kernel: amount: " << currency::print_money_brief(stake_amount) << ENDL << "difficulty: " << cxt.basic_diff << ", final_diff: " << final_diff << ENDL @@ -3788,7 +3768,7 @@ bool wallet2::build_minted_block(const mining_context& cxt, //found a block, construct it, sign and push to daemon WLT_LOG_GREEN("Found kernel, constructing block", LOG_LEVEL_0); - //CHECK_AND_NO_ASSERT_MES(cxt.rsp.index < cxt.sp.pos_entries.size(), false, "call_COMMAND_RPC_SCAN_POS returned wrong index: " << cxt.rsp.index << ", expected less then " << cxt.sp.pos_entries.size()); + //CHECK_AND_NO_ASSERT_MES(cxt.index < cxt.sp.pos_entries.size(), false, "call_COMMAND_RPC_SCAN_POS returned wrong index: " << cxt.index << ", expected less then " << cxt.sp.pos_entries.size()); pos_entry pe = AUTO_VAL_INIT(pe); @@ -3798,14 +3778,14 @@ bool wallet2::build_minted_block(const mining_context& cxt, tmpl_req.wallet_address = get_account_address_as_str(miner_address); tmpl_req.stakeholder_address = get_account_address_as_str(m_account.get_public_address()); tmpl_req.pos_block = true; - pe.g_index = tmpl_req.pos_g_index = m_transfers[cxt.rsp.index].m_global_output_index; - pe.amount = tmpl_req.pos_amount = m_transfers[cxt.rsp.index].amount();// pe.amount; - pe.keyimage = m_transfers[cxt.rsp.index].m_key_image; - pe.block_timestamp = m_transfers[cxt.rsp.index].m_ptx_wallet_info->m_block_timestamp; - pe.stake_unlock_time = tmpl_req.stake_unlock_time = cxt.rsp.stake_unlock_time; - pe.tx_id = tmpl_req.tx_id = m_transfers[cxt.rsp.index].tx_hash(); - pe.tx_out_index = tmpl_req.tx_out_index = m_transfers[cxt.rsp.index].m_internal_output_index; - pe.wallet_index = cxt.rsp.index; + pe.g_index = tmpl_req.pos_g_index = m_transfers[cxt.index].m_global_output_index; + pe.amount = tmpl_req.pos_amount = m_transfers[cxt.index].amount();// pe.amount; + pe.keyimage = m_transfers[cxt.index].m_key_image; + pe.block_timestamp = m_transfers[cxt.index].m_ptx_wallet_info->m_block_timestamp; + pe.stake_unlock_time = tmpl_req.stake_unlock_time = cxt.stake_unlock_time; + pe.tx_id = tmpl_req.tx_id = m_transfers[cxt.index].tx_hash(); + pe.tx_out_index = tmpl_req.tx_out_index = m_transfers[cxt.index].m_internal_output_index; + pe.wallet_index = cxt.index; //tmpl_req.pos_index = pe.index; // gindex <--- this should be removed as soon as pos_entry::index is replaced with tx_id and tx_out_index // TODO: also fill out tx_id and tx_out_index for mining tx creation @@ -3827,29 +3807,29 @@ bool wallet2::build_minted_block(const mining_context& cxt, res = parse_and_validate_block_from_blob(block_blob, b); WLT_CHECK_AND_ASSERT_MES(res, false, "Failed to create block template after kernel hash found!"); - if (cxt.rsp.last_block_hash != b.prev_id) + if (cxt.last_block_hash != b.prev_id) { - WLT_LOG_YELLOW("Kernel was found but block is behindhand, b.prev_id=" << b.prev_id << ", last_block_hash=" << cxt.rsp.last_block_hash, LOG_LEVEL_0); + WLT_LOG_YELLOW("Kernel was found but block is behindhand, b.prev_id=" << b.prev_id << ", last_block_hash=" << cxt.last_block_hash, LOG_LEVEL_0); return false; } std::vector keys_ptrs; - WLT_CHECK_AND_ASSERT_MES(cxt.rsp.index < m_transfers.size(), + WLT_CHECK_AND_ASSERT_MES(cxt.index < m_transfers.size(), false, "Wrong wallet_index at generating coinbase transacton"); - if (m_transfers[cxt.rsp.index].m_ptx_wallet_info->m_tx.vout[m_transfers[cxt.rsp.index].m_internal_output_index].type() != typeid(tx_out_bare)) + if (m_transfers[cxt.index].m_ptx_wallet_info->m_tx.vout[m_transfers[cxt.index].m_internal_output_index].type() != typeid(tx_out_bare)) { //@#@ review zarcanum here return false; } - const auto& target = boost::get(m_transfers[cxt.rsp.index].m_ptx_wallet_info->m_tx.vout[m_transfers[cxt.rsp.index].m_internal_output_index]).target; + const auto& target = boost::get(m_transfers[cxt.index].m_ptx_wallet_info->m_tx.vout[m_transfers[cxt.index].m_internal_output_index]).target; WLT_CHECK_AND_ASSERT_MES(target.type() == typeid(currency::txout_to_key), false, "wrong type_id in source transaction in coinbase tx"); const currency::txout_to_key& txtokey = boost::get(target); keys_ptrs.push_back(&txtokey.key); // set a real timestamp - b.timestamp = cxt.rsp.block_timestamp; + b.timestamp = cxt.block_timestamp; uint64_t current_timestamp = m_core_runtime_config.get_core_time(); set_block_datetime(current_timestamp, b); WLT_LOG_MAGENTA("Applying actual timestamp: " << current_timestamp, LOG_LEVEL_0); @@ -3858,7 +3838,7 @@ bool wallet2::build_minted_block(const mining_context& cxt, res = prepare_and_sign_pos_block(b, pe, get_tx_pub_key_from_extra(m_transfers[pe.wallet_index].m_ptx_wallet_info->m_tx), - m_transfers[cxt.rsp.index].m_internal_output_index, + m_transfers[cxt.index].m_internal_output_index, keys_ptrs); WLT_CHECK_AND_ASSERT_MES(res, false, "Failed to prepare_and_sign_pos_block"); diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 66c31d3c..c6ea137c 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -446,52 +446,25 @@ namespace tools struct mining_context { - // from struct COMMAND_RPC_SCAN_POS - /*struct request_t - { - std::vector pos_entries; + std::string status; - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(pos_entries) - END_KV_SERIALIZE_MAP() - }; - */ + bool is_pos_allowed; + bool zarcanum; - struct response_t - { - std::string status; - uint64_t index; // index in m_transfers - uint64_t stake_unlock_time; - uint64_t block_timestamp; - uint64_t height; - uint64_t starter_timestamp; - crypto::hash last_block_hash; - bool is_pos_allowed; - - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(status) - KV_SERIALIZE(index) - KV_SERIALIZE(stake_unlock_time) - KV_SERIALIZE(block_timestamp) - KV_SERIALIZE(height) - KV_SERIALIZE(is_pos_allowed) - KV_SERIALIZE(starter_timestamp) - KV_SERIALIZE_VAL_POD_AS_BLOB(last_block_hash); - END_KV_SERIALIZE_MAP() - }; - - //request_t sp; - response_t rsp; + uint64_t index; // index in m_transfers + uint64_t stake_unlock_time; + uint64_t block_timestamp; + uint64_t height; + uint64_t starter_timestamp; + crypto::hash last_block_hash; + crypto::scalar_t last_pow_block_id_hashed; // Zarcanum notation: f' currency::wide_difficulty_type basic_diff; currency::stake_modifier_type sm; - - bool zarcanum; - crypto::scalar_t last_pow_block_id_hashed; // Zarcanum notation: f' - uint64_t iterations_processed = 0; - uint64_t total_items_checked = 0; - uint64_t total_amount_checked = 0; + uint64_t iterations_processed = 0; + uint64_t total_items_checked = 0; + uint64_t total_amount_checked = 0; }; struct expiration_entry_info @@ -1004,7 +977,6 @@ private: currency::COMMAND_RPC_GET_BLOCKS_DIRECT::response& blocks); std::string get_alias_for_address(const std::string& addr); std::vector get_aliases_for_address(const std::string& addr); - static bool build_kernel(const currency::pos_entry& pe, const currency::stake_modifier_type& stake_modifier, const uint64_t timestamp, currency::stake_kernel& kernel); bool is_connected_to_net(); bool is_transfer_okay_for_pos(const transfer_details& tr, uint64_t& stake_unlock_time) const; bool scan_unconfirmed_outdate_tx(); @@ -1347,11 +1319,11 @@ namespace tools idle_condition_cb_t idle_condition_cb, const currency::core_runtime_config &runtime_config) { - cxt.rsp.status = API_RETURN_CODE_NOT_FOUND; + cxt.status = API_RETURN_CODE_NOT_FOUND; uint64_t timstamp_last_idle_call = runtime_config.get_core_time(); cxt.iterations_processed = 0; - uint64_t ts_from = cxt.rsp.starter_timestamp; // median ts of last BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW blocks + uint64_t ts_from = cxt.starter_timestamp; // median ts of last BLOCKCHAIN_TIMESTAMP_CHECK_WINDOW blocks ts_from = ts_from - (ts_from % POS_SCAN_STEP) + POS_SCAN_STEP; uint64_t ts_to = runtime_config.get_core_time() + CURRENCY_POS_BLOCK_FUTURE_TIME_LIMIT - 5; ts_to = ts_to - (ts_to % POS_SCAN_STEP); @@ -1400,7 +1372,7 @@ namespace tools if (!idle_condition_cb()) { LOG_PRINT_L0("Detected new block, minting interrupted"); - cxt.rsp.status = API_RETURN_CODE_NOT_FOUND; + cxt.status = API_RETURN_CODE_NOT_FOUND; return false; } timstamp_last_idle_call = runtime_config.get_core_time(); @@ -1420,9 +1392,9 @@ namespace tools cxt.iterations_processed++; if (do_pos_mining_iteration(cxt, transfer_index, ts)) { - cxt.rsp.index = transfer_index; - cxt.rsp.stake_unlock_time = stake_unlock_time; - cxt.rsp.status = API_RETURN_CODE_OK; + cxt.index = transfer_index; + cxt.stake_unlock_time = stake_unlock_time; + cxt.status = API_RETURN_CODE_OK; return true; } @@ -1430,7 +1402,7 @@ namespace tools } ++pos_entry_index; } - cxt.rsp.status = API_RETURN_CODE_NOT_FOUND; + cxt.status = API_RETURN_CODE_NOT_FOUND; return false; } diff --git a/src/wallet/wallets_manager.cpp b/src/wallet/wallets_manager.cpp index 12382be3..f00b1d85 100644 --- a/src/wallet/wallets_manager.cpp +++ b/src/wallet/wallets_manager.cpp @@ -1987,7 +1987,7 @@ void wallets_manager::wallet_vs_options::worker_func() pos_minin_interval.do_call([this](){ tools::wallet2::mining_context ctx = AUTO_VAL_INIT(ctx); LOG_PRINT_L1(get_log_prefix() + " Starting PoS mint iteration"); - if (!w->get()->fill_mining_context(ctx) || ctx.rsp.status != API_RETURN_CODE_OK) + if (!w->get()->fill_mining_context(ctx) || ctx.status != API_RETURN_CODE_OK) { LOG_PRINT_L1(get_log_prefix() + " cannot obtain PoS mining context, skip iteration"); return true; @@ -2001,11 +2001,11 @@ void wallets_manager::wallet_vs_options::worker_func() return *plast_daemon_network_state == currency::COMMAND_RPC_GET_INFO::daemon_network_state_online && *plast_daemon_height == last_wallet_synch_height; }, core_conf); - if (ctx.rsp.status == API_RETURN_CODE_OK) + if (ctx.status == API_RETURN_CODE_OK) { w->get()->build_minted_block(ctx); } - LOG_PRINT_L1(get_log_prefix() << " PoS mining iteration finished, status: " << ctx.rsp.status << ", used " << ctx.total_items_checked << " entries with total amount: " << currency::print_money_brief(ctx.total_amount_checked) << ", processed: " << ctx.iterations_processed << " iter."); + LOG_PRINT_L1(get_log_prefix() << " PoS mining iteration finished, status: " << ctx.status << ", used " << ctx.total_items_checked << " entries with total amount: " << currency::print_money_brief(ctx.total_amount_checked) << ", processed: " << ctx.iterations_processed << " iter."); return true; }); } diff --git a/tests/core_tests/chaingen_helpers.h b/tests/core_tests/chaingen_helpers.h index 44c1ca1d..77877b5b 100644 --- a/tests/core_tests/chaingen_helpers.h +++ b/tests/core_tests/chaingen_helpers.h @@ -173,7 +173,7 @@ inline bool mine_next_pos_block_in_playtime_with_wallet(tools::wallet2& w, const { tools::wallet2::mining_context ctx = AUTO_VAL_INIT(ctx); w.fill_mining_context(ctx); - if (!ctx.rsp.is_pos_allowed) + if (!ctx.is_pos_allowed) return false; @@ -181,7 +181,7 @@ inline bool mine_next_pos_block_in_playtime_with_wallet(tools::wallet2& w, const w.scan_pos(ctx, stop, [&w](){size_t blocks_fetched; w.refresh(blocks_fetched); return blocks_fetched == 0; }, w.get_core_runtime_config()); pos_entries_count = ctx.total_items_checked; - if (ctx.rsp.status != API_RETURN_CODE_OK) + if (ctx.status != API_RETURN_CODE_OK) return false; return w.build_minted_block(ctx, miner_address);