Merge pull request #2269
635929ea
protocol: add checks for top block hard fork version (moneromooo-monero)7482253a
epee: fixup KV_SERIALIZE_OPT to work in more cases (moneromooo-monero)
This commit is contained in:
commit
f43d59d8b3
4 changed files with 26 additions and 1 deletions
|
@ -70,10 +70,13 @@ public: \
|
||||||
#define KV_SERIALIZE_N(varialble, val_name) \
|
#define KV_SERIALIZE_N(varialble, val_name) \
|
||||||
epee::serialization::selector<is_store>::serialize(this_ref.varialble, stg, hparent_section, val_name);
|
epee::serialization::selector<is_store>::serialize(this_ref.varialble, stg, hparent_section, val_name);
|
||||||
|
|
||||||
|
template<typename T> inline void serialize_default(const T &t, T v) { }
|
||||||
|
template<typename T> inline void serialize_default(T &t, T v) { t = v; }
|
||||||
|
|
||||||
#define KV_SERIALIZE_OPT_N(variable, val_name, default_value) \
|
#define KV_SERIALIZE_OPT_N(variable, val_name, default_value) \
|
||||||
do { \
|
do { \
|
||||||
if (!epee::serialization::selector<is_store>::serialize(this_ref.variable, stg, hparent_section, val_name)) \
|
if (!epee::serialization::selector<is_store>::serialize(this_ref.variable, stg, hparent_section, val_name)) \
|
||||||
this_ref.variable = default_value; \
|
epee::serialize_default(this_ref.variable, default_value); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \
|
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \
|
||||||
|
|
|
@ -745,6 +745,15 @@ namespace cryptonote
|
||||||
*/
|
*/
|
||||||
uint8_t get_ideal_hard_fork_version(uint64_t height) const { return m_hardfork->get_ideal_version(height); }
|
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
|
* @brief get information about hardfork voting for a version
|
||||||
*
|
*
|
||||||
|
|
|
@ -195,10 +195,12 @@ namespace cryptonote
|
||||||
{
|
{
|
||||||
uint64_t current_height;
|
uint64_t current_height;
|
||||||
crypto::hash top_id;
|
crypto::hash top_id;
|
||||||
|
uint8_t top_version;
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(current_height)
|
KV_SERIALIZE(current_height)
|
||||||
KV_SERIALIZE_VAL_POD_AS_BLOB(top_id)
|
KV_SERIALIZE_VAL_POD_AS_BLOB(top_id)
|
||||||
|
KV_SERIALIZE_OPT(top_version, (uint8_t)0)
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -256,6 +256,14 @@ namespace cryptonote
|
||||||
if(context.m_state == cryptonote_connection_context::state_synchronizing)
|
if(context.m_state == cryptonote_connection_context::state_synchronizing)
|
||||||
return true;
|
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();
|
uint64_t target = m_core.get_target_blockchain_height();
|
||||||
if (target == 0)
|
if (target == 0)
|
||||||
target = m_core.get_current_blockchain_height();
|
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)
|
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);
|
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;
|
hshd.current_height +=1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -348,6 +357,7 @@ namespace cryptonote
|
||||||
{
|
{
|
||||||
LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection");
|
LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection");
|
||||||
m_p2p->drop_connection(context);
|
m_p2p->drop_connection(context);
|
||||||
|
m_p2p->add_host_fail(context.m_remote_address);
|
||||||
m_block_queue.flush_spans(context.m_connection_id);
|
m_block_queue.flush_spans(context.m_connection_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -616,6 +626,7 @@ namespace cryptonote
|
||||||
{
|
{
|
||||||
LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection");
|
LOG_PRINT_CCONTEXT_L0("Block verification failed, dropping connection");
|
||||||
m_p2p->drop_connection(context);
|
m_p2p->drop_connection(context);
|
||||||
|
m_p2p->add_host_fail(context.m_remote_address);
|
||||||
m_block_queue.flush_spans(context.m_connection_id);
|
m_block_queue.flush_spans(context.m_connection_id);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue