35 #include <boost/asio/io_service.hpp> 36 #include <boost/asio/ip/tcp.hpp> 37 #include <boost/thread.hpp> 38 #include <boost/optional/optional_fwd.hpp> 39 #include <boost/program_options/options_description.hpp> 40 #include <boost/program_options/variables_map.hpp> 41 #include <boost/uuid/uuid.hpp> 68 : max_connections(-1),
81 : max_connections(-1),
95 boost::optional<std::vector<proxy>>
get_proxies(
const boost::program_options::variables_map& vm);
96 boost::optional<std::vector<anonymous_inbound>>
get_anonymous_inbounds(
const boost::program_options::variables_map& vm);
102 boost::optional<boost::asio::ip::tcp::socket>
106 template<
class base_type>
116 template<
class t_payload_net_handler>
118 public i_p2p_endpoint<typename t_payload_net_handler::connection_context>,
139 m_peer_id(crypto::rand<uint64_t>()),
152 : m_connect(
nullptr),
160 m_current_number_of_out_peers(0),
161 m_current_number_of_in_peers(0),
162 m_can_pingback(
false)
164 set_config_defaults();
167 network_zone(boost::asio::io_service& public_service)
168 : m_connect(
nullptr),
176 m_current_number_of_out_peers(0),
177 m_current_number_of_in_peers(0),
178 m_can_pingback(
false)
180 set_config_defaults();
183 connect_func* m_connect;
190 boost::asio::ip::tcp::endpoint m_proxy_address;
191 std::atomic<unsigned int> m_current_number_of_out_peers;
192 std::atomic<unsigned int> m_current_number_of_in_peers;
196 void set_config_defaults() noexcept
201 m_config.m_net_config.config_id = 0;
213 : m_payload_handler(payload_handler),
216 m_allow_local_ip(
false),
217 m_hide_my_port(
false),
226 static void init_options(boost::program_options::options_description& desc);
230 bool init(
const boost::program_options::variables_map& vm);
232 bool send_stop_signal();
234 t_payload_net_handler& get_payload_object();
238 bool log_connections();
241 virtual uint64_t get_public_connections_count();
242 size_t get_public_outgoing_connections_count();
243 size_t get_public_white_peers_count();
244 size_t get_public_gray_peers_count();
245 void get_public_peerlist(std::vector<peerlist_entry>& gray, std::vector<peerlist_entry>& white);
248 void change_max_out_public_peers(
size_t count);
249 void change_max_in_public_peers(
size_t count);
254 virtual void add_used_stripe_peer(
const typename t_payload_net_handler::connection_context &
context);
255 virtual void remove_used_stripe_peer(
const typename t_payload_net_handler::connection_context &
context);
256 virtual void clear_used_stripe_peers();
259 const std::vector<std::string> m_seed_nodes_list =
261 "seeds.electroneumseed.com",
262 "seeds.electroneumseed.info",
263 "seeds.electroneumseed.org",
264 "seeds.electroneumseed.net",
267 bool islimitup=
false;
268 bool islimitdown=
false;
270 typedef COMMAND_REQUEST_STAT_INFO_T<typename t_payload_net_handler::stat_info> COMMAND_REQUEST_STAT_INFO;
282 #ifdef ALLOW_DEBUG_COMMANDS 283 HANDLE_INVOKE_T2(COMMAND_REQUEST_STAT_INFO, &node_server::handle_get_stat_info)
284 HANDLE_INVOKE_T2(COMMAND_REQUEST_NETWORK_STATE, &node_server::handle_get_network_state)
287 HANDLE_INVOKE_T2(COMMAND_REQUEST_SUPPORT_FLAGS, &node_server::handle_get_support_flags)
291 enum PeerType { anchor = 0, white, gray };
297 #ifdef ALLOW_DEBUG_COMMANDS 304 bool make_default_peer_id();
305 bool make_default_config();
311 virtual void on_connection_new(p2p_connection_context&
context);
312 virtual void on_connection_close(p2p_connection_context&
context);
313 virtual void callback(p2p_connection_context&
context);
315 virtual bool relay_notify_to_list(
int command,
const epee::span<const uint8_t> data_buff, std::vector<std::pair<epee::net_utils::zone, boost::uuids::uuid>> connections);
320 virtual void for_each_connection(std::function<
bool(
typename t_payload_net_handler::connection_context&,
peerid_type,
uint32_t)> f);
327 bool handle_command_line(
328 const boost::program_options::variables_map& vm
332 bool get_local_node_data(basic_node_data& node_data,
const network_zone&
zone);
335 bool merge_peerlist_with_local(
const std::vector<peerlist_entry>& bs);
336 bool fix_time_delta(std::vector<peerlist_entry>& local_peerlist, time_t local_time,
int64_t& delta);
338 bool connections_maker();
339 bool peer_sync_idle_maker();
340 bool do_handshake_with_peer(
peerid_type& pi, p2p_connection_context&
context,
bool just_take_peerlist =
false);
343 bool make_new_connection_from_anchor_peerlist(
const std::vector<anchor_peerlist_entry>& anchor_peerlist);
344 bool make_new_connection_from_peerlist(network_zone&
zone,
bool use_white_list);
346 size_t get_random_index_with_fixed_probability(
size_t max_index);
352 template<
class t_callback>
353 bool try_ping(basic_node_data& node_data, p2p_connection_context&
context,
const t_callback &cb);
354 bool try_get_support_flags(
const p2p_connection_context&
context, std::function<
void(p2p_connection_context&,
const uint32_t&)> f);
355 bool make_expected_connections_count(network_zone&
zone, PeerType peer_type,
size_t expected_connections);
360 bool connect_to_seed();
362 template <
class Container>
363 bool connect_to_peerlist(
const Container& peers);
365 template <
class Container>
366 bool parse_peers_and_add_to_container(
const boost::program_options::variables_map& vm,
const command_line::arg_descriptor<std::vector<std::string> > & arg, Container& container);
368 bool set_max_out_peers(network_zone&
zone,
int64_t max);
369 bool set_max_in_peers(network_zone&
zone,
int64_t max);
370 bool set_tos_flag(
const boost::program_options::variables_map& vm,
int limit);
372 bool set_rate_up_limit(
const boost::program_options::variables_map& vm,
int64_t limit);
373 bool set_rate_down_limit(
const boost::program_options::variables_map& vm,
int64_t limit);
374 bool set_rate_limit(
const boost::program_options::variables_map& vm,
int64_t limit);
378 size_t get_incoming_connections_count();
379 size_t get_incoming_connections_count(network_zone&);
380 size_t get_outgoing_connections_count();
381 size_t get_outgoing_connections_count(network_zone&);
384 bool gray_peerlist_housekeeping();
385 bool check_incoming_connections();
388 _info(
"Killing the net_node");
390 if(mPeersLoggerThread !=
nullptr)
391 mPeersLoggerThread->join();
392 _info(
"Joined extra background net_node threads");
403 m_save_graph = save_graph;
409 m_rpc_port = rpc_port;
416 bool m_first_connection_maker_call;
420 bool m_allow_local_ip;
424 std::atomic<bool> m_save_graph;
425 std::atomic<bool> is_closing;
426 std::unique_ptr<boost::thread> mPeersLoggerThread;
430 t_payload_net_handler& m_payload_handler;
439 #ifdef ALLOW_DEBUG_COMMANDS 442 std::list<epee::net_utils::network_address> m_priority_peers;
443 std::vector<epee::net_utils::network_address> m_exclusive_peers;
444 std::vector<epee::net_utils::network_address> m_seed_nodes;
445 bool m_fallback_seed_nodes_added;
446 std::vector<nodetool::peerlist_entry> m_command_line_peers;
460 std::map<epee::net_utils::zone, network_zone> m_network_zones;
463 std::map<epee::net_utils::network_address, time_t> m_conn_fails_cache;
467 std::map<std::string, time_t> m_blocked_hosts;
470 std::map<std::string, uint64_t> m_host_fails_score;
472 boost::mutex m_used_stripe_peers_mutex;
#define P2P_DEFAULT_HANDSHAKE_INTERVAL
void init_options(boost::program_options::options_description &hidden_options, boost::program_options::options_description &normal_options)
#define P2P_DEFAULT_PING_CONNECTION_TIMEOUT
epee::misc_utils::struct_init< response_t > response
#define LEVIN_ERROR_CONNECTION_HANDLER_NOT_DEFINED
#define CRYPTONOTE_PRUNING_LOG_STRIPES
Non-owning sequence of data. Does not deep copy.
#define CHAIN_INVOKE_MAP_TO_OBJ_FORCE_CONTEXT(obj, context_type)
#define P2P_DEFAULT_LIMIT_RATE_DOWN
#define BEGIN_INVOKE_MAP2(owner_type)
#define P2P_DEFAULT_PEERS_IN_HANDSHAKE
static void set_save_graph(bool save_graph)
mdb_size_t count(MDB_cursor *cur)
#define P2P_DEFAULT_CONNECTION_TIMEOUT
the connection templated-class for one peer connection
unsigned __int64 uint64_t
#define CRITICAL_REGION_LOCAL(x)
std::unique_ptr< void, terminate > context
Unique ZMQ context handle, calls zmq_term on destruction.
#define END_INVOKE_MAP2()
boost::endian::big_uint16_t port
#define HANDLE_INVOKE_T2(COMMAND, func)
#define CHAIN_LEVIN_NOTIFY_MAP2(context_type)
p2p_connection_context_t()
TProtocol::config_type m_config
DISABLE_VS_WARNINGS(4244 4345 4503) using namespace crypto
#define P2P_DEFAULT_LIMIT_RATE_UP
#define CHAIN_LEVIN_INVOKE_MAP2(context_type)
#define P2P_DEFAULT_PACKET_MAX_SIZE