diff options
Diffstat (limited to 'src/cryptonote_core')
-rw-r--r-- | src/cryptonote_core/blockchain.cpp | 6 | ||||
-rw-r--r-- | src/cryptonote_core/blockchain.h | 3 | ||||
-rw-r--r-- | src/cryptonote_core/cryptonote_core.cpp | 33 | ||||
-rw-r--r-- | src/cryptonote_core/cryptonote_core.h | 4 |
4 files changed, 36 insertions, 10 deletions
diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 8f1f0b260..789687ce0 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -636,7 +636,7 @@ crypto::hash Blockchain::get_block_id_by_height(uint64_t height) const return null_hash; } //------------------------------------------------------------------ -bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const +bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan) const { LOG_PRINT_L3("Blockchain::" << __func__); CRITICAL_REGION_LOCAL(m_blockchain_lock); @@ -645,6 +645,8 @@ bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const try { blk = m_db->get_block(h); + if (orphan) + *orphan = false; return true; } // try to find block in alternative chain @@ -654,6 +656,8 @@ bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const if (m_alternative_chains.end() != it_alt) { blk = it_alt->second.bl; + if (orphan) + *orphan = true; return true; } } diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index 245dc6e73..ca665e1d4 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -197,10 +197,11 @@ namespace cryptonote * * @param h the hash to look for * @param blk return-by-reference variable to put result block in + * @param orphan if non-NULL, will be set to true if not in the main chain, false otherwise * * @return true if the block was found, else false */ - bool get_block_by_hash(const crypto::hash &h, block &blk) const; + bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan = NULL) const; /** * @brief get all block hashes (main chain, alt chains, and invalid blocks) diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp index 5294431d6..22d473b35 100644 --- a/src/cryptonote_core/cryptonote_core.cpp +++ b/src/cryptonote_core/cryptonote_core.cpp @@ -487,6 +487,13 @@ namespace cryptonote } //std::cout << "!"<< tx.vin.size() << std::endl; + if (bad_semantics_txes.find(tx_hash) != bad_semantics_txes.end()) + { + LOG_PRINT_L1("Transaction already seen with bad semantics, rejected"); + tvc.m_verifivation_failed = true; + return false; + } + uint8_t version = m_blockchain_storage.get_current_hard_fork_version(); const size_t max_tx_version = version == 1 ? 1 : 2; if (tx.version == 0 || tx.version > max_tx_version) @@ -496,6 +503,18 @@ namespace cryptonote return false; } + if(m_mempool.have_tx(tx_hash)) + { + LOG_PRINT_L2("tx " << tx_hash << "already have transaction in tx_pool"); + return true; + } + + if(m_blockchain_storage.have_tx(tx_hash)) + { + LOG_PRINT_L2("tx " << tx_hash << " already have transaction in blockchain"); + return true; + } + if(!check_tx_syntax(tx)) { LOG_PRINT_L1("WRONG TRANSACTION BLOB, Failed to check tx " << tx_hash << " syntax, rejected"); @@ -522,6 +541,7 @@ namespace cryptonote if(!check_tx_semantic(tx, keeped_by_block)) { LOG_PRINT_L1("WRONG TRANSACTION BLOB, Failed to check tx " << tx_hash << " semantic, rejected"); + bad_semantics_txes.insert(tx_hash); tvc.m_verifivation_failed = true; return false; } @@ -977,9 +997,9 @@ namespace cryptonote return m_blockchain_storage.get_block_id_by_height(height); } //----------------------------------------------------------------------------------------------- - bool core::get_block_by_hash(const crypto::hash &h, block &blk) const + bool core::get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan) const { - return m_blockchain_storage.get_block_by_hash(h, blk); + return m_blockchain_storage.get_block_by_hash(h, blk, orphan); } //----------------------------------------------------------------------------------------------- std::string core::print_pool(bool short_format) const @@ -1000,12 +1020,11 @@ namespace cryptonote MGINFO_YELLOW(ENDL << "**********************************************************************" << ENDL << "The daemon will start synchronizing with the network. It may take up to several hours." << ENDL << ENDL - << "You can set the level of process detailization* through \"set_log <level|categories>\" command*, where <level> is between 0 (no details) and 4 (very verbose), or custom category based levels (eg, *:WARNING)" << ENDL - << ENDL - << "Use \"help\" command to see the list of available commands." << ENDL + << "You can set the level of process detailization* through \"set_log <level|categories>\" command*," << ENDL + << "where <level> is between 0 (no details) and 4 (very verbose), or custom category based levels (eg, *:WARNING)" << ENDL << ENDL - << "Note: in case you need to interrupt the process, use \"exit\" command. Otherwise, the current progress won't be saved." << ENDL - << "**********************************************************************"); + << "Use the \"help\" command to see the list of available commands." << ENDL + << "**********************************************************************" << ENDL); m_starter_message_showed = true; } diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h index fa67ff265..1b9518c96 100644 --- a/src/cryptonote_core/cryptonote_core.h +++ b/src/cryptonote_core/cryptonote_core.h @@ -330,7 +330,7 @@ namespace cryptonote * * @note see Blockchain::get_block_by_hash */ - bool get_block_by_hash(const crypto::hash &h, block &blk) const; + bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan = NULL) const; /** * @copydoc Blockchain::get_alternative_blocks @@ -824,6 +824,8 @@ namespace cryptonote size_t block_sync_size; time_t start_time; + + std::unordered_set<crypto::hash> bad_semantics_txes; }; } |