provide key images of spent outputs in wallet rpc

This commit is contained in:
woodser 2021-05-18 20:37:03 -04:00
parent ab7df49331
commit e7615772fa
3 changed files with 39 additions and 9 deletions

View file

@ -961,10 +961,10 @@ namespace tools
return amount; return amount;
} }
//------------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------------
template<typename Ts, typename Tu> template<typename Ts, typename Tu, typename Tk>
bool wallet_rpc_server::fill_response(std::vector<tools::wallet2::pending_tx> &ptx_vector, bool wallet_rpc_server::fill_response(std::vector<tools::wallet2::pending_tx> &ptx_vector,
bool get_tx_key, Ts& tx_key, Tu &amount, Tu &fee, Tu &weight, std::string &multisig_txset, std::string &unsigned_txset, bool do_not_relay, bool get_tx_key, Ts& tx_key, Tu &amount, Tu &fee, Tu &weight, std::string &multisig_txset, std::string &unsigned_txset, bool do_not_relay,
Ts &tx_hash, bool get_tx_hex, Ts &tx_blob, bool get_tx_metadata, Ts &tx_metadata, epee::json_rpc::error &er) Ts &tx_hash, bool get_tx_hex, Ts &tx_blob, bool get_tx_metadata, Ts &tx_metadata, Tk &spent_key_images, epee::json_rpc::error &er)
{ {
for (const auto & ptx : ptx_vector) for (const auto & ptx : ptx_vector)
{ {
@ -979,6 +979,17 @@ namespace tools
fill(amount, total_amount(ptx)); fill(amount, total_amount(ptx));
fill(fee, ptx.fee); fill(fee, ptx.fee);
fill(weight, cryptonote::get_transaction_weight(ptx.tx)); fill(weight, cryptonote::get_transaction_weight(ptx.tx));
// add spent key images
tools::wallet_rpc::key_image_list key_image_list;
bool all_are_txin_to_key = std::all_of(ptx.tx.vin.begin(), ptx.tx.vin.end(), [&](const cryptonote::txin_v& s_e) -> bool
{
CHECKED_GET_SPECIFIC_VARIANT(s_e, const cryptonote::txin_to_key, in, false);
key_image_list.key_images.push_back(epee::string_tools::pod_to_hex(in.k_image));
return true;
});
THROW_WALLET_EXCEPTION_IF(!all_are_txin_to_key, error::unexpected_txin_type, ptx.tx);
fill(spent_key_images, key_image_list);
} }
if (m_wallet->multisig()) if (m_wallet->multisig())
@ -1065,7 +1076,7 @@ namespace tools
} }
return fill_response(ptx_vector, req.get_tx_key, res.tx_key, res.amount, res.fee, res.weight, res.multisig_txset, res.unsigned_txset, req.do_not_relay, return fill_response(ptx_vector, req.get_tx_key, res.tx_key, res.amount, res.fee, res.weight, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
res.tx_hash, req.get_tx_hex, res.tx_blob, req.get_tx_metadata, res.tx_metadata, er); res.tx_hash, req.get_tx_hex, res.tx_blob, req.get_tx_metadata, res.tx_metadata, res.spent_key_images, er);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
@ -1111,7 +1122,7 @@ namespace tools
} }
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay, return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, er); res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, res.spent_key_images_list, er);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
@ -1473,7 +1484,7 @@ namespace tools
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_unmixable_sweep_transactions(); std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_unmixable_sweep_transactions();
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay, return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, er); res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, res.spent_key_images_list, er);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
@ -1531,7 +1542,7 @@ namespace tools
std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_all(req.below_amount, dsts[0].addr, dsts[0].is_subaddress, req.outputs, mixin, req.unlock_time, priority, extra, req.account_index, subaddr_indices); std::vector<wallet2::pending_tx> ptx_vector = m_wallet->create_transactions_all(req.below_amount, dsts[0].addr, dsts[0].is_subaddress, req.outputs, mixin, req.unlock_time, priority, extra, req.account_index, subaddr_indices);
return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay, return fill_response(ptx_vector, req.get_tx_keys, res.tx_key_list, res.amount_list, res.fee_list, res.weight_list, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, er); res.tx_hash_list, req.get_tx_hex, res.tx_blob_list, req.get_tx_metadata, res.tx_metadata_list, res.spent_key_images_list, er);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
@ -1606,7 +1617,7 @@ namespace tools
} }
return fill_response(ptx_vector, req.get_tx_key, res.tx_key, res.amount, res.fee, res.weight, res.multisig_txset, res.unsigned_txset, req.do_not_relay, return fill_response(ptx_vector, req.get_tx_key, res.tx_key, res.amount, res.fee, res.weight, res.multisig_txset, res.unsigned_txset, req.do_not_relay,
res.tx_hash, req.get_tx_hex, res.tx_blob, req.get_tx_metadata, res.tx_metadata, er); res.tx_hash, req.get_tx_hex, res.tx_blob, req.get_tx_metadata, res.tx_metadata, res.spent_key_images, er);
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {

View file

@ -263,10 +263,10 @@ namespace tools
bool not_open(epee::json_rpc::error& er); bool not_open(epee::json_rpc::error& er);
void handle_rpc_exception(const std::exception_ptr& e, epee::json_rpc::error& er, int default_error_code); void handle_rpc_exception(const std::exception_ptr& e, epee::json_rpc::error& er, int default_error_code);
template<typename Ts, typename Tu> template<typename Ts, typename Tu, typename Tk>
bool fill_response(std::vector<tools::wallet2::pending_tx> &ptx_vector, bool fill_response(std::vector<tools::wallet2::pending_tx> &ptx_vector,
bool get_tx_key, Ts& tx_key, Tu &amount, Tu &fee, Tu &weight, std::string &multisig_txset, std::string &unsigned_txset, bool do_not_relay, bool get_tx_key, Ts& tx_key, Tu &amount, Tu &fee, Tu &weight, std::string &multisig_txset, std::string &unsigned_txset, bool do_not_relay,
Ts &tx_hash, bool get_tx_hex, Ts &tx_blob, bool get_tx_metadata, Ts &tx_metadata, epee::json_rpc::error &er); Ts &tx_hash, bool get_tx_hex, Ts &tx_blob, bool get_tx_metadata, Ts &tx_metadata, Tk &spent_key_images, epee::json_rpc::error &er);
bool validate_transfer(const std::list<wallet_rpc::transfer_destination>& destinations, const std::string& payment_id, std::vector<cryptonote::tx_destination_entry>& dsts, std::vector<uint8_t>& extra, bool at_least_one_destination, epee::json_rpc::error& er); bool validate_transfer(const std::list<wallet_rpc::transfer_destination>& destinations, const std::string& payment_id, std::vector<cryptonote::tx_destination_entry>& dsts, std::vector<uint8_t>& extra, bool at_least_one_destination, epee::json_rpc::error& er);

View file

@ -519,6 +519,15 @@ namespace wallet_rpc
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;
}; };
struct key_image_list
{
std::list<std::string> key_images;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(key_images)
END_KV_SERIALIZE_MAP()
};
struct COMMAND_RPC_TRANSFER struct COMMAND_RPC_TRANSFER
{ {
struct request_t struct request_t
@ -562,6 +571,7 @@ namespace wallet_rpc
std::string tx_metadata; std::string tx_metadata;
std::string multisig_txset; std::string multisig_txset;
std::string unsigned_txset; std::string unsigned_txset;
key_image_list spent_key_images;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tx_hash) KV_SERIALIZE(tx_hash)
@ -573,6 +583,7 @@ namespace wallet_rpc
KV_SERIALIZE(tx_metadata) KV_SERIALIZE(tx_metadata)
KV_SERIALIZE(multisig_txset) KV_SERIALIZE(multisig_txset)
KV_SERIALIZE(unsigned_txset) KV_SERIALIZE(unsigned_txset)
KV_SERIALIZE(spent_key_images)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;
@ -630,6 +641,7 @@ namespace wallet_rpc
std::list<std::string> tx_metadata_list; std::list<std::string> tx_metadata_list;
std::string multisig_txset; std::string multisig_txset;
std::string unsigned_txset; std::string unsigned_txset;
std::list<key_image_list> spent_key_images_list;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tx_hash_list) KV_SERIALIZE(tx_hash_list)
@ -641,6 +653,7 @@ namespace wallet_rpc
KV_SERIALIZE(tx_metadata_list) KV_SERIALIZE(tx_metadata_list)
KV_SERIALIZE(multisig_txset) KV_SERIALIZE(multisig_txset)
KV_SERIALIZE(unsigned_txset) KV_SERIALIZE(unsigned_txset)
KV_SERIALIZE(spent_key_images_list)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;
@ -805,6 +818,7 @@ namespace wallet_rpc
std::list<std::string> tx_metadata_list; std::list<std::string> tx_metadata_list;
std::string multisig_txset; std::string multisig_txset;
std::string unsigned_txset; std::string unsigned_txset;
std::list<key_image_list> spent_key_images_list;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tx_hash_list) KV_SERIALIZE(tx_hash_list)
@ -816,6 +830,7 @@ namespace wallet_rpc
KV_SERIALIZE(tx_metadata_list) KV_SERIALIZE(tx_metadata_list)
KV_SERIALIZE(multisig_txset) KV_SERIALIZE(multisig_txset)
KV_SERIALIZE(unsigned_txset) KV_SERIALIZE(unsigned_txset)
KV_SERIALIZE(spent_key_images_list)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;
@ -879,6 +894,7 @@ namespace wallet_rpc
std::list<std::string> tx_metadata_list; std::list<std::string> tx_metadata_list;
std::string multisig_txset; std::string multisig_txset;
std::string unsigned_txset; std::string unsigned_txset;
std::list<key_image_list> spent_key_images_list;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tx_hash_list) KV_SERIALIZE(tx_hash_list)
@ -890,6 +906,7 @@ namespace wallet_rpc
KV_SERIALIZE(tx_metadata_list) KV_SERIALIZE(tx_metadata_list)
KV_SERIALIZE(multisig_txset) KV_SERIALIZE(multisig_txset)
KV_SERIALIZE(unsigned_txset) KV_SERIALIZE(unsigned_txset)
KV_SERIALIZE(spent_key_images_list)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;
@ -938,6 +955,7 @@ namespace wallet_rpc
std::string tx_metadata; std::string tx_metadata;
std::string multisig_txset; std::string multisig_txset;
std::string unsigned_txset; std::string unsigned_txset;
key_image_list spent_key_images;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tx_hash) KV_SERIALIZE(tx_hash)
@ -949,6 +967,7 @@ namespace wallet_rpc
KV_SERIALIZE(tx_metadata) KV_SERIALIZE(tx_metadata)
KV_SERIALIZE(multisig_txset) KV_SERIALIZE(multisig_txset)
KV_SERIALIZE(unsigned_txset) KV_SERIALIZE(unsigned_txset)
KV_SERIALIZE(spent_key_images)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<response_t> response; typedef epee::misc_utils::struct_init<response_t> response;