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;
301 
302  BEGIN_KV_SERIALIZE_MAP()
303  KV_SERIALIZE(start_height)
304  KV_SERIALIZE(total_height)
305  KV_SERIALIZE(cumulative_difficulty)
306  if (is_store)
307  KV_SERIALIZE(cumulative_difficulty_top64)
308  else
309  KV_SERIALIZE_OPT(cumulative_difficulty_top64, (uint64_t)0)
310  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(m_block_ids)
311  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(m_block_weights)
312  END_KV_SERIALIZE_MAP()
313  };
314  typedef epee::misc_utils::struct_init<request_t> request;
315  };
316 
317  /************************************************************************/
318  /* */
319  /************************************************************************/
321  {
322  const static int ID = BC_COMMANDS_POOL_BASE + 8;
323 
324  struct request_t
325  {
328 
329  BEGIN_KV_SERIALIZE_MAP()
330  KV_SERIALIZE(b)
331  KV_SERIALIZE(current_blockchain_height)
332  END_KV_SERIALIZE_MAP()
333  };
334  typedef epee::misc_utils::struct_init<request_t> request;
335  };
336 
337  /************************************************************************/
338  /* */
339  /************************************************************************/
341  {
342  const static int ID = BC_COMMANDS_POOL_BASE + 9;
343 
344  struct request_t
345  {
348  std::vector<uint64_t> missing_tx_indices;
349 
350  BEGIN_KV_SERIALIZE_MAP()
351  KV_SERIALIZE_VAL_POD_AS_BLOB(block_hash)
352  KV_SERIALIZE(current_blockchain_height)
353  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(missing_tx_indices)
354  END_KV_SERIALIZE_MAP()
355  };
356  typedef epee::misc_utils::struct_init<request_t> request;
357  };
358 
359  /************************************************************************/
360  /* */
361  /************************************************************************/
363  {
364  const static int ID = BC_COMMANDS_POOL_BASE + 10;
365 
366  struct request_t
367  {
368  std::vector<crypto::hash> hashes;
369 
370  BEGIN_KV_SERIALIZE_MAP()
371  KV_SERIALIZE_CONTAINER_POD_AS_BLOB(hashes)
372  END_KV_SERIALIZE_MAP()
373  };
374  typedef epee::misc_utils::struct_init<request_t> request;
375  };
376 
377 }
std::vector< crypto::hash > blocks
Definition: cryptonote_protocol_defs.h:219
block_complete_entry b
Definition: cryptonote_protocol_defs.h:326
std::string peer_id
Definition: cryptonote_protocol_defs.h:61
Definition: cryptonote_protocol_defs.h:362
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:346
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:314
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:324
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:374
uint64_t recv_count
Definition: cryptonote_protocol_defs.h:63
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:327
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:348
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:368
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:320
uint32_t pruning_seed
Definition: cryptonote_protocol_defs.h:257
Definition: cryptonote_protocol_defs.h:366
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:347
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:356
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:340
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
#define true
Definition: stdbool.h:36
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:334
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:344
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