Electroneum
hardfork.h
Go to the documentation of this file.
1 // Copyrights(c) 2017-2020, The Electroneum Project
2 // Copyrights(c) 2014-2019, The Monero Project
3 //
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without modification, are
7 // permitted provided that the following conditions are met:
8 //
9 // 1. Redistributions of source code must retain the above copyright notice, this list of
10 // conditions and the following disclaimer.
11 //
12 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
13 // of conditions and the following disclaimer in the documentation and/or other
14 // materials provided with the distribution.
15 //
16 // 3. Neither the name of the copyright holder nor the names of its contributors may be
17 // used to endorse or promote products derived from this software without specific
18 // prior written permission.
19 //
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 #pragma once
31 
32 #include "syncobj.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
52  static const uint8_t DEFAULT_THRESHOLD_PERCENT = 80;
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 
150  bool reorganize_from_block_height(uint64_t height);
151  bool reorganize_from_chain_height(uint64_t height);
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 
208  uint8_t get_current_version() const;
209 
213  uint64_t get_earliest_ideal_height_for_version(uint8_t version) const;
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 
232  uint64_t get_window_size() const { return window_size; }
233 
234  struct Params {
235  uint8_t version;
236  uint8_t threshold;
237  uint64_t height;
238  time_t time;
239  Params(uint8_t version, uint64_t height, uint8_t threshold, time_t time): version(version), threshold(threshold), height(height), time(time) {}
240  };
241 
242  private:
243 
244  uint8_t get_block_version(uint64_t height) const;
245  bool do_check(uint8_t block_version, uint8_t voting_version) const;
246  bool do_check_for_height(uint8_t block_version, uint8_t voting_version, uint64_t height) const;
247  int get_voted_fork_index(uint64_t height) const;
248  uint8_t get_effective_version(uint8_t voting_version) const;
249  bool add(uint8_t block_version, uint8_t voting_version, uint64_t height);
250 
251  bool rescan_from_block_height(uint64_t height);
252  bool rescan_from_chain_height(uint64_t height);
253 
254  private:
255 
257 
258  time_t forked_time;
259  time_t update_time;
260  uint64_t window_size;
262 
265 
266  std::vector<Params> heights;
267 
268  std::deque<uint8_t> versions; /* rolling window of the last N blocks' versions */
269  unsigned int last_versions[256]; /* count of the block versions in the last N blocks */
271 
272  mutable epee::critical_section lock;
273  };
274 
275 } // namespace cryptonote
276 
uint64_t height
Definition: blockchain.cpp:91
uint8_t version
Definition: blockchain.cpp:90
time_t time
Definition: blockchain.cpp:93
uint8_t threshold
Definition: blockchain.cpp:92
The BlockchainDB backing store interface declaration/contract.
Definition: blockchain_db.h:344
Definition: hardfork.h:40
State
Definition: hardfork.h:42
@ LikelyForked
Definition: hardfork.h:43
@ Ready
Definition: hardfork.h:45
@ UpdateNeeded
Definition: hardfork.h:44
time_t update_time
Definition: hardfork.h:259
uint8_t get_ideal_version() const
returns the latest "ideal" version
Definition: hardfork.cpp:367
bool add(const cryptonote::block &block, uint64_t height)
add a new block
Definition: hardfork.cpp:164
void on_block_popped(uint64_t new_chain_height)
called when one or more blocks are popped from the blockchain
Definition: hardfork.cpp:287
epee::critical_section lock
Definition: hardfork.h:272
static const uint64_t DEFAULT_WINDOW_SIZE
Definition: hardfork.h:51
void init()
initialize the object
Definition: hardfork.cpp:169
bool rescan_from_block_height(uint64_t height)
Definition: hardfork.cpp:249
uint8_t get_current_version() const
returns the current version
Definition: hardfork.cpp:361
bool reorganize_from_block_height(uint64_t height)
called when the blockchain is reorganized
Definition: hardfork.cpp:202
bool rescan_from_chain_height(uint64_t height)
Definition: hardfork.cpp:280
std::deque< uint8_t > versions
Definition: hardfork.h:268
State get_state() const
Definition: hardfork.cpp:343
static const uint8_t DEFAULT_THRESHOLD_PERCENT
Definition: hardfork.h:52
bool do_check_for_height(uint8_t block_version, uint8_t voting_version, uint64_t height) const
Definition: hardfork.cpp:122
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:409
uint8_t get_next_version() const
returns the next version
Definition: hardfork.cpp:397
static const uint64_t DEFAULT_ORIGINAL_VERSION_TILL_HEIGHT
Definition: hardfork.h:48
uint8_t original_version
Definition: hardfork.h:263
bool add_fork(uint8_t version, uint64_t height, uint8_t threshold, time_t time)
add a new hardfork height
Definition: hardfork.cpp:74
int get_voted_fork_index(uint64_t height) const
Definition: hardfork.cpp:312
uint64_t window_size
Definition: hardfork.h:260
time_t forked_time
Definition: hardfork.h:258
static const time_t DEFAULT_UPDATE_TIME
Definition: hardfork.h:50
static const time_t DEFAULT_FORKED_TIME
Definition: hardfork.h:49
uint8_t get_effective_version(uint8_t voting_version) const
Definition: hardfork.cpp:100
uint64_t original_version_till_height
Definition: hardfork.h:264
uint64_t get_earliest_ideal_height_for_version(uint8_t version) const
returns the earliest block a given version may activate
Definition: hardfork.cpp:384
uint8_t get_block_version(uint64_t height) const
Definition: hardfork.cpp:193
uint64_t get_window_size() const
returns the size of the voting window in blocks
Definition: hardfork.h:232
bool reorganize_from_chain_height(uint64_t height)
Definition: hardfork.cpp:242
bool check(const cryptonote::block &block) const
check whether a new block would be accepted
Definition: hardfork.cpp:116
bool do_check(uint8_t block_version, uint8_t voting_version) const
Definition: hardfork.cpp:110
uint8_t default_threshold_percent
Definition: hardfork.h:261
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:129
uint32_t current_fork_index
Definition: hardfork.h:270
std::vector< Params > heights
Definition: hardfork.h:266
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:58
unsigned int last_versions[256]
Definition: hardfork.h:269
uint8_t get(uint64_t height) const
returns the hard fork version for the given block height
Definition: hardfork.cpp:348
BlockchainDB & db
Definition: hardfork.h:256
Holds cryptonote related classes and helpers.
Definition: db_bdb.cpp:226
Definition: hardfork.h:234
uint64_t height
Definition: hardfork.h:237
uint8_t version
Definition: hardfork.h:235
time_t time
Definition: hardfork.h:238
Params(uint8_t version, uint64_t height, uint8_t threshold, time_t time)
Definition: hardfork.h:239
uint8_t threshold
Definition: hardfork.h:236
Definition: cryptonote_basic.h:410