diff options
author | mydesktop <dev.mc2@gmail.com> | 2014-05-25 20:25:37 -0400 |
---|---|---|
committer | mydesktop <dev.mc2@gmail.com> | 2014-05-25 20:25:37 -0400 |
commit | 31a59785b0b3f678ea29fcfb63902f051c4e7ce0 (patch) | |
tree | 2039fe198dc3f9ad38f0f4a3ce8dd5c1e01379da | |
parent | enable checkpointed block verification (diff) | |
download | monero-31a59785b0b3f678ea29fcfb63902f051c4e7ce0.tar.xz |
temporary fix for block reward dos
-rw-r--r-- | ReleaseNotes.txt | 3 | ||||
-rw-r--r-- | src/cryptonote_core/tx_pool.cpp | 24 | ||||
-rw-r--r-- | src/wallet/wallet2.h | 7 |
3 files changed, 31 insertions, 3 deletions
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt index 6be441ea2..78e8af157 100644 --- a/ReleaseNotes.txt +++ b/ReleaseNotes.txt @@ -7,7 +7,8 @@ Release notes 0.8.8 - Fixed a bug with checkpoints behavior - UI improvements for daemon - Fixed COIN value (10^12) -- Raised minimum fee to (1/2) * (10^10) +- Raised minimum fee to 5 * (10^9) +- Temporary fix for block reward DoS attack Release notes 0.8.7 diff --git a/src/cryptonote_core/tx_pool.cpp b/src/cryptonote_core/tx_pool.cpp index 24e5752ad..37f4632a9 100644 --- a/src/cryptonote_core/tx_pool.cpp +++ b/src/cryptonote_core/tx_pool.cpp @@ -355,13 +355,35 @@ namespace cryptonote total_size = 0; fee = 0; - size_t max_total_size = 2 * median_size - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE; + size_t max_total_size = 2 * median_size - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE; // Max block size std::unordered_set<crypto::key_image> k_images; BOOST_FOREACH(transactions_container::value_type& tx, m_transactions) { + // Can not exceed maximum block size if (max_total_size < total_size + tx.second.blob_size) continue; + // Check to see if the minimum fee is included + if (tx.second.fee < DEFAULT_FEE) + continue; + + // Skip transactions that are too large + // TODO: Correct upper_transactions_size_limit + // such that it is based on median block size; + // We need to make a similar patch for + // wallet2.h + uint64_t upper_transaction_size_limit = ((CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE; + if (tx.second.blob_size > upper_transaction_size_limit) + continue; + + // If we've exceeded the penalty free size, + // stop including more tx + if (total_size > median_size) + continue; + + // Skip transactions that are not ready to be + // included into the blockchain or that are + // missing key images if (!is_transaction_ready_to_go(tx.second) || have_key_images(k_images, tx.second.tx)) continue; diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index d2016f696..f90fc4fac 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -102,7 +102,12 @@ namespace tools void store(); cryptonote::account_base& get_account(){return m_account;} - void init(const std::string& daemon_address = "http://localhost:8080", uint64_t upper_transaction_size_limit = CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE*2 - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE); + // upper_transaction_size_limit as defined below is set to + // approximately 125% of the fixed minimum allowable penalty + // free block size. TODO: fix this so that it actually takes + // into account the current median block size rather than + // the minimum block size. + void init(const std::string& daemon_address = "http://localhost:8080", uint64_t upper_transaction_size_limit = ((CRYPTONOTE_BLOCK_GRANTED_FULL_REWARD_ZONE * 125) / 100) - CRYPTONOTE_COINBASE_BLOB_RESERVED_SIZE); bool deinit(); void stop() { m_run.store(false, std::memory_order_relaxed); } |