aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2020-12-15 12:50:38 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2020-12-17 03:00:39 +0000
commit42ee309292ba4a51ee3c9c26a22e5b9ef8e5b059 (patch)
tree2899790c5a7d0d68c627e030f04d7883ff962388
parentprotocol: drop peers we can't download anything from in sync mode (diff)
downloadmonero-42ee309292ba4a51ee3c9c26a22e5b9ef8e5b059.tar.xz
protocol: reject claimed block hashes that already are in the chain
-rw-r--r--src/cryptonote_protocol/cryptonote_protocol_handler.inl13
-rw-r--r--tests/core_proxy/core_proxy.h1
-rw-r--r--tests/unit_tests/node_server.cpp1
3 files changed, 15 insertions, 0 deletions
diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
index 6e02eb133..c36cdeb82 100644
--- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl
+++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl
@@ -2548,6 +2548,8 @@ skip:
}
std::unordered_set<crypto::hash> hashes;
+ uint64_t height = arg.start_height;
+ const uint64_t blockchain_height = m_core.get_current_blockchain_height();
for (const auto &h: arg.m_block_ids)
{
if (!hashes.insert(h).second)
@@ -2556,6 +2558,17 @@ skip:
drop_connection(context, true, false);
return 1;
}
+ if (height < blockchain_height)
+ {
+ const crypto::hash block_in_chain = m_core.get_block_id_by_height(height);
+ if ((height < context.m_expect_height - 1 && block_in_chain == h) || (height == context.m_expect_height - 1 && block_in_chain != h))
+ {
+ LOG_ERROR_CCONTEXT("sent existing block " << h << " at height " << height << ", expected height was " << context.m_expect_height << ", dropping connection");
+ drop_connection(context, true, false);
+ return 1;
+ }
+ }
+ ++height;
}
uint64_t n_use_blocks = m_core.prevalidate_block_hashes(arg.start_height, arg.m_block_ids, arg.m_block_weights);
diff --git a/tests/core_proxy/core_proxy.h b/tests/core_proxy/core_proxy.h
index ecfcc18ae..ebc3a89c2 100644
--- a/tests/core_proxy/core_proxy.h
+++ b/tests/core_proxy/core_proxy.h
@@ -112,5 +112,6 @@ namespace tests
bool prune_blockchain(uint32_t pruning_seed) const { return true; }
bool get_txpool_complement(const std::vector<crypto::hash> &hashes, std::vector<cryptonote::blobdata> &txes) { return false; }
bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const { return false; }
+ crypto::hash get_block_id_by_height(uint64_t height) const { return crypto::null_hash; }
};
}
diff --git a/tests/unit_tests/node_server.cpp b/tests/unit_tests/node_server.cpp
index 0191e5aa4..0569d3748 100644
--- a/tests/unit_tests/node_server.cpp
+++ b/tests/unit_tests/node_server.cpp
@@ -93,6 +93,7 @@ public:
bool has_block_weights(uint64_t height, uint64_t nblocks) const { return false; }
bool get_txpool_complement(const std::vector<crypto::hash> &hashes, std::vector<cryptonote::blobdata> &txes) { return false; }
bool get_pool_transaction_hashes(std::vector<crypto::hash>& txs, bool include_unrelayed_txes = true) const { return false; }
+ crypto::hash get_block_id_by_height(uint64_t height) const { return crypto::null_hash; }
void stop() {}
};