From a44d94d390158a04db9bfd84bacd5ca1d7233ba0 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Tue, 5 Jan 2016 21:57:43 +0000 Subject: [PATCH] rpc: is_key_image_spent now checks the tx pool too --- src/rpc/core_rpc_server.cpp | 32 ++++++++++++++++++++++++- src/rpc/core_rpc_server_commands_defs.h | 6 +++++ src/wallet/wallet2.cpp | 6 ++--- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index e6973b0b..021c12d6 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -304,7 +304,37 @@ namespace cryptonote } res.spent_status.clear(); for (size_t n = 0; n < spent_status.size(); ++n) - res.spent_status.push_back(spent_status[n]); + res.spent_status.push_back(spent_status[n] ? COMMAND_RPC_IS_KEY_IMAGE_SPENT::SPENT_IN_BLOCKCHAIN : COMMAND_RPC_IS_KEY_IMAGE_SPENT::UNSPENT); + + // check the pool too + std::vector txs; + std::vector ki; + r = m_core.get_pool_transactions_and_spent_keys_info(txs, ki); + if(!r) + { + res.status = "Failed"; + return true; + } + for (std::vector::const_iterator i = ki.begin(); i != ki.end(); ++i) + { + crypto::hash hash; + crypto::key_image spent_key_image; + if (parse_hash256(i->id_hash, hash)) + { + memcpy(&spent_key_image, &hash, sizeof(hash)); // a bit dodgy, should be other parse functions somewhere + for (size_t n = 0; n < res.spent_status.size(); ++n) + { + if (res.spent_status[n] == COMMAND_RPC_IS_KEY_IMAGE_SPENT::UNSPENT) + { + if (key_images[n] == spent_key_image) + { + res.spent_status[n] = COMMAND_RPC_IS_KEY_IMAGE_SPENT::SPENT_IN_POOL; + break; + } + } + } + } + } res.status = CORE_RPC_STATUS_OK; return true; diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index 209378e5..dcacffbb 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -123,6 +123,12 @@ namespace cryptonote //----------------------------------------------- struct COMMAND_RPC_IS_KEY_IMAGE_SPENT { + enum STATUS { + UNSPENT = 0, + SPENT_IN_BLOCKCHAIN = 1, + SPENT_IN_POOL = 2, + }; + struct request { std::vector key_images; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index bceea367..c6f28701 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1419,15 +1419,15 @@ void wallet2::rescan_spent() for (size_t i = 0; i < m_transfers.size(); ++i) { transfer_details& td = m_transfers[i]; - if (td.m_spent != daemon_resp.spent_status[i]) + if (td.m_spent != (daemon_resp.spent_status[i] != COMMAND_RPC_IS_KEY_IMAGE_SPENT::UNSPENT)) { if (td.m_spent) { - LOG_PRINT_L1("Marking output " << i << " as unspent, it was marked as spent"); + LOG_PRINT_L0("Marking output " << i << "(" << td.m_key_image << ") as unspent, it was marked as spent"); } else { - LOG_PRINT_L1("Marking output " << i << " as spent, it was marked as unspent"); + LOG_PRINT_L0("Marking output " << i << "(" << td.m_key_image << ") as spent, it was marked as unspent"); } td.m_spent = daemon_resp.spent_status[i]; }