From 94b98fb5fa98ca317664b96d6a564159945de95e Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Fri, 29 Jan 2016 17:15:09 +0000 Subject: [PATCH] tx_pool: do not accept txes not in a block if they timed out before This is intended to avoid cases where a timed out tx will be re-relayed by another peer for which it has not timed out yet, which would cause the tx to stay in the network's pool for a long time (until all peers time it out before another one tries to relay it again). --- src/cryptonote_core/tx_pool.cpp | 11 ++++++++++- src/cryptonote_core/tx_pool.h | 5 ++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp index 2cef68a8..5d67acdd 100644 --- a/src/cryptonote_core/tx_pool.cpp +++ b/src/cryptonote_core/tx_pool.cpp @@ -84,7 +84,15 @@ namespace cryptonote //--------------------------------------------------------------------------------- bool tx_memory_pool::add_tx(const transaction &tx, /*const crypto::hash& tx_prefix_hash,*/ const crypto::hash &id, size_t blob_size, tx_verification_context& tvc, bool kept_by_block, bool relayed, uint8_t version) { - + // we do not accept transactions that timed out before, unless they're + // kept_by_block + if (!kept_by_block && m_timed_out_transactions.find(id) != m_timed_out_transactions.end()) + { + // not clear if we should set that, since verifivation (sic) did not fail before, since + // the tx was accepted before timing out. + tvc.m_verifivation_failed = true; + return false; + } if(!check_inputs_types_supported(tx)) { @@ -315,6 +323,7 @@ namespace cryptonote { m_txs_by_fee.erase(sorted_it); } + m_timed_out_transactions.insert(it->first); auto pit = it++; m_transactions.erase(pit); }else diff --git a/src/cryptonote_core/tx_pool.h b/src/cryptonote_core/tx_pool.h index 3832ccb6..34dc1f72 100644 --- a/src/cryptonote_core/tx_pool.h +++ b/src/cryptonote_core/tx_pool.h @@ -110,7 +110,7 @@ namespace cryptonote /*bool flush_pool(const std::strig& folder); bool inflate_pool(const std::strig& folder);*/ -#define CURRENT_MEMPOOL_ARCHIVE_VER 9 +#define CURRENT_MEMPOOL_ARCHIVE_VER 10 template void serialize(archive_t & a, const unsigned int version) @@ -120,6 +120,7 @@ namespace cryptonote CRITICAL_REGION_LOCAL(m_transactions_lock); a & m_transactions; a & m_spent_key_images; + a & m_timed_out_transactions; } struct tx_details @@ -162,6 +163,8 @@ namespace cryptonote sorted_tx_container::iterator find_tx_in_sorted_container(const crypto::hash& id) const; + std::unordered_set m_timed_out_transactions; + //transactions_container m_alternative_transactions; std::string m_config_folder;