Electroneum
hardfork.h
Go to the documentation of this file.
1 // Copyrights(c) 2017-2021, 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
53 
63  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);
64 
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 
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 
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 
232  uint64_t get_window_size() const { return window_size; }
233 
234  struct Params {
238  time_t 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 
256  BlockchainDB &db;
257 
258  time_t forked_time;
259  time_t update_time;
260  uint64_t window_size;
261  uint8_t default_threshold_percent;
262 
263  uint8_t original_version;
264  uint64_t original_version_till_height;
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 */
270  uint32_t current_fork_index;
271 
272  mutable epee::critical_section lock;
273  };
274 
275 } // namespace cryptonote
276 
static const uint64_t DEFAULT_WINDOW_SIZE
Definition: hardfork.h:51
bool reorganize_from_chain_height(uint64_t height)
Definition: hardfork.cpp:242
uint8_t get_current_version() const
returns the current version
Definition: hardfork.cpp:361
uint8_t get_next_version() const
returns the next version
Definition: hardfork.cpp:397
static const uint8_t DEFAULT_THRESHOLD_PERCENT
Definition: hardfork.h:52
static const time_t DEFAULT_FORKED_TIME
Definition: hardfork.h:49
bool check(const cryptonote::block &block) const
check whether a new block would be accepted
Definition: hardfork.cpp:116
uint64_t height
Definition: blockchain.cpp:91
void init()
initialize the object
Definition: hardfork.cpp:169
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 char uint8_t
Definition: stdint.h:124
void on_block_popped(uint64_t new_chain_height)
called when one or more blocks are popped from the blockchain
Definition: hardfork.cpp:287
static const time_t DEFAULT_UPDATE_TIME
Definition: hardfork.h:50
Params(uint8_t version, uint64_t height, uint8_t threshold, time_t time)
Definition: hardfork.h:239
Holds cryptonote related classes and helpers.
Definition: ban.cpp:40
time_t time
Definition: blockchain.cpp:93
unsigned int uint32_t
Definition: stdint.h:126
bool add(const cryptonote::block &block, uint64_t height)
add a new block
Definition: hardfork.cpp:164
unsigned __int64 uint64_t
Definition: stdint.h:136
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
version
Supported socks variants.
Definition: socks.h:57
uint8_t get_ideal_version() const
returns the latest "ideal" version
Definition: hardfork.cpp:367
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
uint64_t get_window_size() const
returns the size of the voting window in blocks
Definition: hardfork.h:232
The BlockchainDB backing store interface declaration/contract.
State get_state() const
Definition: hardfork.cpp:343
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
bool add_fork(uint8_t version, uint64_t height, uint8_t threshold, time_t time)
add a new hardfork height
Definition: hardfork.cpp:74
bool reorganize_from_block_height(uint64_t height)
called when the blockchain is reorganized
Definition: hardfork.cpp:202
static const uint64_t DEFAULT_ORIGINAL_VERSION_TILL_HEIGHT
Definition: hardfork.h:48
uint8_t threshold
Definition: blockchain.cpp:92