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 }
#define s(x, c)
Definition: aesb.c:47
std::string hex(difficulty_type v)
Definition: difficulty.cpp:242
Definition: cryptonote_format_utils.h:44
Definition: levin_notify.h:52
boost::uuids::uuid uuid
Definition: net_node_common.h:46
static std::string peerid_to_string(peerid_type peer_id)
Definition: p2p_protocol_defs.h:50
uint64_t peerid_type
Definition: p2p_protocol_defs.h:48
std::string print_peerlist_to_string(const std::vector< peerlist_entry > &pl)
Definition: p2p_protocol_defs.h:145
#define P2P_COMMANDS_POOL_BASE
Definition: p2p_protocol_defs.h:202
Simple DSL AAPI based on.
#define BEGIN_SERIALIZE()
Begins the environment of the DSL \detailed for describing how to serialize an of an archive type.
Definition: serialization.h:182
#define FIELD(f)
tags the field with the variable name and then serializes it
Definition: serialization.h:244
#define END_SERIALIZE()
self-explanatory
Definition: serialization.h:215
#define VARINT_FIELD(f)
tags and serializes the varint f
Definition: serialization.h:264
Definition: p2p_protocol_defs.h:213
t_playload_type payload_data
Definition: p2p_protocol_defs.h:215
basic_node_data node_data
Definition: p2p_protocol_defs.h:214
Definition: p2p_protocol_defs.h:225
basic_node_data node_data
Definition: p2p_protocol_defs.h:226
t_playload_type payload_data
Definition: p2p_protocol_defs.h:227
std::vector< peerlist_entry > local_peerlist_new
Definition: p2p_protocol_defs.h:228
Definition: p2p_protocol_defs.h:209
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:222
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:236
Definition: p2p_protocol_defs.h:286
Definition: p2p_protocol_defs.h:295
std::string status
Definition: p2p_protocol_defs.h:296
peerid_type peer_id
Definition: p2p_protocol_defs.h:297
Definition: p2p_protocol_defs.h:275
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:292
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:304
Definition: p2p_protocol_defs.h:316
Definition: p2p_protocol_defs.h:323
uint32_t support_flags
Definition: p2p_protocol_defs.h:324
Definition: p2p_protocol_defs.h:312
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:330
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:320
Definition: p2p_protocol_defs.h:249
t_playload_type payload_data
Definition: p2p_protocol_defs.h:250
Definition: p2p_protocol_defs.h:258
t_playload_type payload_data
Definition: p2p_protocol_defs.h:259
std::vector< peerlist_entry > local_peerlist_new
Definition: p2p_protocol_defs.h:260
Definition: p2p_protocol_defs.h:245
epee::misc_utils::struct_init< response_t > response
Definition: p2p_protocol_defs.h:267
epee::misc_utils::struct_init< request_t > request
Definition: p2p_protocol_defs.h:255
Definition: p2p_protocol_defs.h:102
int64_t first_seen
Definition: p2p_protocol_defs.h:105
AddressType adr
Definition: p2p_protocol_defs.h:103
peerid_type id
Definition: p2p_protocol_defs.h:104
Definition: p2p_protocol_defs.h:185
uint32_t my_port
Definition: p2p_protocol_defs.h:187
peerid_type peer_id
Definition: p2p_protocol_defs.h:190
uint16_t rpc_port
Definition: p2p_protocol_defs.h:188
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:189
uuid network_id
Definition: p2p_protocol_defs.h:186
Definition: p2p_protocol_defs.h:123
bool is_income
Definition: p2p_protocol_defs.h:126
AddressType adr
Definition: p2p_protocol_defs.h:124
peerid_type id
Definition: p2p_protocol_defs.h:125
Definition: p2p_protocol_defs.h:60
uint32_t port
Definition: p2p_protocol_defs.h:62
uint32_t ip
Definition: p2p_protocol_defs.h:61
Definition: p2p_protocol_defs.h:165
Definition: p2p_protocol_defs.h:72
uint32_t pruning_seed
Definition: p2p_protocol_defs.h:76
AddressType adr
Definition: p2p_protocol_defs.h:73
uint16_t rpc_port
Definition: p2p_protocol_defs.h:77
peerid_type id
Definition: p2p_protocol_defs.h:74
int64_t last_seen
Definition: p2p_protocol_defs.h:75
uint32_t rpc_credits_per_hash
Definition: p2p_protocol_defs.h:78