diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2016-01-05 21:57:43 +0000 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2016-01-05 22:16:24 +0000 |
commit | a44d94d390158a04db9bfd84bacd5ca1d7233ba0 (patch) | |
tree | a7d619810f867a637f527647c422c9004f152af1 | |
parent | Merge branch 'LMDB-tweaks' (diff) | |
download | monero-a44d94d390158a04db9bfd84bacd5ca1d7233ba0.tar.xz |
rpc: is_key_image_spent now checks the tx pool too
Diffstat (limited to '')
-rw-r--r-- | src/rpc/core_rpc_server.cpp | 32 | ||||
-rw-r--r-- | src/rpc/core_rpc_server_commands_defs.h | 6 | ||||
-rw-r--r-- | 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 e6973b0b8..021c12d6e 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<cryptonote::tx_info> txs; + std::vector<cryptonote::spent_key_image_info> ki; + r = m_core.get_pool_transactions_and_spent_keys_info(txs, ki); + if(!r) + { + res.status = "Failed"; + return true; + } + for (std::vector<cryptonote::spent_key_image_info>::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 209378e5a..dcacffbb9 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<std::string> key_images; diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index bceea367f..c6f287016 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]; } |