32 #include <boost/thread.hpp> 33 #include <boost/program_options/options_description.hpp> 34 #include <boost/program_options/variables_map.hpp> 35 #include <boost/serialization/version.hpp> 36 #include <boost/uuid/uuid.hpp> 37 #include <boost/serialization/map.hpp> 41 #include "net/levin_server_cp2.h" 43 #include "storages/levin_abstract_invoke2.h" 45 #include "math_helper.h" 54 template<
class base_type>
64 template<
class t_payload_net_handler>
65 class node_server:
public epee::levin::levin_commands_handler<p2p_connection_context_t<typename t_payload_net_handler::connection_context> >,
66 public i_p2p_endpoint<typename t_payload_net_handler::connection_context>,
67 public epee::net_utils::i_connection_filter
82 :m_payload_handler(payload_handler),
83 m_current_number_of_out_peers(0),
84 m_current_number_of_in_peers(0),
85 m_allow_local_ip(
false),
86 m_hide_my_port(
false),
91 m_net_server(
epee::net_utils::e_connection_type_P2P )
96 static void init_options(boost::program_options::options_description& desc);
99 bool init(
const boost::program_options::variables_map& vm);
101 bool send_stop_signal();
103 t_payload_net_handler& get_payload_object();
105 template <
class Archive,
class t_version_type>
118 bool log_connections();
119 virtual uint64_t get_connections_count();
120 size_t get_outgoing_connections_count();
121 size_t get_incoming_connections_count();
123 void delete_out_connections(
size_t count);
124 void delete_in_connections(
size_t count);
125 virtual bool block_host(
const epee::net_utils::network_address &adress, time_t seconds =
P2P_IP_BLOCKTIME);
126 virtual bool unblock_host(
const epee::net_utils::network_address &address);
127 virtual std::map<std::string, time_t>
get_blocked_hosts() { CRITICAL_REGION_LOCAL(m_blocked_hosts_lock);
return m_blocked_hosts; }
129 const std::vector<std::string> m_seed_nodes_list =
130 {
"seeds.moneroseeds.se" 131 ,
"seeds.moneroseeds.ae.org" 132 ,
"seeds.moneroseeds.ch" 133 ,
"seeds.moneroseeds.li" 136 bool islimitup=
false;
137 bool islimitdown=
false;
147 HANDLE_INVOKE_T2(
COMMAND_PING, &node_server::handle_ping)
148 #ifdef ALLOW_DEBUG_COMMANDS 150 HANDLE_INVOKE_T2(COMMAND_REQUEST_NETWORK_STATE, &node_server::handle_get_network_state)
151 HANDLE_INVOKE_T2(COMMAND_REQUEST_PEER_ID, &node_server::handle_get_peer_id)
153 HANDLE_INVOKE_T2(COMMAND_REQUEST_SUPPORT_FLAGS, &node_server::handle_get_support_flags)
154 CHAIN_INVOKE_MAP_TO_OBJ_FORCE_CONTEXT(m_payload_handler,
typename t_payload_net_handler::connection_context&)
160 int handle_handshake(
int command,
typename COMMAND_HANDSHAKE::request& arg,
typename COMMAND_HANDSHAKE::response& rsp, p2p_connection_context& context);
161 int handle_timed_sync(
int command,
typename COMMAND_TIMED_SYNC::request& arg,
typename COMMAND_TIMED_SYNC::response& rsp, p2p_connection_context& context);
163 #ifdef ALLOW_DEBUG_COMMANDS 164 int handle_get_stat_info(
int command,
typename COMMAND_REQUEST_STAT_INFO::request& arg,
typename COMMAND_REQUEST_STAT_INFO::response& rsp, p2p_connection_context& context);
165 int handle_get_network_state(
int command, COMMAND_REQUEST_NETWORK_STATE::request& arg, COMMAND_REQUEST_NETWORK_STATE::response& rsp, p2p_connection_context& context);
166 int handle_get_peer_id(
int command, COMMAND_REQUEST_PEER_ID::request& arg, COMMAND_REQUEST_PEER_ID::response& rsp, p2p_connection_context& context);
168 int handle_get_support_flags(
int command, COMMAND_REQUEST_SUPPORT_FLAGS::request& arg, COMMAND_REQUEST_SUPPORT_FLAGS::response& rsp, p2p_connection_context& context);
170 bool make_default_peer_id();
171 bool make_default_config();
173 bool check_trust(
const proof_of_trust&
tr);
177 virtual void on_connection_new(p2p_connection_context& context);
178 virtual void on_connection_close(p2p_connection_context& context);
179 virtual void callback(p2p_connection_context& context);
181 virtual bool relay_notify_to_list(
int command,
const std::string& data_buff,
const std::list<boost::uuids::uuid> &connections);
182 virtual bool relay_notify_to_all(
int command,
const std::string& data_buff,
const epee::net_utils::connection_context_base& context);
183 virtual bool invoke_command_to_peer(
int command,
const std::string& req_buff, std::string& resp_buff,
const epee::net_utils::connection_context_base& context);
184 virtual bool invoke_notify_to_peer(
int command,
const std::string& req_buff,
const epee::net_utils::connection_context_base& context);
185 virtual bool drop_connection(
const epee::net_utils::connection_context_base& context);
186 virtual void request_callback(
const epee::net_utils::connection_context_base& context);
187 virtual void for_each_connection(std::function<
bool(
typename t_payload_net_handler::connection_context&,
peerid_type, uint32_t)> f);
188 virtual bool for_connection(
const boost::uuids::uuid&, std::function<
bool(
typename t_payload_net_handler::connection_context&,
peerid_type, uint32_t)> f);
189 virtual bool add_host_fail(
const epee::net_utils::network_address &address);
191 virtual bool is_remote_host_allowed(
const epee::net_utils::network_address &address);
193 bool parse_peer_from_string(epee::net_utils::network_address& pe,
const std::string& node_addr, uint16_t default_port = 0);
194 bool handle_command_line(
195 const boost::program_options::variables_map& vm
198 bool handle_remote_peerlist(
const std::list<peerlist_entry>& peerlist, time_t local_time,
const epee::net_utils::connection_context_base& context);
202 bool merge_peerlist_with_local(
const std::list<peerlist_entry>& bs);
203 bool fix_time_delta(std::list<peerlist_entry>& local_peerlist, time_t local_time, int64_t& delta);
205 bool connections_maker();
206 bool peer_sync_idle_maker();
207 bool do_handshake_with_peer(
peerid_type& pi, p2p_connection_context& context,
bool just_take_peerlist =
false);
208 bool do_peer_timed_sync(
const epee::net_utils::connection_context_base& context,
peerid_type peer_id);
210 bool make_new_connection_from_anchor_peerlist(
const std::vector<anchor_peerlist_entry>& anchor_peerlist);
211 bool make_new_connection_from_peerlist(
bool use_white_list);
212 bool try_to_connect_and_handshake_with_new_peer(
const epee::net_utils::network_address& na,
bool just_take_peerlist =
false, uint64_t last_seen_stamp = 0, PeerType peer_type = white, uint64_t first_seen_stamp = 0);
213 size_t get_random_index_with_fixed_probability(
size_t max_index);
216 bool is_addr_connected(
const epee::net_utils::network_address& peer);
217 void add_upnp_port_mapping(uint32_t port);
218 void delete_upnp_port_mapping(uint32_t port);
219 template<
class t_callback>
220 bool try_ping(
basic_node_data& node_data, p2p_connection_context& context,
const t_callback &cb);
221 bool try_get_support_flags(
const p2p_connection_context& context, std::function<
void(p2p_connection_context&,
const uint32_t&)> f);
222 bool make_expected_connections_count(PeerType peer_type,
size_t expected_connections);
223 void cache_connect_fail_info(
const epee::net_utils::network_address& addr);
224 bool is_addr_recently_failed(
const epee::net_utils::network_address& addr);
225 bool is_priority_node(
const epee::net_utils::network_address& na);
227 bool connect_to_seed();
229 template <
class Container>
230 bool connect_to_peerlist(
const Container& peers);
232 template <
class Container>
233 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);
235 bool set_max_out_peers(
const boost::program_options::variables_map& vm, int64_t max);
236 bool set_max_in_peers(
const boost::program_options::variables_map& vm, int64_t max);
237 bool set_tos_flag(
const boost::program_options::variables_map& vm,
int limit);
239 bool set_rate_up_limit(
const boost::program_options::variables_map& vm, int64_t limit);
240 bool set_rate_down_limit(
const boost::program_options::variables_map& vm, int64_t limit);
241 bool set_rate_limit(
const boost::program_options::variables_map& vm, int64_t limit);
243 bool has_too_many_connections(
const epee::net_utils::network_address &address);
245 bool check_connection_and_handshake_with_peer(
const epee::net_utils::network_address& na, uint64_t last_seen_stamp);
246 bool gray_peerlist_housekeeping();
247 bool check_incoming_connections();
250 _info(
"Killing the net_node");
252 if(mPeersLoggerThread !=
nullptr)
253 mPeersLoggerThread->join();
254 _info(
"Joined extra background net_node threads");
258 std::string print_connections_container();
261 typedef epee::net_utils::boosted_tcp_server<epee::levin::async_protocol_handler<p2p_connection_context> >
net_server;
269 BEGIN_KV_SERIALIZE_MAP()
270 KV_SERIALIZE(m_net_config)
271 KV_SERIALIZE(m_peer_id)
272 KV_SERIALIZE(m_support_flags)
273 END_KV_SERIALIZE_MAP()
278 std::atomic<
unsigned int> m_current_number_of_out_peers;
279 std::atomic<
unsigned int> m_current_number_of_in_peers;
281 void set_save_graph(
bool save_graph)
283 m_save_graph = save_graph;
284 epee::net_utils::connection_basic::set_save_graph(save_graph);
315 #ifdef ALLOW_DEBUG_COMMANDS 316 uint64_t m_last_stat_request_time;
#define tr(x)
Definition: common_defines.h:4
PUSH_WARNINGS
Definition: hash-ops.h:53
void init_options(boost::program_options::options_description &hidden_options, boost::program_options::options_description &normal_options)
Definition: posix_daemonizer.inl:56
static void init(std::string cache_filename)
Definition: blockchain_blackball.cpp:223
bool m_in_timedsync
Definition: net_node.h:61
Definition: blockchain_ancestry.cpp:70
Definition: cryptonote_config.h:151
#define P2P_IP_BLOCKTIME
Definition: cryptonote_config.h:117
Definition: p2p_protocol_defs.h:85
#define false
Definition: stdbool.h:37
network_type
Definition: cryptonote_config.h:204
Definition: cryptonote_format_utils.h:41
uint32_t support_flags
Definition: net_node.h:60
string a
Definition: MakeCryptoOps.py:15
Definition: net_node.h:55
p2p_connection_context_t()
Definition: net_node.h:57
peerid_type peer_id
Definition: net_node.h:59
DISABLE_VS_WARNINGS(4244 4345 4503) using namespace crypto
Definition: command_line.h:53
Definition: p2p_protocol_defs.h:70