Merge PR Remove the message_parser class (#4175)

Remove the message_parser class
This commit is contained in:
Thiago Silva 2023-03-07 17:25:33 -03:00 committed by GitHub
commit 0e80477d2a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 335 deletions

View file

@ -1,3 +1,4 @@
#include <nano/crypto_lib/random_pool.hpp>
#include <nano/node/common.hpp>
#include <nano/node/network.hpp>
#include <nano/secure/buffer.hpp>
@ -5,8 +6,7 @@
#include <gtest/gtest.h>
#include <boost/algorithm/string.hpp>
#include <boost/variant/get.hpp>
#include <boost/asio/ip/address_v6.hpp>
namespace
{

View file

@ -1,19 +1,30 @@
#include <nano/lib/blocks.hpp>
#include <nano/lib/config.hpp>
#include <nano/lib/memory.hpp>
#include <nano/lib/stats_enums.hpp>
#include <nano/lib/stream.hpp>
#include <nano/lib/utility.hpp>
#include <nano/lib/work.hpp>
#include <nano/node/active_transactions.hpp>
#include <nano/node/common.hpp>
#include <nano/node/election.hpp>
#include <nano/node/messages.hpp>
#include <nano/node/network.hpp>
#include <nano/node/wallet.hpp>
#include <nano/secure/buffer.hpp>
#include <boost/asio/ip/address_v6.hpp>
#include <boost/endian/conversion.hpp>
#include <boost/format.hpp>
#include <boost/pool/pool_alloc.hpp>
#include <bitset>
#include <chrono>
#include <cstdint>
#include <memory>
#include <sstream>
#include <stdexcept>
#include <string>
#include <utility>
#include <vector>
/*
* message_header
@ -359,289 +370,6 @@ nano::message_type nano::message::type () const
return header.type;
}
/*
* message_parser
*/
// MTU - IP header - UDP header
std::size_t const nano::message_parser::max_safe_udp_message_size = 508;
std::string nano::message_parser::status_string ()
{
switch (status)
{
case nano::message_parser::parse_status::success:
{
return "success";
}
case nano::message_parser::parse_status::insufficient_work:
{
return "insufficient_work";
}
case nano::message_parser::parse_status::invalid_header:
{
return "invalid_header";
}
case nano::message_parser::parse_status::invalid_message_type:
{
return "invalid_message_type";
}
case nano::message_parser::parse_status::invalid_keepalive_message:
{
return "invalid_keepalive_message";
}
case nano::message_parser::parse_status::invalid_publish_message:
{
return "invalid_publish_message";
}
case nano::message_parser::parse_status::invalid_confirm_req_message:
{
return "invalid_confirm_req_message";
}
case nano::message_parser::parse_status::invalid_confirm_ack_message:
{
return "invalid_confirm_ack_message";
}
case nano::message_parser::parse_status::invalid_node_id_handshake_message:
{
return "invalid_node_id_handshake_message";
}
case nano::message_parser::parse_status::invalid_telemetry_req_message:
{
return "invalid_telemetry_req_message";
}
case nano::message_parser::parse_status::invalid_telemetry_ack_message:
{
return "invalid_telemetry_ack_message";
}
case nano::message_parser::parse_status::outdated_version:
{
return "outdated_version";
}
case nano::message_parser::parse_status::duplicate_publish_message:
{
return "duplicate_publish_message";
}
}
debug_assert (false);
return "[unknown parse_status]";
}
nano::message_parser::message_parser (nano::network_filter & publish_filter_a, nano::block_uniquer & block_uniquer_a, nano::vote_uniquer & vote_uniquer_a, nano::message_visitor & visitor_a, nano::work_pool & pool_a, nano::network_constants const & network) :
publish_filter (publish_filter_a),
block_uniquer (block_uniquer_a),
vote_uniquer (vote_uniquer_a),
visitor (visitor_a),
pool (pool_a),
status (parse_status::success),
network{ network }
{
}
void nano::message_parser::deserialize_buffer (uint8_t const * buffer_a, std::size_t size_a)
{
status = parse_status::success;
auto error (false);
if (size_a <= max_safe_udp_message_size)
{
// Guaranteed to be deliverable
nano::bufferstream stream (buffer_a, size_a);
nano::message_header header (error, stream);
if (!error)
{
if (header.network != network.current_network)
{
status = parse_status::invalid_header;
return;
}
if (header.version_using < network.protocol_version_min)
{
status = parse_status::outdated_version;
}
else
{
switch (header.type)
{
case nano::message_type::keepalive:
{
deserialize_keepalive (stream, header);
break;
}
case nano::message_type::publish:
{
nano::uint128_t digest;
if (!publish_filter.apply (buffer_a + header.size, size_a - header.size, &digest))
{
deserialize_publish (stream, header, digest);
}
else
{
status = parse_status::duplicate_publish_message;
}
break;
}
case nano::message_type::confirm_req:
{
deserialize_confirm_req (stream, header);
break;
}
case nano::message_type::confirm_ack:
{
deserialize_confirm_ack (stream, header);
break;
}
case nano::message_type::node_id_handshake:
{
deserialize_node_id_handshake (stream, header);
break;
}
case nano::message_type::telemetry_req:
{
deserialize_telemetry_req (stream, header);
break;
}
case nano::message_type::telemetry_ack:
{
deserialize_telemetry_ack (stream, header);
break;
}
default:
{
status = parse_status::invalid_message_type;
break;
}
}
}
}
else
{
status = parse_status::invalid_header;
}
}
}
void nano::message_parser::deserialize_keepalive (nano::stream & stream_a, nano::message_header const & header_a)
{
auto error (false);
nano::keepalive incoming (error, stream_a, header_a);
if (!error && at_end (stream_a))
{
visitor.keepalive (incoming);
}
else
{
status = parse_status::invalid_keepalive_message;
}
}
void nano::message_parser::deserialize_publish (nano::stream & stream_a, nano::message_header const & header_a, nano::uint128_t const & digest_a)
{
auto error (false);
nano::publish incoming (error, stream_a, header_a, digest_a, &block_uniquer);
if (!error && at_end (stream_a))
{
if (!network.work.validate_entry (*incoming.block))
{
visitor.publish (incoming);
}
else
{
status = parse_status::insufficient_work;
}
}
else
{
status = parse_status::invalid_publish_message;
}
}
void nano::message_parser::deserialize_confirm_req (nano::stream & stream_a, nano::message_header const & header_a)
{
auto error (false);
nano::confirm_req incoming (error, stream_a, header_a, &block_uniquer);
if (!error && at_end (stream_a))
{
if (incoming.block == nullptr || !network.work.validate_entry (*incoming.block))
{
visitor.confirm_req (incoming);
}
else
{
status = parse_status::insufficient_work;
}
}
else
{
status = parse_status::invalid_confirm_req_message;
}
}
void nano::message_parser::deserialize_confirm_ack (nano::stream & stream_a, nano::message_header const & header_a)
{
auto error (false);
nano::confirm_ack incoming (error, stream_a, header_a, &vote_uniquer);
if (!error && at_end (stream_a))
{
visitor.confirm_ack (incoming);
}
else
{
status = parse_status::invalid_confirm_ack_message;
}
}
void nano::message_parser::deserialize_node_id_handshake (nano::stream & stream_a, nano::message_header const & header_a)
{
bool error_l (false);
nano::node_id_handshake incoming (error_l, stream_a, header_a);
if (!error_l && at_end (stream_a))
{
visitor.node_id_handshake (incoming);
}
else
{
status = parse_status::invalid_node_id_handshake_message;
}
}
void nano::message_parser::deserialize_telemetry_req (nano::stream & stream_a, nano::message_header const & header_a)
{
nano::telemetry_req incoming (header_a);
if (at_end (stream_a))
{
visitor.telemetry_req (incoming);
}
else
{
status = parse_status::invalid_telemetry_req_message;
}
}
void nano::message_parser::deserialize_telemetry_ack (nano::stream & stream_a, nano::message_header const & header_a)
{
bool error_l (false);
nano::telemetry_ack incoming (error_l, stream_a, header_a);
// Intentionally not checking if at the end of stream, because these messages support backwards/forwards compatibility
if (!error_l)
{
visitor.telemetry_ack (incoming);
}
else
{
status = parse_status::invalid_telemetry_ack_message;
}
}
bool nano::message_parser::at_end (nano::stream & stream_a)
{
uint8_t junk;
auto end (nano::try_read (stream_a, junk));
return end;
}
/*
* keepalive
*/

View file

@ -1,18 +1,23 @@
#pragma once
#include <nano/boost/asio/ip/tcp.hpp>
#include <nano/boost/asio/ip/udp.hpp>
#include <nano/crypto_lib/random_pool.hpp>
#include <nano/lib/asio.hpp>
#include <nano/lib/blocks.hpp>
#include <nano/lib/config.hpp>
#include <nano/lib/errors.hpp>
#include <nano/lib/jsonconfig.hpp>
#include <nano/lib/memory.hpp>
#include <nano/lib/stats.hpp>
#include <nano/lib/numbers.hpp>
#include <nano/lib/stats_enums.hpp>
#include <nano/lib/stream.hpp>
#include <nano/node/common.hpp>
#include <nano/secure/common.hpp>
#include <nano/secure/network_filter.hpp>
#include <bitset>
#include <cstdint>
#include <memory>
#include <string>
#include <variant>
#include <vector>
namespace nano
{
@ -109,49 +114,6 @@ public:
nano::message_header header;
};
class work_pool;
class network_constants;
class message_parser final
{
public:
enum class parse_status
{
success,
insufficient_work,
invalid_header,
invalid_message_type,
invalid_keepalive_message,
invalid_publish_message,
invalid_confirm_req_message,
invalid_confirm_ack_message,
invalid_node_id_handshake_message,
invalid_telemetry_req_message,
invalid_telemetry_ack_message,
outdated_version,
duplicate_publish_message
};
message_parser (nano::network_filter &, nano::block_uniquer &, nano::vote_uniquer &, nano::message_visitor &, nano::work_pool &, nano::network_constants const & protocol);
void deserialize_buffer (uint8_t const *, std::size_t);
void deserialize_keepalive (nano::stream &, nano::message_header const &);
void deserialize_publish (nano::stream &, nano::message_header const &, nano::uint128_t const & = 0);
void deserialize_confirm_req (nano::stream &, nano::message_header const &);
void deserialize_confirm_ack (nano::stream &, nano::message_header const &);
void deserialize_node_id_handshake (nano::stream &, nano::message_header const &);
void deserialize_telemetry_req (nano::stream &, nano::message_header const &);
void deserialize_telemetry_ack (nano::stream &, nano::message_header const &);
bool at_end (nano::stream &);
nano::network_filter & publish_filter;
nano::block_uniquer & block_uniquer;
nano::vote_uniquer & vote_uniquer;
nano::message_visitor & visitor;
nano::work_pool & pool;
parse_status status;
nano::network_constants const & network;
std::string status_string ();
static std::size_t const max_safe_udp_message_size;
};
class keepalive final : public message
{
public: