From 7482253a6d939b9966ecb5b615ce891131cf55b3 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Wed, 9 Aug 2017 09:30:22 +0100 Subject: [PATCH 1/2] epee: fixup KV_SERIALIZE_OPT to work in more cases --- contrib/epee/include/serialization/keyvalue_serialization.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/epee/include/serialization/keyvalue_serialization.h b/contrib/epee/include/serialization/keyvalue_serialization.h index f4442e46..d4413a71 100644 --- a/contrib/epee/include/serialization/keyvalue_serialization.h +++ b/contrib/epee/include/serialization/keyvalue_serialization.h @@ -70,10 +70,13 @@ public: \ #define KV_SERIALIZE_N(varialble, val_name) \ epee::serialization::selector::serialize(this_ref.varialble, stg, hparent_section, val_name); + template inline void serialize_default(const T &t, T v) { } + template inline void serialize_default(T &t, T v) { t = v; } + #define KV_SERIALIZE_OPT_N(variable, val_name, default_value) \ do { \ if (!epee::serialization::selector::serialize(this_ref.variable, stg, hparent_section, val_name)) \ - this_ref.variable = default_value; \ + epee::serialize_default(this_ref.variable, default_value); \ } while (0); #define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \ From 635929eaca6b376708d7c5fabf9b743b8a706981 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Wed, 9 Aug 2017 09:31:00 +0100 Subject: [PATCH 2/2] 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. --- src/cryptonote_core/blockchain.h | 9 +++++++++ src/cryptonote_protocol/cryptonote_protocol_defs.h | 2 ++ .../cryptonote_protocol_handler.inl | 11 +++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index bd8a8313..aa61dc03 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -745,6 +745,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 * diff --git a/src/cryptonote_protocol/cryptonote_protocol_defs.h b/src/cryptonote_protocol/cryptonote_protocol_defs.h index 042ae49f..37b50343 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 4652bf23..3e3bb83d 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::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; }