Monero
cryptonote_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 <list>
34 #include "serialization/keyvalue_serialization.h"
37 
38 namespace cryptonote
39 {
40 
41 
42 #define BC_COMMANDS_POOL_BASE 2000
43 
44  /************************************************************************/
45  /* P2P connection info, serializable to json */
46  /************************************************************************/
48  {
49  bool incoming;
50  bool localhost;
51  bool local_ip;
52  bool ssl;
53 
54  std::string address;
55  std::string host;
56  std::string ip;
57  std::string port;
58  uint16_t rpc_port;
60 
61  std::string peer_id;
62 
63  uint64_t recv_count;
64  uint64_t recv_idle_time;
65 
66  uint64_t send_count;
67  uint64_t send_idle_time;
68 
69  std::string state;
70 
71  uint64_t live_time;
72 
73  uint64_t avg_download;
74  uint64_t current_download;
75 
76  uint64_t avg_upload;
77  uint64_t current_upload;
78 
79  uint32_t support_flags;
80 
81  std::string connection_id;
82 
83  uint64_t height;
84 
85  uint32_t pruning_seed;
86 
87  uint8_t address_type;
88 
89  BEGIN_KV_SERIALIZE_MAP()
90  KV_SERIALIZE(incoming)
91  KV_SERIALIZE(localhost)
92  KV_SERIALIZE(local_ip)
93  KV_SERIALIZE(address)
94  KV_SERIALIZE(host)
95  KV_SERIALIZE(ip)
96  KV_SERIALIZE(port)
97  KV_SERIALIZE(rpc_port)
98  KV_SERIALIZE(rpc_credits_per_hash)
99  KV_SERIALIZE(peer_id)
100  KV_SERIALIZE(recv_count)
101  KV_SERIALIZE(recv_idle_time)
102  KV_SERIALIZE(send_count)
103  KV_SERIALIZE(send_idle_time)
104  KV_SERIALIZE(state)
105  KV_SERIALIZE(live_time)
106  KV_SERIALIZE(avg_download)
107  KV_SERIALIZE(current_download)
108  KV_SERIALIZE(avg_upload)
109  KV_SERIALIZE(current_upload)
110  KV_SERIALIZE(support_flags)
111  KV_SERIALIZE(connection_id)
112  KV_SERIALIZE(height)
113  KV_SERIALIZE(pruning_seed)
114  KV_SERIALIZE(address_type)
115  END_KV_SERIALIZE_MAP()
116  };
117 
118  /************************************************************************/
119  /* */
120  /************************************************************************/
122  {
125  BEGIN_KV_SERIALIZE_MAP()
126  KV_SERIALIZE(blob)
127  KV_SERIALIZE_VAL_POD_AS_BLOB(prunable_hash)
128  END_KV_SERIALIZE_MAP()
129 
130  tx_blob_entry(const blobdata &bd = {}, const crypto::hash &h = crypto::null_hash): blob(bd), prunable_hash(h) {}
131  };
133  {
134  bool pruned;
136  uint64_t block_weight;
137  std::vector<tx_blob_entry> txs;
138  BEGIN_KV_SERIALIZE_MAP()
139  KV_SERIALIZE_OPT(pruned, false)
140  KV_SERIALIZE(block)
141  KV_SERIALIZE_OPT(block_weight, (uint64_t)0)
142  if (this_ref.pruned)
143  {
144  KV_SERIALIZE(txs)
145  }
146  else
147  {
148  std::vector<blobdata> txs;
149  if (is_store)
150  {
151  txs.reserve(this_ref.txs.size());
152  for (const auto &e: this_ref.txs) txs.push_back(e.blob);
153  }
154  epee::serialization::selector<is_store>::serialize(txs, stg, hparent_section, "txs");
155  if (!is_store)
156  {
157  block_complete_entry &self = const_cast<block_complete_entry&>(this_ref);
158  self.txs.clear();
159  self.txs.reserve(txs.size());
160  for (auto &e: txs) self.txs.push_back({std::move(e), crypto::null_hash});
161  }
162  }
163  END_KV_SERIALIZE_MAP()
164 
165  block_complete_entry(): pruned(false), block_weight(0) {}
166  };
167 
168 
169  /************************************************************************/
170  /* */
171  /************************************************************************/
173  {
174  const static int ID = BC_COMMANDS_POOL_BASE + 1;
175 
176  struct request_t
177  {
180 
181  BEGIN_KV_SERIALIZE_MAP()
182  KV_SERIALIZE(b)
183  KV_SERIALIZE(current_blockchain_height)
184  END_KV_SERIALIZE_MAP()
185  };
186  typedef epee::misc_utils::struct_init<request_t> request;
187  };
188 
189  /************************************************************************/
190  /* */
191  /************************************************************************/
193  {
194  const static int ID = BC_COMMANDS_POOL_BASE + 2;
195 
196  struct request_t
197  {
198  std::vector<blobdata> txs;
199  std::string _; // padding
200  bool dandelionpp_fluff; //zero initialization defaults to stem mode
201 
202  BEGIN_KV_SERIALIZE_MAP()
203  KV_SERIALIZE(txs)
204  KV_SERIALIZE(_)
205  KV_SERIALIZE_OPT(dandelionpp_fluff, true) // backwards compatible mode is fluff
206  END_KV_SERIALIZE_MAP()
207  };
208  typedef epee::misc_utils::struct_init<request_t> request;
209  };
210  /************************************************************************/
211  /* */
212  /************************************************************************/
214  {
215  const static int ID = BC_COMMANDS_POOL_BASE + 3;
216 
217  struct request_t
218  {
219  std::vector<crypto::hash> blocks;
220  bool prune;
221 
222  BEGIN_KV_SERIALIZE_MAP()
223  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(blocks)
224  KV_SERIALIZE_OPT(prune, false)
225  END_KV_SERIALIZE_MAP()
226  };
227  typedef epee::misc_utils::struct_init<request_t> request;
228  };
229 
231  {
232  const static int ID = BC_COMMANDS_POOL_BASE + 4;
233 
234  struct request_t
235  {
236  std::vector<block_complete_entry> blocks;
237  std::vector<crypto::hash> missed_ids;
239 
240  BEGIN_KV_SERIALIZE_MAP()
241  KV_SERIALIZE(blocks)
242  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(missed_ids)
243  KV_SERIALIZE(current_blockchain_height)
244  END_KV_SERIALIZE_MAP()
245  };
246  typedef epee::misc_utils::struct_init<request_t> request;
247  };
248 
249 
251  {
252  uint64_t current_height;
256  uint8_t top_version;
257  uint32_t pruning_seed;
258 
259  BEGIN_KV_SERIALIZE_MAP()
260  KV_SERIALIZE(current_height)
261  KV_SERIALIZE(cumulative_difficulty)
262  if (is_store)
263  KV_SERIALIZE(cumulative_difficulty_top64)
264  else
265  KV_SERIALIZE_OPT(cumulative_difficulty_top64, (uint64_t)0)
266  KV_SERIALIZE_VAL_POD_AS_BLOB(top_id)
267  KV_SERIALIZE_OPT(top_version, (uint8_t)0)
268  KV_SERIALIZE_OPT(pruning_seed, (uint32_t)0)
269  END_KV_SERIALIZE_MAP()
270  };
271 
273  {
274  const static int ID = BC_COMMANDS_POOL_BASE + 6;
275 
276  struct request_t
277  {
278  std::list<crypto::hash> block_ids; /*IDs of the first 10 blocks are sequential, next goes with pow(2,n) offset, like 2, 4, 8, 16, 32, 64 and so on, and the last one is always genesis block */
279  bool prune;
280 
281  BEGIN_KV_SERIALIZE_MAP()
282  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(block_ids)
283  KV_SERIALIZE_OPT(prune, false)
284  END_KV_SERIALIZE_MAP()
285  };
286  typedef epee::misc_utils::struct_init<request_t> request;
287  };
288 
290  {
291  const static int ID = BC_COMMANDS_POOL_BASE + 7;
292 
293  struct request_t
294  {
295  uint64_t start_height;
296  uint64_t total_height;
299  std::vector<crypto::hash> m_block_ids;
300  std::vector<uint64_t> m_block_weights;
302 
303  BEGIN_KV_SERIALIZE_MAP()
304  KV_SERIALIZE(start_height)
305  KV_SERIALIZE(total_height)
306  KV_SERIALIZE(cumulative_difficulty)
307  if (is_store)
308  KV_SERIALIZE(cumulative_difficulty_top64)
309  else
310  KV_SERIALIZE_OPT(cumulative_difficulty_top64, (uint64_t)0)
311  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(m_block_ids)
312  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(m_block_weights)
313  KV_SERIALIZE(first_block)
314  END_KV_SERIALIZE_MAP()
315  };
316  typedef epee::misc_utils::struct_init<request_t> request;
317  };
318 
319  /************************************************************************/
320  /* */
321  /************************************************************************/
323  {
324  const static int ID = BC_COMMANDS_POOL_BASE + 8;
325 
326  struct request_t
327  {
330 
331  BEGIN_KV_SERIALIZE_MAP()
332  KV_SERIALIZE(b)
333  KV_SERIALIZE(current_blockchain_height)
334  END_KV_SERIALIZE_MAP()
335  };
336  typedef epee::misc_utils::struct_init<request_t> request;
337  };
338 
339  /************************************************************************/
340  /* */
341  /************************************************************************/
343  {
344  const static int ID = BC_COMMANDS_POOL_BASE + 9;
345 
346  struct request_t
347  {
350  std::vector<uint64_t> missing_tx_indices;
351 
352  BEGIN_KV_SERIALIZE_MAP()
353  KV_SERIALIZE_VAL_POD_AS_BLOB(block_hash)
354  KV_SERIALIZE(current_blockchain_height)
355  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(missing_tx_indices)
356  END_KV_SERIALIZE_MAP()
357  };
358  typedef epee::misc_utils::struct_init<request_t> request;
359  };
360 
361  /************************************************************************/
362  /* */
363  /************************************************************************/
365  {
366  const static int ID = BC_COMMANDS_POOL_BASE + 10;
367 
368  struct request_t
369  {
370  std::vector<crypto::hash> hashes;
371 
372  BEGIN_KV_SERIALIZE_MAP()
373  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(hashes)
374  END_KV_SERIALIZE_MAP()
375  };
376  typedef epee::misc_utils::struct_init<request_t> request;
377  };
378 
379 }
std::vector< crypto::hash > blocks
Definition: cryptonote_protocol_defs.h:219
block_complete_entry b
Definition: cryptonote_protocol_defs.h:328
std::string peer_id
Definition: cryptonote_protocol_defs.h:61
Definition: cryptonote_protocol_defs.h:364
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:179
uint64_t avg_download
Definition: cryptonote_protocol_defs.h:73
#define BC_COMMANDS_POOL_BASE
Definition: cryptonote_protocol_defs.h:42
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:208
uint8_t address_type
Definition: cryptonote_protocol_defs.h:87
uint64_t send_idle_time
Definition: cryptonote_protocol_defs.h:67
uint64_t avg_upload
Definition: cryptonote_protocol_defs.h:76
uint64_t current_upload
Definition: cryptonote_protocol_defs.h:77
Definition: cryptonote_protocol_defs.h:132
Definition: cryptonote_protocol_defs.h:276
bool dandelionpp_fluff
Definition: cryptonote_protocol_defs.h:200
Definition: cryptonote_basic.h:463
void serialize(Archive &a, std::unordered_map< h_key, hval > &x, const boost::serialization::version_type ver)
Definition: unordered_containers_boost_serialization.h:126
crypto::hash block_hash
Definition: cryptonote_protocol_defs.h:348
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:316
uint64_t total_height
Definition: cryptonote_protocol_defs.h:296
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:286
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:227
Definition: cryptonote_protocol_defs.h:326
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:376
uint64_t recv_count
Definition: cryptonote_protocol_defs.h:63
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:329
Definition: cryptonote_protocol_defs.h:47
Definition: blocks.cpp:12
std::vector< uint64_t > m_block_weights
Definition: cryptonote_protocol_defs.h:300
const
Definition: build_protob.py:9
std::string _
Definition: cryptonote_protocol_defs.h:199
std::vector< uint64_t > missing_tx_indices
Definition: cryptonote_protocol_defs.h:350
Definition: cryptonote_protocol_defs.h:289
uint64_t cumulative_difficulty
Definition: cryptonote_protocol_defs.h:253
std::vector< crypto::hash > hashes
Definition: cryptonote_protocol_defs.h:370
Definition: cryptonote_protocol_defs.h:176
Definition: cryptonote_protocol_defs.h:192
std::string state
Definition: cryptonote_protocol_defs.h:69
uint64_t current_download
Definition: cryptonote_protocol_defs.h:74
Holds cryptonote related classes and helpers.
Definition: blockchain_db.cpp:44
bool prune
Definition: cryptonote_protocol_defs.h:220
uint64_t recv_idle_time
Definition: cryptonote_protocol_defs.h:64
uint64_t start_height
Definition: cryptonote_protocol_defs.h:295
std::vector< tx_blob_entry > txs
Definition: cryptonote_protocol_defs.h:137
uint64_t live_time
Definition: cryptonote_protocol_defs.h:71
bool pruned
Definition: cryptonote_protocol_defs.h:134
uint32_t support_flags
Definition: cryptonote_protocol_defs.h:79
std::string ip
Definition: cryptonote_protocol_defs.h:56
bool localhost
Definition: cryptonote_protocol_defs.h:50
Definition: cryptonote_protocol_defs.h:230
std::list< crypto::hash > block_ids
Definition: cryptonote_protocol_defs.h:278
std::string port
Definition: cryptonote_protocol_defs.h:57
Definition: cryptonote_protocol_defs.h:322
uint32_t pruning_seed
Definition: cryptonote_protocol_defs.h:257
Definition: cryptonote_protocol_defs.h:368
bool prune
Definition: cryptonote_protocol_defs.h:279
bool ssl
Definition: cryptonote_protocol_defs.h:52
crypto::hash prunable_hash
Definition: cryptonote_protocol_defs.h:124
Definition: cryptonote_protocol_defs.h:234
Definition: cryptonote_protocol_defs.h:196
int b
Definition: base.py:1
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:349
Definition: cryptonote_protocol_defs.h:172
std::string host
Definition: cryptonote_protocol_defs.h:55
static constexpr crypto::hash null_hash
Definition: hash.h:92
blobdata block
Definition: cryptonote_protocol_defs.h:135
#define false
Definition: stdbool.h:37
std::vector< crypto::hash > m_block_ids
Definition: cryptonote_protocol_defs.h:299
Definition: cryptonote_protocol_defs.h:121
uint64_t height
Definition: cryptonote_protocol_defs.h:83
std::vector< blobdata > txs
Definition: cryptonote_protocol_defs.h:198
std::vector< crypto::hash > missed_ids
Definition: cryptonote_protocol_defs.h:237
Definition: cryptonote_protocol_defs.h:272
bool local_ip
Definition: cryptonote_protocol_defs.h:51
Definition: cryptonote_protocol_defs.h:250
std::string blobdata
Definition: blobdatatype.h:39
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:358
uint64_t cumulative_difficulty_top64
Definition: cryptonote_protocol_defs.h:298
uint64_t block_weight
Definition: cryptonote_protocol_defs.h:136
uint32_t rpc_credits_per_hash
Definition: cryptonote_protocol_defs.h:59
Definition: cryptonote_format_utils.h:43
uint64_t cumulative_difficulty_top64
Definition: cryptonote_protocol_defs.h:254
Definition: blake256.h:36
bool incoming
Definition: cryptonote_protocol_defs.h:49
uint64_t send_count
Definition: cryptonote_protocol_defs.h:66
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:186
std::string connection_id
Definition: cryptonote_protocol_defs.h:81
static void prune(MDB_env *env0, MDB_env *env1)
Definition: blockchain_prune.cpp:246
block_complete_entry b
Definition: cryptonote_protocol_defs.h:178
Definition: cryptonote_protocol_defs.h:293
std::vector< block_complete_entry > blocks
Definition: cryptonote_protocol_defs.h:236
POD_CLASS hash
Definition: hash.h:48
Definition: cryptonote_protocol_defs.h:213
blobdata blob
Definition: cryptonote_protocol_defs.h:123
uint16_t rpc_port
Definition: cryptonote_protocol_defs.h:58
Definition: cryptonote_protocol_defs.h:342
crypto::hash top_id
Definition: cryptonote_protocol_defs.h:255
uint64_t cumulative_difficulty
Definition: cryptonote_protocol_defs.h:297
uint64_t current_height
Definition: cryptonote_protocol_defs.h:252
cryptonote::blobdata first_block
Definition: cryptonote_protocol_defs.h:301
#define true
Definition: stdbool.h:36
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:336
std::string address
Definition: cryptonote_protocol_defs.h:54
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:238
Definition: cryptonote_protocol_defs.h:346
uint32_t pruning_seed
Definition: cryptonote_protocol_defs.h:85
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:246
uint8_t top_version
Definition: cryptonote_protocol_defs.h:256
Definition: cryptonote_protocol_defs.h:217