diff options
author | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-08-09 09:31:00 +0100 |
---|---|---|
committer | moneromooo-monero <moneromooo-monero@users.noreply.github.com> | 2017-08-09 10:28:41 +0100 |
commit | 635929eaca6b376708d7c5fabf9b743b8a706981 (patch) | |
tree | a5989505a602cd2fe0ef3a425292f9213adfd1fb | |
parent | epee: fixup KV_SERIALIZE_OPT to work in more cases (diff) | |
download | monero-635929eaca6b376708d7c5fabf9b743b8a706981.tar.xz |
protocol: add checks for top block hard fork version
We won't even talk to a peer which claims a wrong version
for its top block. This will avoid syncing to known bad
peers in the first place.
Also add IP fails when failing to verify a block.
-rw-r--r-- | src/cryptonote_core/blockchain.h | 9 | ||||
-rw-r--r-- | src/cryptonote_protocol/cryptonote_protocol_defs.h | 2 | ||||
-rw-r--r-- | src/cryptonote_protocol/cryptonote_protocol_handler.inl | 11 |
3 files changed, 22 insertions, 0 deletions
diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index bd8a8313c..aa61dc034 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -746,6 +746,15 @@ namespace cryptonote uint8_t get_ideal_hard_fork_version(uint64_t height) const { return m_hardfork->get_ideal_version(height); } /** + * @brief returns the actual hardfork version for a given block height + * + * @param height the height for which to check version info + * + * @return the version + */ + uint8_t get_hard_fork_version(uint64_t height) const { return m_hardfork->get(height); } + + /** * @brief get information about hardfork voting for a version * * @param version the version in question diff --git a/src/cryptonote_protocol/cryptonote_protocol_defs.h b/src/cryptonote_protocol/cryptonote_protocol_defs.h index 042ae49f6..37b503436 100644 --- a/src/cryptonote_protocol/cryptonote_protocol_defs.h +++ b/src/cryptonote_protocol/cryptonote_protocol_defs.h @@ -195,10 +195,12 @@ namespace cryptonote { uint64_t current_height; crypto::hash top_id; + uint8_t top_version; BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(current_height) KV_SERIALIZE_VAL_POD_AS_BLOB(top_id) + KV_SERIALIZE_OPT(top_version, (uint8_t)0) END_KV_SERIALIZE_MAP() }; diff --git a/src/cryptonote_protocol/cryptonote_protocol_handler.inl b/src/cryptonote_protocol/cryptonote_protocol_handler.inl index 4652bf23e..3e3bb83d0 100644 --- a/src/cryptonote_protocol/cryptonote_protocol_handler.inl +++ b/src/cryptonote_protocol/cryptonote_protocol_handler.inl @@ -256,6 +256,14 @@ namespace cryptonote if(context.m_state == cryptonote_connection_context::state_synchronizing) return true; + // from v6, if the peer advertises a top block version, reject if it's not what it should be (will only work if no voting) + const uint8_t version = m_core.get_blockchain_storage().get_ideal_hard_fork_version(hshd.current_height - 1); + if (version >= 6 && version != hshd.top_version) + { + LOG_DEBUG_CC(context, "Ignoring due to wrong top version (" << hshd.top_version << ", expected " << version); + return false; + } + uint64_t target = m_core.get_target_blockchain_height(); if (target == 0) target = m_core.get_current_blockchain_height(); @@ -297,6 +305,7 @@ namespace cryptonote bool t_cryptonote_protocol_handler<t_core>::get_payload_sync_data(CORE_SYNC_DATA& hshd) { m_core.get_blockchain_top(hshd.current_height, hshd.top_id); + hshd.top_version = m_core.get_blockchain_storage().get_hard_fork_version(hshd.current_height); hshd.current_height +=1; return true; } @@ -348,6 +357,7 @@ namespace cryptonote { LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection"); m_p2p->drop_connection(context); + m_p2p->add_host_fail(context.m_remote_address); m_block_queue.flush_spans(context.m_connection_id); return 1; } @@ -616,6 +626,7 @@ namespace cryptonote { LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection"); m_p2p->drop_connection(context); + m_p2p->add_host_fail(context.m_remote_address); m_block_queue.flush_spans(context.m_connection_id); return 1; } |