Monero
hardfork.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2022, 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 #pragma once
30 
31 #include "syncobj.h"
32 #include "hardforks/hardforks.h"
34 
35 namespace cryptonote
36 {
37  class BlockchainDB;
38 
39  class HardFork
40  {
41  public:
42  typedef enum {
46  } State;
47 
48  static const uint64_t DEFAULT_ORIGINAL_VERSION_TILL_HEIGHT = 0; // <= actual height
49  static const time_t DEFAULT_FORKED_TIME = 31557600; // a year in seconds
50  static const time_t DEFAULT_UPDATE_TIME = 31557600 / 2;
51  static const uint64_t DEFAULT_WINDOW_SIZE = 10080; // supermajority window check length - a week
53 
64 
75  bool add_fork(uint8_t version, uint64_t height, uint8_t threshold, time_t time);
76 
86  bool add_fork(uint8_t version, uint64_t height, time_t time);
87 
93  void init();
94 
114  bool check(const cryptonote::block &block) const;
115 
128  bool check_for_height(const cryptonote::block &block, uint64_t height) const;
129 
137  bool add(const cryptonote::block &block, uint64_t height);
138 
152 
161  void on_block_popped(uint64_t new_chain_height);
162 
171  State get_state(time_t t) const;
172  State get_state() const;
173 
179  uint8_t get(uint64_t height) const;
180 
186  uint8_t get_ideal_version() const;
187 
193  uint8_t get_ideal_version(uint64_t height) const;
194 
200  uint8_t get_next_version() const;
201 
209 
214 
227  bool get_voting_info(uint8_t version, uint32_t &window, uint32_t &votes, uint32_t &threshold, uint64_t &earliest_height, uint8_t &voting) const;
228 
233 
237  const std::vector<hardfork_t>& get_hardforks() const { return heights; }
238 
239  private:
240 
241  uint8_t get_block_version(uint64_t height) const;
242  bool do_check(uint8_t block_version, uint8_t voting_version) const;
243  bool do_check_for_height(uint8_t block_version, uint8_t voting_version, uint64_t height) const;
244  int get_voted_fork_index(uint64_t height) const;
245  uint8_t get_effective_version(uint8_t voting_version) const;
246  bool add(uint8_t block_version, uint8_t voting_version, uint64_t height);
247 
248  bool rescan_from_block_height(uint64_t height);
249  bool rescan_from_chain_height(uint64_t height);
250 
251  private:
252 
254 
255  time_t forked_time;
256  time_t update_time;
259 
262 
263  std::vector<hardfork_t> heights;
264 
265  std::deque<uint8_t> versions; /* rolling window of the last N blocks' versions */
266  unsigned int last_versions[256]; /* count of the block versions in the last N blocks */
268 
270  };
271 
272 } // namespace cryptonote
273 
int get_voted_fork_index(uint64_t height) const
Definition: hardfork.cpp:311
uint32_t current_fork_index
Definition: hardfork.h:267
Definition: cryptonote_basic.h:474
bool add(const cryptonote::block &block, uint64_t height)
add a new block
Definition: hardfork.cpp:163
void on_block_popped(uint64_t new_chain_height)
called when one or more blocks are popped from the blockchain
Definition: hardfork.cpp:286
State get_state() const
Definition: hardfork.cpp:342
t
Definition: console.py:33
static const uint64_t DEFAULT_ORIGINAL_VERSION_TILL_HEIGHT
Definition: hardfork.h:48
static const uint64_t DEFAULT_WINDOW_SIZE
Definition: hardfork.h:51
uint64_t get_window_size() const
returns the size of the voting window in blocks
Definition: hardfork.h:232
Definition: hardfork.h:39
uint64_t get_earliest_ideal_height_for_version(uint8_t version) const
returns the earliest block a given version may activate
Definition: hardfork.cpp:383
unsigned char uint8_t
Definition: stdint.h:124
epee::critical_section lock
Definition: hardfork.h:269
uint8_t get_effective_version(uint8_t voting_version) const
Definition: hardfork.cpp:99
void init()
initialize the object
Definition: hardfork.cpp:168
BlockchainDB & db
Definition: hardfork.h:253
bool rescan_from_block_height(uint64_t height)
Definition: hardfork.cpp:248
Holds cryptonote related classes and helpers.
Definition: blockchain_db.cpp:44
bool reorganize_from_chain_height(uint64_t height)
Definition: hardfork.cpp:241
uint8_t get_next_version() const
returns the next version
Definition: hardfork.cpp:396
Definition: syncobj.h:81
bool get_voting_info(uint8_t version, uint32_t &window, uint32_t &votes, uint32_t &threshold, uint64_t &earliest_height, uint8_t &voting) const
returns information about current voting state
Definition: hardfork.cpp:408
Definition: hardfork.h:44
unsigned int uint32_t
Definition: stdint.h:126
time_t forked_time
Definition: hardfork.h:255
bool rescan_from_chain_height(uint64_t height)
Definition: hardfork.cpp:279
unsigned __int64 uint64_t
Definition: stdint.h:136
uint64_t original_version_till_height
Definition: hardfork.h:261
bool check(const cryptonote::block &block) const
check whether a new block would be accepted
Definition: hardfork.cpp:115
bool reorganize_from_block_height(uint64_t height)
called when the blockchain is reorganized
Definition: hardfork.cpp:201
uint8_t get_block_version(uint64_t height) const
Definition: hardfork.cpp:192
version
Supported socks variants.
Definition: socks.h:57
Definition: hardfork.h:43
Definition: hardfork.h:45
bool add_fork(uint8_t version, uint64_t height, uint8_t threshold, time_t time)
add a new hardfork height
Definition: hardfork.cpp:73
bool do_check_for_height(uint8_t block_version, uint8_t voting_version, uint64_t height) const
Definition: hardfork.cpp:121
bool do_check(uint8_t block_version, uint8_t voting_version) const
Definition: hardfork.cpp:109
uint64_t window_size
Definition: hardfork.h:257
time
Definition: gen_wide_data.py:40
The BlockchainDB backing store interface declaration/contract.
Definition: blockchain_db.h:378
static const uint8_t DEFAULT_THRESHOLD_PERCENT
Definition: hardfork.h:52
HardFork(cryptonote::BlockchainDB &db, uint8_t original_version=1, uint64_t original_version_till_height=DEFAULT_ORIGINAL_VERSION_TILL_HEIGHT, time_t forked_time=DEFAULT_FORKED_TIME, time_t update_time=DEFAULT_UPDATE_TIME, uint64_t window_size=DEFAULT_WINDOW_SIZE, uint8_t default_threshold_percent=DEFAULT_THRESHOLD_PERCENT)
creates a new HardFork object
Definition: hardfork.cpp:57
State
Definition: hardfork.h:42
unsigned int last_versions[256]
Definition: hardfork.h:266
static const time_t DEFAULT_UPDATE_TIME
Definition: hardfork.h:50
time_t update_time
Definition: hardfork.h:256
uint8_t get_current_version() const
returns the current version
Definition: hardfork.cpp:360
uint8_t original_version
Definition: hardfork.h:260
std::vector< hardfork_t > heights
Definition: hardfork.h:263
uint8_t get_ideal_version() const
returns the latest "ideal" version
Definition: hardfork.cpp:366
std::deque< uint8_t > versions
Definition: hardfork.h:265
uint8_t default_threshold_percent
Definition: hardfork.h:258
const std::vector< hardfork_t > & get_hardforks() const
returns info for all known hard forks
Definition: hardfork.h:237
bool check_for_height(const cryptonote::block &block, uint64_t height) const
same as check, but for a particular height, rather than the top
Definition: hardfork.cpp:128
static const time_t DEFAULT_FORKED_TIME
Definition: hardfork.h:49