mirror of
https://github.com/monero-project/monero.git
synced 2025-08-23 11:25:08 -04:00
Merge pull request #7312
186271e
monero-wallet-cli: Added command scan_tx (Horia Mihai David)
This commit is contained in:
commit
3f55f7df31
4 changed files with 89 additions and 1 deletions
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include <numeric>
|
||||
#include <tuple>
|
||||
#include <queue>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/optional/optional.hpp>
|
||||
#include <boost/algorithm/string/classification.hpp>
|
||||
|
@ -1602,6 +1603,47 @@ std::string wallet2::get_subaddress_label(const cryptonote::subaddress_index& in
|
|||
return m_subaddress_labels[index.major][index.minor];
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void wallet2::scan_tx(const std::vector<crypto::hash> &txids)
|
||||
{
|
||||
// Get the transactions from daemon in batches and add them to a priority queue ordered in chronological order
|
||||
auto cmp_tx_entry = [](const cryptonote::COMMAND_RPC_GET_TRANSACTIONS::entry& l, const cryptonote::COMMAND_RPC_GET_TRANSACTIONS::entry& r)
|
||||
{ return l.block_height > r.block_height; };
|
||||
|
||||
std::priority_queue<cryptonote::COMMAND_RPC_GET_TRANSACTIONS::entry, std::vector<COMMAND_RPC_GET_TRANSACTIONS::entry>, decltype(cmp_tx_entry)> txq(cmp_tx_entry);
|
||||
const size_t SLICE_SIZE = 100; // RESTRICTED_TRANSACTIONS_COUNT as defined in rpc/core_rpc_server.cpp, hardcoded in daemon code
|
||||
for(size_t slice = 0; slice < txids.size(); slice += SLICE_SIZE) {
|
||||
cryptonote::COMMAND_RPC_GET_TRANSACTIONS::request req = AUTO_VAL_INIT(req);
|
||||
cryptonote::COMMAND_RPC_GET_TRANSACTIONS::response res = AUTO_VAL_INIT(res);
|
||||
req.decode_as_json = false;
|
||||
req.prune = true;
|
||||
|
||||
size_t ntxes = slice + SLICE_SIZE > txids.size() ? txids.size() - slice : SLICE_SIZE;
|
||||
for (size_t i = slice; i < slice + ntxes; ++i)
|
||||
req.txs_hashes.push_back(epee::string_tools::pod_to_hex(txids[i]));
|
||||
|
||||
{
|
||||
const boost::lock_guard<boost::recursive_mutex> lock{m_daemon_rpc_mutex};
|
||||
req.client = get_client_signature();
|
||||
bool r = epee::net_utils::invoke_http_json("/gettransactions", req, res, *m_http_client, rpc_timeout);
|
||||
THROW_WALLET_EXCEPTION_IF(!r, error::wallet_internal_error, "Failed to get transaction from daemon");
|
||||
THROW_WALLET_EXCEPTION_IF(res.txs.size() != req.txs_hashes.size(), error::wallet_internal_error, "Failed to get transaction from daemon");
|
||||
}
|
||||
|
||||
for (auto& tx_info : res.txs)
|
||||
txq.push(tx_info);
|
||||
}
|
||||
|
||||
// Process the transactions in chronologically ascending order
|
||||
while(!txq.empty()) {
|
||||
auto& tx_info = txq.top();
|
||||
cryptonote::transaction tx;
|
||||
crypto::hash tx_hash;
|
||||
THROW_WALLET_EXCEPTION_IF(!get_pruned_tx(tx_info, tx, tx_hash), error::wallet_internal_error, "Failed to get transaction from daemon (2)");
|
||||
process_new_transaction(tx_hash, tx, tx_info.output_indices, tx_info.block_height, 0, tx_info.block_timestamp, false, tx_info.in_pool, tx_info.double_spend_seen, {}, {});
|
||||
txq.pop();
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
void wallet2::set_subaddress_label(const cryptonote::subaddress_index& index, const std::string &label)
|
||||
{
|
||||
THROW_WALLET_EXCEPTION_IF(index.major >= m_subaddress_labels.size(), error::account_index_outofbound);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue