Changeset View
Changeset View
Standalone View
Standalone View
src/versionbits.h
// Copyright (c) 2016 The Bitcoin Core developers | // Copyright (c) 2016 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#ifndef BITCOIN_CONSENSUS_VERSIONBITS | #ifndef BITCOIN_CONSENSUS_VERSIONBITS | ||||
#define BITCOIN_CONSENSUS_VERSIONBITS | #define BITCOIN_CONSENSUS_VERSIONBITS | ||||
#include "chain.h" | #include <cstdint> | ||||
#include <map> | |||||
/** What block version to use for new blocks (pre versionbits) */ | /** What block version to use for new blocks (pre versionbits) */ | ||||
static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 4; | static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION = 4; | ||||
/** What bits to set in version for versionbits blocks */ | /** What bits to set in version for versionbits blocks */ | ||||
static const int32_t VERSIONBITS_TOP_BITS = 0x20000000UL; | static const int32_t VERSIONBITS_TOP_BITS = 0x20000000UL; | ||||
/** What bitmask determines whether versionbits is in use */ | /** What bitmask determines whether versionbits is in use */ | ||||
static const int32_t VERSIONBITS_TOP_MASK = 0xE0000000UL; | static const int32_t VERSIONBITS_TOP_MASK = 0xE0000000UL; | ||||
/** Total bits available for versionbits */ | /** Total bits available for versionbits */ | ||||
static const int32_t VERSIONBITS_NUM_BITS = 29; | static const int32_t VERSIONBITS_NUM_BITS = 29; | ||||
enum class ThresholdState { | |||||
DEFINED, | |||||
STARTED, | |||||
LOCKED_IN, | |||||
ACTIVE, | |||||
FAILED, | |||||
}; | |||||
// A map that gives the state for blocks whose height is a multiple of Period(). | |||||
// The map is indexed by the block's parent, however, so all keys in the map | |||||
// will either be nullptr or a block with (height + 1) % Period() == 0. | |||||
typedef std::map<const CBlockIndex *, ThresholdState> ThresholdConditionCache; | |||||
struct BIP9DeploymentInfo { | |||||
/** Deployment name */ | |||||
const char *name; | |||||
/** Whether GBT clients can safely ignore this rule in simplified usage */ | |||||
bool gbt_force; | |||||
}; | |||||
extern const struct BIP9DeploymentInfo VersionBitsDeploymentInfo[]; | |||||
/** | |||||
* Abstract class that implements BIP9-style threshold logic, and caches | |||||
* results. | |||||
*/ | |||||
class AbstractThresholdConditionChecker { | |||||
protected: | |||||
virtual bool Condition(const CBlockIndex *pindex, | |||||
const Consensus::Params ¶ms) const = 0; | |||||
virtual int64_t BeginTime(const Consensus::Params ¶ms) const = 0; | |||||
virtual int64_t EndTime(const Consensus::Params ¶ms) const = 0; | |||||
virtual int Period(const Consensus::Params ¶ms) const = 0; | |||||
virtual int Threshold(const Consensus::Params ¶ms) const = 0; | |||||
public: | |||||
// Note that the functions below take a pindexPrev as input: they compute | |||||
// information for block B based on its parent. | |||||
ThresholdState GetStateFor(const CBlockIndex *pindexPrev, | |||||
const Consensus::Params ¶ms, | |||||
ThresholdConditionCache &cache) const; | |||||
int GetStateSinceHeightFor(const CBlockIndex *pindexPrev, | |||||
const Consensus::Params ¶ms, | |||||
ThresholdConditionCache &cache) const; | |||||
}; | |||||
struct VersionBitsCache { | |||||
ThresholdConditionCache caches[Consensus::MAX_VERSION_BITS_DEPLOYMENTS]; | |||||
void Clear(); | |||||
}; | |||||
ThresholdState VersionBitsState(const CBlockIndex *pindexPrev, | |||||
const Consensus::Params ¶ms, | |||||
Consensus::DeploymentPos pos, | |||||
VersionBitsCache &cache); | |||||
int VersionBitsStateSinceHeight(const CBlockIndex *pindexPrev, | |||||
const Consensus::Params ¶ms, | |||||
Consensus::DeploymentPos pos, | |||||
VersionBitsCache &cache); | |||||
uint32_t VersionBitsMask(const Consensus::Params ¶ms, | |||||
Consensus::DeploymentPos pos); | |||||
#endif | #endif |