Merge pull request #2386
a15e8583
wallet2: guard against daemon sending txes in the wrong order (moneromooo-monero)8fe5f609
rpc: order transactions in the order they were requested (moneromooo-monero)
This commit is contained in:
commit
ce37967dd2
|
@ -478,18 +478,30 @@ namespace cryptonote
|
||||||
bool r = m_core.get_pool_transactions(pool_txs);
|
bool r = m_core.get_pool_transactions(pool_txs);
|
||||||
if(r)
|
if(r)
|
||||||
{
|
{
|
||||||
for (std::list<transaction>::const_iterator i = pool_txs.begin(); i != pool_txs.end(); ++i)
|
// sort to match original request
|
||||||
|
std::list<transaction> sorted_txs;
|
||||||
|
std::list<cryptonote::transaction>::const_iterator i;
|
||||||
|
for (const crypto::hash &h: vh)
|
||||||
{
|
{
|
||||||
crypto::hash tx_hash = get_transaction_hash(*i);
|
if (std::find(missed_txs.begin(), missed_txs.end(), h) == missed_txs.end())
|
||||||
std::list<crypto::hash>::iterator mi = std::find(missed_txs.begin(), missed_txs.end(), tx_hash);
|
|
||||||
if (mi != missed_txs.end())
|
|
||||||
{
|
{
|
||||||
pool_tx_hashes.insert(tx_hash);
|
// core returns the ones it finds in the right order
|
||||||
missed_txs.erase(mi);
|
if (get_transaction_hash(txs.front()) != h)
|
||||||
txs.push_back(*i);
|
{
|
||||||
|
res.status = "Failed: tx hash mismatch";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
sorted_txs.push_back(std::move(txs.front()));
|
||||||
|
txs.pop_front();
|
||||||
|
}
|
||||||
|
else if ((i = std::find_if(pool_txs.begin(), pool_txs.end(), [h](cryptonote::transaction &tx) { return h == cryptonote::get_transaction_hash(tx); })) != pool_txs.end())
|
||||||
|
{
|
||||||
|
sorted_txs.push_back(*i);
|
||||||
|
missed_txs.remove(h);
|
||||||
++found_in_pool;
|
++found_in_pool;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
txs = sorted_txs;
|
||||||
}
|
}
|
||||||
LOG_PRINT_L2("Found " << found_in_pool << "/" << vh.size() << " transactions in the pool");
|
LOG_PRINT_L2("Found " << found_in_pool << "/" << vh.size() << " transactions in the pool");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1539,23 +1539,22 @@ void wallet2::update_pool_state(bool refreshed)
|
||||||
{
|
{
|
||||||
if (res.txs.size() == txids.size())
|
if (res.txs.size() == txids.size())
|
||||||
{
|
{
|
||||||
size_t n = 0;
|
for (const auto &tx_entry: res.txs)
|
||||||
for (const auto &txid: txids)
|
|
||||||
{
|
{
|
||||||
// might have just been put in a block
|
if (tx_entry.in_pool)
|
||||||
if (res.txs[n].in_pool)
|
|
||||||
{
|
{
|
||||||
cryptonote::transaction tx;
|
cryptonote::transaction tx;
|
||||||
cryptonote::blobdata bd;
|
cryptonote::blobdata bd;
|
||||||
crypto::hash tx_hash, tx_prefix_hash;
|
crypto::hash tx_hash, tx_prefix_hash;
|
||||||
if (epee::string_tools::parse_hexstr_to_binbuff(res.txs[n].as_hex, bd))
|
if (epee::string_tools::parse_hexstr_to_binbuff(tx_entry.as_hex, bd))
|
||||||
{
|
{
|
||||||
if (cryptonote::parse_and_validate_tx_from_blob(bd, tx, tx_hash, tx_prefix_hash))
|
if (cryptonote::parse_and_validate_tx_from_blob(bd, tx, tx_hash, tx_prefix_hash))
|
||||||
{
|
{
|
||||||
if (tx_hash == txid)
|
const std::vector<crypto::hash>::const_iterator i = std::find(txids.begin(), txids.end(), tx_hash);
|
||||||
|
if (i != txids.end())
|
||||||
{
|
{
|
||||||
process_new_transaction(txid, tx, std::vector<uint64_t>(), 0, time(NULL), false, true);
|
process_new_transaction(tx_hash, tx, std::vector<uint64_t>(), 0, time(NULL), false, true);
|
||||||
m_scanned_pool_txs[0].insert(txid);
|
m_scanned_pool_txs[0].insert(tx_hash);
|
||||||
if (m_scanned_pool_txs[0].size() > 5000)
|
if (m_scanned_pool_txs[0].size() > 5000)
|
||||||
{
|
{
|
||||||
std::swap(m_scanned_pool_txs[0], m_scanned_pool_txs[1]);
|
std::swap(m_scanned_pool_txs[0], m_scanned_pool_txs[1]);
|
||||||
|
@ -1564,7 +1563,7 @@ void wallet2::update_pool_state(bool refreshed)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0("Mismatched txids when processing unconfimed txes from pool");
|
MERROR("Got txid " << tx_hash << " which we did not ask for");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1574,14 +1573,13 @@ void wallet2::update_pool_state(bool refreshed)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_PRINT_L0("Failed to parse tx " << txid);
|
LOG_PRINT_L0("Failed to parse transaction from daemon");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_PRINT_L1("Tx " << txid << " was in pool, but is no more");
|
LOG_PRINT_L1("Transaction from daemon was in pool, but is no more");
|
||||||
}
|
}
|
||||||
++n;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue