Skip to content

Commit

Permalink
Dont peer with v20 and earlier after epoch 2 block is seen (#2701)
Browse files Browse the repository at this point in the history
* Don't actively peer with v20 nodes when an epoch 2 block is seen

* Drop peers and other improvements

* Formatting

* Update changes due to merge

* Use exchange (Gui comment)

* Ignore in-progress messages and purge any channels during periodic cleanup in case any are missed (Gui test)

* Use variable names for the constants (Serg review)
  • Loading branch information
wezrule authored Apr 9, 2020
1 parent 60a4c2f commit 99f9bd9
Show file tree
Hide file tree
Showing 28 changed files with 309 additions and 182 deletions.
4 changes: 2 additions & 2 deletions nano/core_test/block.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ TEST (frontier_req, serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
request1.serialize (stream);
request1.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream (bytes.data (), bytes.size ());
Expand All @@ -297,7 +297,7 @@ TEST (block, publish_req_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
req.serialize (stream);
req.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream2 (bytes.data (), bytes.size ());
Expand Down
22 changes: 22 additions & 0 deletions nano/core_test/ledger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3104,3 +3104,25 @@ TEST (ledger, epoch_2_started_flag)
nano::ledger ledger (node1.store, stats);
ASSERT_TRUE (ledger.cache.epoch_2_started.load ());
}

TEST (ledger, epoch_2_upgrade_callback)
{
nano::genesis genesis;
nano::stat stats;
nano::logger_mt logger;
auto store = nano::make_store (logger, nano::unique_path ());
ASSERT_TRUE (!store->init_error ());
bool cb_hit = false;
nano::ledger ledger (*store, stats, nano::generate_cache (), [&cb_hit]() {
cb_hit = true;
});
{
auto transaction (store->tx_begin_write ());
store->initialize (transaction, genesis, ledger.cache);
}
nano::work_pool pool (std::numeric_limits<unsigned>::max ());
upgrade_epoch (pool, ledger, nano::epoch::epoch_1);
ASSERT_FALSE (cb_hit);
auto latest = upgrade_epoch (pool, ledger, nano::epoch::epoch_2);
ASSERT_TRUE (cb_hit);
}
20 changes: 10 additions & 10 deletions nano/core_test/message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ TEST (message, keepalive_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
request1.serialize (stream);
request1.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream (bytes.data (), bytes.size ());
Expand All @@ -30,7 +30,7 @@ TEST (message, keepalive_deserialize)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message1.serialize (stream);
message1.serialize (stream, false);
}
nano::bufferstream stream (bytes.data (), bytes.size ());
auto error (false);
Expand All @@ -50,22 +50,22 @@ TEST (message, publish_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
publish.header.serialize (stream);
publish.header.serialize (stream, false);
}
ASSERT_EQ (8, bytes.size ());
ASSERT_EQ (0x52, bytes[0]);
ASSERT_EQ (0x41, bytes[1]);
ASSERT_EQ (params.protocol.protocol_version, bytes[2]);
ASSERT_EQ (params.protocol.protocol_version, bytes[3]);
ASSERT_EQ (params.protocol.protocol_version_min, bytes[4]);
ASSERT_EQ (params.protocol.protocol_version_min (false), bytes[4]);
ASSERT_EQ (static_cast<uint8_t> (nano::message_type::publish), bytes[5]);
ASSERT_EQ (0x00, bytes[6]); // extensions
ASSERT_EQ (static_cast<uint8_t> (nano::block_type::send), bytes[7]);
nano::bufferstream stream (bytes.data (), bytes.size ());
auto error (false);
nano::message_header header (error, stream);
ASSERT_FALSE (error);
ASSERT_EQ (params.protocol.protocol_version_min, header.version_min);
ASSERT_EQ (params.protocol.protocol_version_min (false), header.version_min ());
ASSERT_EQ (params.protocol.protocol_version, header.version_using);
ASSERT_EQ (params.protocol.protocol_version, header.version_max);
ASSERT_EQ (nano::message_type::publish, header.type);
Expand All @@ -79,7 +79,7 @@ TEST (message, confirm_ack_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream1 (bytes);
con1.serialize (stream1);
con1.serialize (stream1, false);
}
nano::bufferstream stream2 (bytes.data (), bytes.size ());
bool error (false);
Expand Down Expand Up @@ -107,7 +107,7 @@ TEST (message, confirm_ack_hash_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream1 (bytes);
con1.serialize (stream1);
con1.serialize (stream1, false);
}
nano::bufferstream stream2 (bytes.data (), bytes.size ());
bool error (false);
Expand Down Expand Up @@ -135,7 +135,7 @@ TEST (message, confirm_req_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
req.serialize (stream);
req.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream2 (bytes.data (), bytes.size ());
Expand All @@ -155,7 +155,7 @@ TEST (message, confirm_req_hash_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
req.serialize (stream);
req.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream2 (bytes.data (), bytes.size ());
Expand Down Expand Up @@ -188,7 +188,7 @@ TEST (message, confirm_req_hash_batch_serialization)
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
req.serialize (stream);
req.serialize (stream, false);
}
auto error (false);
nano::bufferstream stream2 (bytes.data (), bytes.size ());
Expand Down
20 changes: 10 additions & 10 deletions nano/core_test/message_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,14 @@ TEST (message_parser, exact_confirm_ack_size)
nano::network_filter filter (1);
nano::block_uniquer block_uniquer;
nano::vote_uniquer vote_uniquer (block_uniquer);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work, false);
auto block (std::make_shared<nano::send_block> (1, 1, 2, nano::keypair ().prv, 4, *system.work.generate (nano::root (1))));
auto vote (std::make_shared<nano::vote> (0, nano::keypair ().prv, 0, std::move (block)));
nano::confirm_ack message (vote);
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message.serialize (stream);
message.serialize (stream, true);
}
ASSERT_EQ (0, visitor.confirm_ack_count);
ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
Expand All @@ -100,13 +100,13 @@ TEST (message_parser, exact_confirm_req_size)
nano::network_filter filter (1);
nano::block_uniquer block_uniquer;
nano::vote_uniquer vote_uniquer (block_uniquer);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work, false);
auto block (std::make_shared<nano::send_block> (1, 1, 2, nano::keypair ().prv, 4, *system.work.generate (nano::root (1))));
nano::confirm_req message (std::move (block));
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message.serialize (stream);
message.serialize (stream, false);
}
ASSERT_EQ (0, visitor.confirm_req_count);
ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
Expand All @@ -133,13 +133,13 @@ TEST (message_parser, exact_confirm_req_hash_size)
nano::network_filter filter (1);
nano::block_uniquer block_uniquer;
nano::vote_uniquer vote_uniquer (block_uniquer);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work, true);
nano::send_block block (1, 1, 2, nano::keypair ().prv, 4, *system.work.generate (nano::root (1)));
nano::confirm_req message (block.hash (), block.root ());
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message.serialize (stream);
message.serialize (stream, false);
}
ASSERT_EQ (0, visitor.confirm_req_count);
ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
Expand All @@ -166,13 +166,13 @@ TEST (message_parser, exact_publish_size)
nano::network_filter filter (1);
nano::block_uniquer block_uniquer;
nano::vote_uniquer vote_uniquer (block_uniquer);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work, true);
auto block (std::make_shared<nano::send_block> (1, 1, 2, nano::keypair ().prv, 4, *system.work.generate (nano::root (1))));
nano::publish message (std::move (block));
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message.serialize (stream);
message.serialize (stream, false);
}
ASSERT_EQ (0, visitor.publish_count);
ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
Expand All @@ -199,12 +199,12 @@ TEST (message_parser, exact_keepalive_size)
nano::network_filter filter (1);
nano::block_uniquer block_uniquer;
nano::vote_uniquer vote_uniquer (block_uniquer);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work);
nano::message_parser parser (filter, block_uniquer, vote_uniquer, visitor, system.work, true);
nano::keepalive message;
std::vector<uint8_t> bytes;
{
nano::vectorstream stream (bytes);
message.serialize (stream);
message.serialize (stream, true);
}
ASSERT_EQ (0, visitor.keepalive_count);
ASSERT_EQ (parser.status, nano::message_parser::parse_status::success);
Expand Down
8 changes: 4 additions & 4 deletions nano/core_test/network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -784,7 +784,7 @@ TEST (tcp_listener, tcp_node_id_handshake)
auto bootstrap_endpoint (system.nodes[0]->bootstrap.endpoint ());
auto cookie (system.nodes[0]->network.syn_cookies.assign (nano::transport::map_tcp_to_endpoint (bootstrap_endpoint)));
nano::node_id_handshake node_id_handshake (cookie, boost::none);
auto input (node_id_handshake.to_shared_const_buffer ());
auto input (node_id_handshake.to_shared_const_buffer (false));
std::atomic<bool> write_done (false);
socket->async_connect (bootstrap_endpoint, [&input, socket, &write_done](boost::system::error_code const & ec) {
ASSERT_FALSE (ec);
Expand All @@ -803,7 +803,7 @@ TEST (tcp_listener, tcp_node_id_handshake)

boost::optional<std::pair<nano::account, nano::signature>> response_zero (std::make_pair (nano::account (0), nano::signature (0)));
nano::node_id_handshake node_id_handshake_response (boost::none, response_zero);
auto output (node_id_handshake_response.to_bytes ());
auto output (node_id_handshake_response.to_bytes (false));
std::atomic<bool> done (false);
socket->async_read (output, output->size (), [&output, &done](boost::system::error_code const & ec, size_t size_a) {
ASSERT_FALSE (ec);
Expand Down Expand Up @@ -851,7 +851,7 @@ TEST (tcp_listener, tcp_listener_timeout_node_id_handshake)
auto socket (std::make_shared<nano::socket> (node0));
auto cookie (node0->network.syn_cookies.assign (nano::transport::map_tcp_to_endpoint (node0->bootstrap.endpoint ())));
nano::node_id_handshake node_id_handshake (cookie, boost::none);
auto input (node_id_handshake.to_shared_const_buffer ());
auto input (node_id_handshake.to_shared_const_buffer (false));
socket->async_connect (node0->bootstrap.endpoint (), [&input, socket](boost::system::error_code const & ec) {
ASSERT_FALSE (ec);
socket->async_write (input, [&input](boost::system::error_code const & ec, size_t size_a) {
Expand Down Expand Up @@ -1014,7 +1014,7 @@ TEST (network, bandwidth_limiter)
nano::system system;
nano::genesis genesis;
nano::publish message (genesis.open);
auto message_size = message.to_bytes ()->size ();
auto message_size = message.to_bytes (false)->size ();
auto message_limit = 4; // must be multiple of the number of channels
nano::node_config node_config (nano::get_available_port (), system.logging);
node_config.bandwidth_limit = message_limit * message_size;
Expand Down
4 changes: 2 additions & 2 deletions nano/core_test/network_filter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ TEST (network_filter, unit)
nano::network_filter filter (1);
auto one_block = [&filter](std::shared_ptr<nano::block> const & block_a, bool expect_duplicate_a) {
nano::publish message (block_a);
auto bytes (message.to_bytes ());
auto bytes (message.to_bytes (false));
nano::bufferstream stream (bytes->data (), bytes->size ());

// First read the header
Expand Down Expand Up @@ -60,7 +60,7 @@ TEST (network_filter, many)
auto block (std::make_shared<nano::state_block> (nano::test_genesis_key.pub, genesis.open->hash (), nano::test_genesis_key.pub, nano::genesis_amount - i * 10 * nano::xrb_ratio, key1.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0));

nano::publish message (block);
auto bytes (message.to_bytes ());
auto bytes (message.to_bytes (false));
nano::bufferstream stream (bytes->data (), bytes->size ());

// First read the header
Expand Down
2 changes: 1 addition & 1 deletion nano/core_test/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1655,7 +1655,7 @@ TEST (node, fork_no_vote_quorum)
std::vector<uint8_t> buffer;
{
nano::vectorstream stream (buffer);
confirm.serialize (stream);
confirm.serialize (stream, false);
}
nano::transport::channel_udp channel (node2.network.udp_channels, node3.network.endpoint (), node1.network_params.protocol.protocol_version);
channel.send_buffer (nano::shared_const_buffer (std::move (buffer)), nano::stat::detail::confirm_ack);
Expand Down
2 changes: 1 addition & 1 deletion nano/core_test/peer_container.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ TEST (peer_container, depeer)
nano::endpoint endpoint0 (boost::asio::ip::address_v6::loopback (), nano::get_available_port ());
nano::keepalive message;
message.header.version_using = 1;
auto bytes (message.to_bytes ());
auto bytes (message.to_bytes (false));
nano::message_buffer buffer = { bytes->data (), bytes->size (), endpoint0 };
system.nodes[0]->network.udp_channels.receive_action (&buffer);
ASSERT_EQ (1, system.nodes[0]->stats.count (nano::stat::type::udp, nano::stat::detail::outdated_version));
Expand Down
2 changes: 1 addition & 1 deletion nano/node/bootstrap/bootstrap_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@ class request_response_visitor : public nano::message_visitor
debug_assert (!nano::validate_message (response->first, *message_a.query, response->second));
auto cookie (connection->node->network.syn_cookies.assign (nano::transport::map_tcp_to_endpoint (connection->remote_endpoint)));
nano::node_id_handshake response_message (cookie, response);
auto shared_const_buffer = response_message.to_shared_const_buffer ();
auto shared_const_buffer = response_message.to_shared_const_buffer (connection->node->ledger.cache.epoch_2_started);
connection->socket->async_write (shared_const_buffer, [connection = std::weak_ptr<nano::bootstrap_server> (connection)](boost::system::error_code const & ec, size_t size_a) {
if (auto connection_l = connection.lock ())
{
Expand Down
Loading

1 comment on commit 99f9bd9

@brunoerg
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couldn't I run an old version of the protocol and change the 'version' constant of my node to 100, for example?

Please sign in to comment.