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 }
static void prune(MDB_env *env0, MDB_env *env1)
Definition: blockchain_prune.cpp:246
#define BC_COMMANDS_POOL_BASE
Definition: cryptonote_protocol_defs.h:42
int b
Definition: base.py:1
Definition: blocks.cpp:13
void serialize(Archive &a, std::unordered_map< h_key, hval > &x, const boost::serialization::version_type ver)
Definition: unordered_containers_boost_serialization.h:126
const
Definition: build_protob.py:9
constexpr static crypto::hash null_hash
Definition: hash.h:92
POD_CLASS hash
Definition: hash.h:48
Holds cryptonote related classes and helpers.
Definition: blockchain_db.cpp:45
std::string blobdata
Definition: blobdatatype.h:39
Definition: cryptonote_format_utils.h:44
#define true
Definition: stdbool.h:36
#define false
Definition: stdbool.h:37
Definition: cryptonote_protocol_defs.h:251
uint64_t cumulative_difficulty_top64
Definition: cryptonote_protocol_defs.h:254
uint32_t pruning_seed
Definition: cryptonote_protocol_defs.h:257
uint64_t cumulative_difficulty
Definition: cryptonote_protocol_defs.h:253
uint8_t top_version
Definition: cryptonote_protocol_defs.h:256
uint64_t current_height
Definition: cryptonote_protocol_defs.h:252
crypto::hash top_id
Definition: cryptonote_protocol_defs.h:255
Definition: cryptonote_protocol_defs.h:369
std::vector< crypto::hash > hashes
Definition: cryptonote_protocol_defs.h:370
Definition: cryptonote_protocol_defs.h:365
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:376
Definition: cryptonote_protocol_defs.h:177
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:179
block_complete_entry b
Definition: cryptonote_protocol_defs.h:178
Definition: cryptonote_protocol_defs.h:173
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:186
Definition: cryptonote_protocol_defs.h:327
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:329
block_complete_entry b
Definition: cryptonote_protocol_defs.h:328
Definition: cryptonote_protocol_defs.h:323
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:336
Definition: cryptonote_protocol_defs.h:197
std::string _
Definition: cryptonote_protocol_defs.h:199
bool dandelionpp_fluff
Definition: cryptonote_protocol_defs.h:200
std::vector< blobdata > txs
Definition: cryptonote_protocol_defs.h:198
Definition: cryptonote_protocol_defs.h:193
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:208
Definition: cryptonote_protocol_defs.h:277
std::list< crypto::hash > block_ids
Definition: cryptonote_protocol_defs.h:278
bool prune
Definition: cryptonote_protocol_defs.h:279
Definition: cryptonote_protocol_defs.h:273
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:286
Definition: cryptonote_protocol_defs.h:347
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:349
std::vector< uint64_t > missing_tx_indices
Definition: cryptonote_protocol_defs.h:350
crypto::hash block_hash
Definition: cryptonote_protocol_defs.h:348
Definition: cryptonote_protocol_defs.h:343
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:358
Definition: cryptonote_protocol_defs.h:218
bool prune
Definition: cryptonote_protocol_defs.h:220
std::vector< crypto::hash > blocks
Definition: cryptonote_protocol_defs.h:219
Definition: cryptonote_protocol_defs.h:214
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:227
Definition: cryptonote_protocol_defs.h:294
std::vector< uint64_t > m_block_weights
Definition: cryptonote_protocol_defs.h:300
uint64_t total_height
Definition: cryptonote_protocol_defs.h:296
uint64_t cumulative_difficulty_top64
Definition: cryptonote_protocol_defs.h:298
cryptonote::blobdata first_block
Definition: cryptonote_protocol_defs.h:301
uint64_t cumulative_difficulty
Definition: cryptonote_protocol_defs.h:297
std::vector< crypto::hash > m_block_ids
Definition: cryptonote_protocol_defs.h:299
uint64_t start_height
Definition: cryptonote_protocol_defs.h:295
Definition: cryptonote_protocol_defs.h:290
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:316
Definition: cryptonote_protocol_defs.h:235
std::vector< block_complete_entry > blocks
Definition: cryptonote_protocol_defs.h:236
std::vector< crypto::hash > missed_ids
Definition: cryptonote_protocol_defs.h:237
uint64_t current_blockchain_height
Definition: cryptonote_protocol_defs.h:238
Definition: cryptonote_protocol_defs.h:231
epee::misc_utils::struct_init< request_t > request
Definition: cryptonote_protocol_defs.h:246
Definition: cryptonote_protocol_defs.h:133
uint64_t block_weight
Definition: cryptonote_protocol_defs.h:136
std::vector< tx_blob_entry > txs
Definition: cryptonote_protocol_defs.h:137
bool pruned
Definition: cryptonote_protocol_defs.h:134
blobdata block
Definition: cryptonote_protocol_defs.h:135
Definition: cryptonote_basic.h:464
Definition: cryptonote_protocol_defs.h:48
std::string connection_id
Definition: cryptonote_protocol_defs.h:81
uint32_t pruning_seed
Definition: cryptonote_protocol_defs.h:85
std::string address
Definition: cryptonote_protocol_defs.h:54
uint8_t address_type
Definition: cryptonote_protocol_defs.h:87
uint64_t recv_count
Definition: cryptonote_protocol_defs.h:63
uint64_t live_time
Definition: cryptonote_protocol_defs.h:71
uint32_t support_flags
Definition: cryptonote_protocol_defs.h:79
uint32_t rpc_credits_per_hash
Definition: cryptonote_protocol_defs.h:59
bool localhost
Definition: cryptonote_protocol_defs.h:50
std::string port
Definition: cryptonote_protocol_defs.h:57
uint64_t height
Definition: cryptonote_protocol_defs.h:83
uint64_t send_idle_time
Definition: cryptonote_protocol_defs.h:67
std::string host
Definition: cryptonote_protocol_defs.h:55
std::string ip
Definition: cryptonote_protocol_defs.h:56
uint64_t current_download
Definition: cryptonote_protocol_defs.h:74
uint64_t avg_download
Definition: cryptonote_protocol_defs.h:73
uint64_t recv_idle_time
Definition: cryptonote_protocol_defs.h:64
uint16_t rpc_port
Definition: cryptonote_protocol_defs.h:58
uint64_t send_count
Definition: cryptonote_protocol_defs.h:66
std::string state
Definition: cryptonote_protocol_defs.h:69
bool local_ip
Definition: cryptonote_protocol_defs.h:51
bool ssl
Definition: cryptonote_protocol_defs.h:52
bool incoming
Definition: cryptonote_protocol_defs.h:49
std::string peer_id
Definition: cryptonote_protocol_defs.h:61
uint64_t current_upload
Definition: cryptonote_protocol_defs.h:77
uint64_t avg_upload
Definition: cryptonote_protocol_defs.h:76
Definition: cryptonote_protocol_defs.h:122
crypto::hash prunable_hash
Definition: cryptonote_protocol_defs.h:124
blobdata blob
Definition: cryptonote_protocol_defs.h:123
Definition: blake256.h:36