Line data Source code
1 : // Copyright (c) 2016-2019 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #ifndef BITCOIN_VERSIONBITS_H 6 : #define BITCOIN_VERSIONBITS_H 7 : 8 : #include <chain.h> 9 : #include <map> 10 : 11 : /** What block version to use for new blocks (pre versionbits) */ 12 : static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 4; 13 : /** What bits to set in version for versionbits blocks */ 14 : static const int32_t VERSIONBITS_TOP_BITS = 0x20000000UL; 15 : /** What bitmask determines whether versionbits is in use */ 16 : static const int32_t VERSIONBITS_TOP_MASK = 0xE0000000UL; 17 : /** Total bits available for versionbits */ 18 : static const int32_t VERSIONBITS_NUM_BITS = 29; 19 : 20 : /** BIP 9 defines a finite-state-machine to deploy a softfork in multiple stages. 21 : * State transitions happen during retarget period if conditions are met 22 : * In case of reorg, transitions can go backward. Without transition, state is 23 : * inherited between periods. All blocks of a period share the same state. 24 : */ 25 : enum class ThresholdState { 26 : DEFINED, // First state that each softfork starts out as. The genesis block is by definition in this state for each deployment. 27 : STARTED, // For blocks past the starttime. 28 : LOCKED_IN, // For one retarget period after the first retarget period with STARTED blocks of which at least threshold have the associated bit set in nVersion. 29 : ACTIVE, // For all blocks after the LOCKED_IN retarget period (final state) 30 : FAILED, // For all blocks once the first retarget period after the timeout time is hit, if LOCKED_IN wasn't already reached (final state) 31 : }; 32 : 33 : // A map that gives the state for blocks whose height is a multiple of Period(). 34 : // The map is indexed by the block's parent, however, so all keys in the map 35 : // will either be nullptr or a block with (height + 1) % Period() == 0. 36 : typedef std::map<const CBlockIndex*, ThresholdState> ThresholdConditionCache; 37 : 38 : /** Display status of an in-progress BIP9 softfork */ 39 : struct BIP9Stats { 40 : /** Length of blocks of the BIP9 signalling period */ 41 : int period; 42 : /** Number of blocks with the version bit set required to activate the softfork */ 43 : int threshold; 44 : /** Number of blocks elapsed since the beginning of the current period */ 45 : int elapsed; 46 : /** Number of blocks with the version bit set since the beginning of the current period */ 47 : int count; 48 : /** False if there are not enough blocks left in this period to pass activation threshold */ 49 : bool possible; 50 : }; 51 : 52 : /** 53 : * Abstract class that implements BIP9-style threshold logic, and caches results. 54 : */ 55 6464324 : class AbstractThresholdConditionChecker { 56 : protected: 57 : virtual bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const =0; 58 : virtual int64_t BeginTime(const Consensus::Params& params) const =0; 59 : virtual int64_t EndTime(const Consensus::Params& params) const =0; 60 : virtual int Period(const Consensus::Params& params) const =0; 61 : virtual int Threshold(const Consensus::Params& params) const =0; 62 : 63 : public: 64 : /** Returns the numerical statistics of an in-progress BIP9 softfork in the current period */ 65 : BIP9Stats GetStateStatisticsFor(const CBlockIndex* pindex, const Consensus::Params& params) const; 66 : /** Returns the state for pindex A based on parent pindexPrev B. Applies any state transition if conditions are present. 67 : * Caches state from first block of period. */ 68 : ThresholdState GetStateFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const; 69 : /** Returns the height since when the ThresholdState has started for pindex A based on parent pindexPrev B, all blocks of a period share the same */ 70 : int GetStateSinceHeightFor(const CBlockIndex* pindexPrev, const Consensus::Params& params, ThresholdConditionCache& cache) const; 71 : }; 72 : 73 : /** BIP 9 allows multiple softforks to be deployed in parallel. We cache per-period state for every one of them 74 : * keyed by the bit position used to signal support. */ 75 2560 : struct VersionBitsCache 76 : { 77 : ThresholdConditionCache caches[Consensus::MAX_VERSION_BITS_DEPLOYMENTS]; 78 : 79 : void Clear(); 80 : }; 81 : 82 : ThresholdState VersionBitsState(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache); 83 : BIP9Stats VersionBitsStatistics(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos); 84 : int VersionBitsStateSinceHeight(const CBlockIndex* pindexPrev, const Consensus::Params& params, Consensus::DeploymentPos pos, VersionBitsCache& cache); 85 : uint32_t VersionBitsMask(const Consensus::Params& params, Consensus::DeploymentPos pos); 86 : 87 : #endif // BITCOIN_VERSIONBITS_H