wallet: fix exceptions getting the hash of a pruned tx

This commit is contained in:
moneromooo-monero 2019-12-30 03:09:00 +00:00 committed by wowario
parent 3068408d04
commit 470045d660
No known key found for this signature in database
GPG Key ID: 24DCBE762DE9C111
4 changed files with 13 additions and 13 deletions

View File

@ -8383,7 +8383,7 @@ bool simple_wallet::get_transfers(std::vector<std::string>& local_args, std::vec
m_in_manual_refresh.store(true, std::memory_order_relaxed); m_in_manual_refresh.store(true, std::memory_order_relaxed);
epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){m_in_manual_refresh.store(false, std::memory_order_relaxed);}); epee::misc_utils::auto_scope_leave_caller scope_exit_handler = epee::misc_utils::create_scope_leave_handler([&](){m_in_manual_refresh.store(false, std::memory_order_relaxed);});
std::vector<std::pair<cryptonote::transaction, bool>> process_txs; std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> process_txs;
m_wallet->update_pool_state(process_txs); m_wallet->update_pool_state(process_txs);
if (!process_txs.empty()) if (!process_txs.empty())
m_wallet->process_pool_state(process_txs); m_wallet->process_pool_state(process_txs);
@ -10052,7 +10052,7 @@ bool simple_wallet::show_transfer(const std::vector<std::string> &args)
try try
{ {
std::vector<std::pair<cryptonote::transaction, bool>> process_txs; std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> process_txs;
m_wallet->update_pool_state(process_txs); m_wallet->update_pool_state(process_txs);
if (!process_txs.empty()) if (!process_txs.empty())
m_wallet->process_pool_state(process_txs); m_wallet->process_pool_state(process_txs);

View File

@ -2831,7 +2831,7 @@ void wallet2::remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashe
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::update_pool_state(std::vector<std::pair<cryptonote::transaction, bool>> &process_txs, bool refreshed) void wallet2::update_pool_state(std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> &process_txs, bool refreshed)
{ {
MTRACE("update_pool_state start"); MTRACE("update_pool_state start");
@ -3021,7 +3021,7 @@ void wallet2::update_pool_state(std::vector<std::pair<cryptonote::transaction, b
[tx_hash](const std::pair<crypto::hash, bool> &e) { return e.first == tx_hash; }); [tx_hash](const std::pair<crypto::hash, bool> &e) { return e.first == tx_hash; });
if (i != txids.end()) if (i != txids.end())
{ {
process_txs.push_back(std::make_pair(tx, tx_entry.double_spend_seen)); process_txs.push_back(std::make_tuple(tx, tx_hash, tx_entry.double_spend_seen));
} }
else else
{ {
@ -3052,14 +3052,14 @@ void wallet2::update_pool_state(std::vector<std::pair<cryptonote::transaction, b
MTRACE("update_pool_state end"); MTRACE("update_pool_state end");
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::process_pool_state(const std::vector<std::pair<cryptonote::transaction, bool>> &txs) void wallet2::process_pool_state(const std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> &txs)
{ {
const time_t now = time(NULL); const time_t now = time(NULL);
for (const auto &e: txs) for (const auto &e: txs)
{ {
const cryptonote::transaction &tx = e.first; const cryptonote::transaction &tx = std::get<0>(e);
const bool double_spend_seen = e.second; const crypto::hash &tx_hash = std::get<1>(e);
const crypto::hash tx_hash = get_transaction_hash(tx); const bool double_spend_seen = std::get<2>(e);
process_new_transaction(tx_hash, tx, std::vector<uint64_t>(), 0, 0, now, false, true, double_spend_seen, {}); process_new_transaction(tx_hash, tx, std::vector<uint64_t>(), 0, 0, now, false, true, double_spend_seen, {});
m_scanned_pool_txs[0].insert(tx_hash); m_scanned_pool_txs[0].insert(tx_hash);
if (m_scanned_pool_txs[0].size() > 5000) if (m_scanned_pool_txs[0].size() > 5000)
@ -3278,7 +3278,7 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
// since that might cause a password prompt, which would introduce a data // since that might cause a password prompt, which would introduce a data
// leak allowing a passive adversary with traffic analysis capability to // leak allowing a passive adversary with traffic analysis capability to
// infer when we get an incoming output // infer when we get an incoming output
std::vector<std::pair<cryptonote::transaction, bool>> process_pool_txs; std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> process_pool_txs;
update_pool_state(process_pool_txs, true); update_pool_state(process_pool_txs, true);
bool first = true, last = false; bool first = true, last = false;

View File

@ -1219,8 +1219,8 @@ private:
bool import_key_images(signed_tx_set & signed_tx, size_t offset=0, bool only_selected_transfers=false); bool import_key_images(signed_tx_set & signed_tx, size_t offset=0, bool only_selected_transfers=false);
crypto::public_key get_tx_pub_key_from_received_outs(const tools::wallet2::transfer_details &td) const; crypto::public_key get_tx_pub_key_from_received_outs(const tools::wallet2::transfer_details &td) const;
void update_pool_state(std::vector<std::pair<cryptonote::transaction, bool>> &process_txs, bool refreshed = false); void update_pool_state(std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> &process_txs, bool refreshed = false);
void process_pool_state(const std::vector<std::pair<cryptonote::transaction, bool>> &txs); void process_pool_state(const std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> &txs);
void remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashes); void remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashes);
std::string encrypt(const char *plaintext, size_t len, const crypto::secret_key &skey, bool authenticated = true) const; std::string encrypt(const char *plaintext, size_t len, const crypto::secret_key &skey, bool authenticated = true) const;

View File

@ -2438,7 +2438,7 @@ namespace tools
if (req.pool) if (req.pool)
{ {
std::vector<std::pair<cryptonote::transaction, bool>> process_txs; std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> process_txs;
m_wallet->update_pool_state(process_txs); m_wallet->update_pool_state(process_txs);
if (!process_txs.empty()) if (!process_txs.empty())
m_wallet->process_pool_state(process_txs); m_wallet->process_pool_state(process_txs);
@ -2521,7 +2521,7 @@ namespace tools
} }
} }
std::vector<std::pair<cryptonote::transaction, bool>> process_txs; std::vector<std::tuple<cryptonote::transaction, crypto::hash, bool>> process_txs;
m_wallet->update_pool_state(process_txs); m_wallet->update_pool_state(process_txs);
if (!process_txs.empty()) if (!process_txs.empty())
m_wallet->process_pool_state(process_txs); m_wallet->process_pool_state(process_txs);