Monero
p2p_protocol_defs.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2020, The Monero Project
2 //
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification, are
6 // permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice, this list of
9 // conditions and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 // of conditions and the following disclaimer in the documentation and/or other
13 // materials provided with the distribution.
14 //
15 // 3. Neither the name of the copyright holder nor the names of its contributors may be
16 // used to endorse or promote products derived from this software without specific
17 // prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30 
31 #pragma once
32 
33 #include <boost/uuid/uuid.hpp>
34 #include <boost/serialization/version.hpp>
35 #include "serialization/keyvalue_serialization.h"
36 #include "net/net_utils_base.h"
37 #include "net/tor_address.h" // needed for serialization
38 #include "net/i2p_address.h" // needed for serialization
39 #include "misc_language.h"
40 #include "string_tools.h"
41 #include "time_helper.h"
43 #include "cryptonote_config.h"
44 
45 namespace nodetool
46 {
47  typedef boost::uuids::uuid uuid;
48  typedef uint64_t peerid_type;
49 
50  static inline std::string peerid_to_string(peerid_type peer_id)
51  {
52  std::ostringstream s;
53  s << std::hex << peer_id;
54  return epee::string_tools::pad_string(s.str(), 16, '0', true);
55  }
56 
57 #pragma pack (push, 1)
58 
60  {
61  uint32_t ip;
62  uint32_t port;
63 
64  BEGIN_KV_SERIALIZE_MAP()
65  KV_SERIALIZE(ip)
66  KV_SERIALIZE(port)
67  END_KV_SERIALIZE_MAP()
68  };
69 
70  template<typename AddressType>
72  {
73  AddressType adr;
75  int64_t last_seen;
76  uint32_t pruning_seed;
77  uint16_t rpc_port;
79 
80  BEGIN_KV_SERIALIZE_MAP()
81  KV_SERIALIZE(adr)
82  KV_SERIALIZE(id)
83  KV_SERIALIZE_OPT(last_seen, (int64_t)0)
84  KV_SERIALIZE_OPT(pruning_seed, (uint32_t)0)
85  KV_SERIALIZE_OPT(rpc_port, (uint16_t)0)
86  KV_SERIALIZE_OPT(rpc_credits_per_hash, (uint32_t)0)
87  END_KV_SERIALIZE_MAP()
88 
90  FIELD(adr)
91  FIELD(id)
92  VARINT_FIELD(last_seen)
93  VARINT_FIELD(pruning_seed)
94  VARINT_FIELD(rpc_port)
95  VARINT_FIELD(rpc_credits_per_hash)
97  };
98  typedef peerlist_entry_base<epee::net_utils::network_address> peerlist_entry;
99 
100  template<typename AddressType>
102  {
103  AddressType adr;
105  int64_t first_seen;
106 
107  BEGIN_KV_SERIALIZE_MAP()
108  KV_SERIALIZE(adr)
109  KV_SERIALIZE(id)
110  KV_SERIALIZE(first_seen)
111  END_KV_SERIALIZE_MAP()
112 
114  FIELD(adr)
115  FIELD(id)
116  VARINT_FIELD(first_seen)
117  END_SERIALIZE()
118  };
119  typedef anchor_peerlist_entry_base<epee::net_utils::network_address> anchor_peerlist_entry;
120 
121  template<typename AddressType>
123  {
124  AddressType adr;
126  bool is_income;
127 
128  BEGIN_KV_SERIALIZE_MAP()
129  KV_SERIALIZE(adr)
130  KV_SERIALIZE(id)
131  KV_SERIALIZE(is_income)
132  END_KV_SERIALIZE_MAP()
133 
135  FIELD(adr)
136  FIELD(id)
137  FIELD(is_income)
138  END_SERIALIZE()
139  };
140  typedef connection_entry_base<epee::net_utils::network_address> connection_entry;
141 
142 #pragma pack(pop)
143 
144  inline
145  std::string print_peerlist_to_string(const std::vector<peerlist_entry>& pl)
146  {
147  time_t now_time = 0;
148  time(&now_time);
149  std::stringstream ss;
150  ss << std::setfill ('0') << std::setw (8) << std::hex << std::noshowbase;
151  for(const peerlist_entry& pe: pl)
152  {
153  ss << peerid_to_string(pe.id) << "\t" << pe.adr.str()
154  << " \trpc port " << (pe.rpc_port > 0 ? std::to_string(pe.rpc_port) : "-")
155  << " \trpc credits per hash " << (pe.rpc_credits_per_hash > 0 ? std::to_string(pe.rpc_credits_per_hash) : "-")
156  << " \tpruning seed " << pe.pruning_seed
157  << " \tlast_seen: " << (pe.last_seen == 0 ? std::string("never") : epee::misc_utils::get_time_interval_string(now_time - pe.last_seen))
158  << std::endl;
159  }
160  return ss.str();
161  }
162 
163 
165  {
166  BEGIN_KV_SERIALIZE_MAP()
167  KV_SERIALIZE(max_out_connection_count)
168  KV_SERIALIZE(max_in_connection_count)
169  KV_SERIALIZE(handshake_interval)
170  KV_SERIALIZE(packet_max_size)
171  KV_SERIALIZE(config_id)
172  END_KV_SERIALIZE_MAP()
173 
174  uint32_t max_out_connection_count;
175  uint32_t max_in_connection_count;
176  uint32_t connection_timeout;
177  uint32_t ping_connection_timeout;
178  uint32_t handshake_interval;
179  uint32_t packet_max_size;
180  uint32_t config_id;
181  uint32_t send_peerlist_sz;
182  };
183 
185  {
187  uint32_t my_port;
188  uint16_t rpc_port;
191 
192  BEGIN_KV_SERIALIZE_MAP()
193  KV_SERIALIZE_VAL_POD_AS_BLOB(network_id)
194  KV_SERIALIZE(peer_id)
195  KV_SERIALIZE(my_port)
196  KV_SERIALIZE_OPT(rpc_port, (uint16_t)(0))
197  KV_SERIALIZE_OPT(rpc_credits_per_hash, (uint32_t)0)
198  END_KV_SERIALIZE_MAP()
199  };
200 
201 
202 #define P2P_COMMANDS_POOL_BASE 1000
203 
204  /************************************************************************/
205  /* */
206  /************************************************************************/
207  template<class t_playload_type>
209  {
210  const static int ID = P2P_COMMANDS_POOL_BASE + 1;
211 
212  struct request_t
213  {
215  t_playload_type payload_data;
216 
217  BEGIN_KV_SERIALIZE_MAP()
218  KV_SERIALIZE(node_data)
219  KV_SERIALIZE(payload_data)
220  END_KV_SERIALIZE_MAP()
221  };
222  typedef epee::misc_utils::struct_init<request_t> request;
223 
224  struct response_t
225  {
227  t_playload_type payload_data;
228  std::vector<peerlist_entry> local_peerlist_new;
229 
230  BEGIN_KV_SERIALIZE_MAP()
231  KV_SERIALIZE(node_data)
232  KV_SERIALIZE(payload_data)
233  KV_SERIALIZE(local_peerlist_new)
234  END_KV_SERIALIZE_MAP()
235  };
236  typedef epee::misc_utils::struct_init<response_t> response;
237  };
238 
239 
240  /************************************************************************/
241  /* */
242  /************************************************************************/
243  template<class t_playload_type>
245  {
246  const static int ID = P2P_COMMANDS_POOL_BASE + 2;
247 
248  struct request_t
249  {
250  t_playload_type payload_data;
251  BEGIN_KV_SERIALIZE_MAP()
252  KV_SERIALIZE(payload_data)
253  END_KV_SERIALIZE_MAP()
254  };
255  typedef epee::misc_utils::struct_init<request_t> request;
256 
257  struct response_t
258  {
259  t_playload_type payload_data;
260  std::vector<peerlist_entry> local_peerlist_new;
261 
262  BEGIN_KV_SERIALIZE_MAP()
263  KV_SERIALIZE(payload_data)
264  KV_SERIALIZE(local_peerlist_new)
265  END_KV_SERIALIZE_MAP()
266  };
267  typedef epee::misc_utils::struct_init<response_t> response;
268  };
269 
270  /************************************************************************/
271  /* */
272  /************************************************************************/
273 
275  {
276  /*
277  Used to make "callback" connection, to be sure that opponent node
278  have accessible connection point. Only other nodes can add peer to peerlist,
279  and ONLY in case when peer has accepted connection and answered to ping.
280  */
281  const static int ID = P2P_COMMANDS_POOL_BASE + 3;
282 
283 #define PING_OK_RESPONSE_STATUS_TEXT "OK"
284 
285  struct request_t
286  {
287  /*actually we don't need to send any real data*/
288 
289  BEGIN_KV_SERIALIZE_MAP()
290  END_KV_SERIALIZE_MAP()
291  };
292  typedef epee::misc_utils::struct_init<request_t> request;
293 
294  struct response_t
295  {
296  std::string status;
298 
299  BEGIN_KV_SERIALIZE_MAP()
300  KV_SERIALIZE(status)
301  KV_SERIALIZE(peer_id)
302  END_KV_SERIALIZE_MAP()
303  };
304  typedef epee::misc_utils::struct_init<response_t> response;
305  };
306 
307 
308  /************************************************************************/
309  /* */
310  /************************************************************************/
312  {
313  const static int ID = P2P_COMMANDS_POOL_BASE + 7;
314 
315  struct request_t
316  {
317  BEGIN_KV_SERIALIZE_MAP()
318  END_KV_SERIALIZE_MAP()
319  };
320  typedef epee::misc_utils::struct_init<request_t> request;
321 
322  struct response_t
323  {
324  uint32_t support_flags;
325 
326  BEGIN_KV_SERIALIZE_MAP()
327  KV_SERIALIZE(support_flags)
328  END_KV_SERIALIZE_MAP()
329  };
330  typedef epee::misc_utils::struct_init<response_t> response;
331  };
332 }
nodetool::anchor_peerlist_entry_base
Definition: p2p_protocol_defs.h:102
nodetool::COMMAND_HANDSHAKE_T::response_t::node_data
basic_node_data node_data
Definition: p2p_protocol_defs.h:226
nodetool::COMMAND_HANDSHAKE_T::request
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:222
nodetool::anchor_peerlist_entry_base::first_seen
int64_t first_seen
Definition: p2p_protocol_defs.h:105
nodetool::COMMAND_TIMED_SYNC_T::response_t::local_peerlist_new
std::vector< peerlist_entry > local_peerlist_new
Definition: p2p_protocol_defs.h:260
nodetool::basic_node_data::rpc_credits_per_hash
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:189
nodetool::anchor_peerlist_entry_base::id
peerid_type id
Definition: p2p_protocol_defs.h:104
nodetool::COMMAND_TIMED_SYNC_T::response_t
Definition: p2p_protocol_defs.h:258
nodetool::peerlist_entry_base::adr
AddressType adr
Definition: p2p_protocol_defs.h:73
nodetool::peerid_to_string
static std::string peerid_to_string(peerid_type peer_id)
Definition: p2p_protocol_defs.h:50
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS::response_t::support_flags
uint32_t support_flags
Definition: p2p_protocol_defs.h:324
nodetool::COMMAND_HANDSHAKE_T::response
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:236
nodetool::print_peerlist_to_string
std::string print_peerlist_to_string(const std::vector< peerlist_entry > &pl)
Definition: p2p_protocol_defs.h:145
nodetool::COMMAND_HANDSHAKE_T::response_t
Definition: p2p_protocol_defs.h:225
nodetool::COMMAND_TIMED_SYNC_T::request
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:255
nodetool::COMMAND_TIMED_SYNC_T::response
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:267
nodetool::network_address_old::port
uint32_t port
Definition: p2p_protocol_defs.h:62
nodetool::network_config
Definition: p2p_protocol_defs.h:165
END_SERIALIZE
#define END_SERIALIZE()
self-explanatory
Definition: serialization.h:215
P2P_COMMANDS_POOL_BASE
#define P2P_COMMANDS_POOL_BASE
Definition: p2p_protocol_defs.h:202
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS::request
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:320
cryptonote_config.h
s
#define s(x, c)
Definition: aesb.c:47
nodetool::peerlist_entry_base::pruning_seed
uint32_t pruning_seed
Definition: p2p_protocol_defs.h:76
nodetool::COMMAND_HANDSHAKE_T::response_t::payload_data
t_playload_type payload_data
Definition: p2p_protocol_defs.h:227
nodetool::COMMAND_PING
Definition: p2p_protocol_defs.h:275
nodetool::COMMAND_HANDSHAKE_T::response_t::local_peerlist_new
std::vector< peerlist_entry > local_peerlist_new
Definition: p2p_protocol_defs.h:228
nodetool::COMMAND_TIMED_SYNC_T::request_t
Definition: p2p_protocol_defs.h:249
nodetool::network_address_old::ip
uint32_t ip
Definition: p2p_protocol_defs.h:61
nodetool::COMMAND_TIMED_SYNC_T::response_t::payload_data
t_playload_type payload_data
Definition: p2p_protocol_defs.h:259
cryptonote::hex
std::string hex(difficulty_type v)
Definition: difficulty.cpp:242
nodetool::uuid
boost::uuids::uuid uuid
Definition: net_node_common.h:46
nodetool::COMMAND_TIMED_SYNC_T::request_t::payload_data
t_playload_type payload_data
Definition: p2p_protocol_defs.h:250
nodetool::peerlist_entry_base::id
peerid_type id
Definition: p2p_protocol_defs.h:74
nodetool::basic_node_data::network_id
uuid network_id
Definition: p2p_protocol_defs.h:186
VARINT_FIELD
#define VARINT_FIELD(f)
tags and serializes the varint f
Definition: serialization.h:264
nodetool::COMMAND_PING::request_t
Definition: p2p_protocol_defs.h:286
nodetool::COMMAND_PING::response_t::peer_id
peerid_type peer_id
Definition: p2p_protocol_defs.h:297
nodetool::COMMAND_PING::response_t
Definition: p2p_protocol_defs.h:295
nodetool::network_address_old
Definition: p2p_protocol_defs.h:60
nodetool::connection_entry_base
Definition: p2p_protocol_defs.h:123
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS::response
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:330
nodetool::COMMAND_TIMED_SYNC_T
Definition: p2p_protocol_defs.h:245
nodetool::peerid_type
uint64_t peerid_type
Definition: p2p_protocol_defs.h:48
nodetool::COMMAND_PING::response
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:304
nodetool::basic_node_data::my_port
uint32_t my_port
Definition: p2p_protocol_defs.h:187
nodetool::COMMAND_HANDSHAKE_T::request_t::payload_data
t_playload_type payload_data
Definition: p2p_protocol_defs.h:215
nodetool::COMMAND_PING::request
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:292
nodetool::peerlist_entry_base::last_seen
int64_t last_seen
Definition: p2p_protocol_defs.h:75
nodetool::COMMAND_HANDSHAKE_T::request_t
Definition: p2p_protocol_defs.h:213
nodetool::peerlist_entry_base::rpc_port
uint16_t rpc_port
Definition: p2p_protocol_defs.h:77
tor_address.h
nodetool::basic_node_data
Definition: p2p_protocol_defs.h:185
nodetool::connection_entry_base::id
peerid_type id
Definition: p2p_protocol_defs.h:125
nodetool::COMMAND_HANDSHAKE_T
Definition: p2p_protocol_defs.h:209
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS
Definition: p2p_protocol_defs.h:312
serialization.h
Simple DSL AAPI based on.
nodetool::connection_entry_base::is_income
bool is_income
Definition: p2p_protocol_defs.h:126
nodetool::connection_entry_base::adr
AddressType adr
Definition: p2p_protocol_defs.h:124
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS::response_t
Definition: p2p_protocol_defs.h:323
nodetool::peerlist_entry_base
Definition: p2p_protocol_defs.h:72
FIELD
#define FIELD(f)
tags the field with the variable name and then serializes it
Definition: serialization.h:244
BEGIN_SERIALIZE
#define BEGIN_SERIALIZE()
Begins the environment of the DSL \detailed for describing how to serialize an of an archive type.
Definition: serialization.h:182
nodetool::anchor_peerlist_entry_base::adr
AddressType adr
Definition: p2p_protocol_defs.h:103
nodetool::basic_node_data::rpc_port
uint16_t rpc_port
Definition: p2p_protocol_defs.h:188
i2p_address.h
nodetool::peerlist_entry_base::rpc_credits_per_hash
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:78
nodetool
Definition: levin_notify.h:52
nodetool::COMMAND_PING::response_t::status
std::string status
Definition: p2p_protocol_defs.h:296
epee
Definition: cryptonote_format_utils.h:44
nodetool::COMMAND_REQUEST_SUPPORT_FLAGS::request_t
Definition: p2p_protocol_defs.h:316
nodetool::basic_node_data::peer_id
peerid_type peer_id
Definition: p2p_protocol_defs.h:190
nodetool::COMMAND_HANDSHAKE_T::request_t::node_data
basic_node_data node_data
Definition: p2p_protocol_defs.h:214