versionbits: Add support for delayed activation
This commit is contained in:
1 parent
9e6b65f6fa
commit
73d4a70639
8 files changed
+41
-10
No files matched your search
+20
-5
@@ -83,11 +83,13 @@ public:
|
|||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
// Deployment of Taproot (BIPs 340-342)
|
// Deployment of Taproot (BIPs 340-342)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000001533efd8d716a517fe2c5008");
|
consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000001533efd8d716a517fe2c5008");
|
||||||
consensus.defaultAssumeValid = uint256S("0x0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72"); // 654683
|
consensus.defaultAssumeValid = uint256S("0x0000000000000000000b9d2ec5a352ecba0592946514a92f14319dc2b367fc72"); // 654683
|
||||||
@@ -200,11 +202,13 @@ public:
|
|||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
// Deployment of Taproot (BIPs 340-342)
|
// Deployment of Taproot (BIPs 340-342)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000001db6ec4ac88cf2272c6");
|
consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000001db6ec4ac88cf2272c6");
|
||||||
consensus.defaultAssumeValid = uint256S("0x000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0"); // 1864000
|
consensus.defaultAssumeValid = uint256S("0x000000000000006433d1efec504c53ca332b64963c425395515b01977bd7b3b0"); // 1864000
|
||||||
@@ -335,11 +339,13 @@ public:
|
|||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
// Activation of Taproot (BIPs 340-342)
|
// Activation of Taproot (BIPs 340-342)
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
// message start is defined as the first 4 bytes of the sha256d of the block script
|
// message start is defined as the first 4 bytes of the sha256d of the block script
|
||||||
CHashWriter h(SER_DISK, 0);
|
CHashWriter h(SER_DISK, 0);
|
||||||
@@ -397,12 +403,16 @@ public:
|
|||||||
consensus.fPowNoRetargeting = true;
|
consensus.fPowNoRetargeting = true;
|
||||||
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
|
consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
|
||||||
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
||||||
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 0;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
|
||||||
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
|
||||||
|
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
|
||||||
|
|
||||||
consensus.nMinimumChainWork = uint256{};
|
consensus.nMinimumChainWork = uint256{};
|
||||||
consensus.defaultAssumeValid = uint256{};
|
consensus.defaultAssumeValid = uint256{};
|
||||||
@@ -466,10 +476,11 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Allows modifying the Version Bits regtest parameters.
|
* Allows modifying the Version Bits regtest parameters.
|
||||||
*/
|
*/
|
||||||
void UpdateVersionBitsParameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
|
void UpdateVersionBitsParameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout, int min_activation_height)
|
||||||
{
|
{
|
||||||
consensus.vDeployments[d].nStartTime = nStartTime;
|
consensus.vDeployments[d].nStartTime = nStartTime;
|
||||||
consensus.vDeployments[d].nTimeout = nTimeout;
|
consensus.vDeployments[d].nTimeout = nTimeout;
|
||||||
|
consensus.vDeployments[d].min_activation_height = min_activation_height;
|
||||||
}
|
}
|
||||||
void UpdateActivationParametersFromArgs(const ArgsManager& args);
|
void UpdateActivationParametersFromArgs(const ArgsManager& args);
|
||||||
};
|
};
|
||||||
@@ -492,22 +503,26 @@ void CRegTestParams::UpdateActivationParametersFromArgs(const ArgsManager& args)
|
|||||||
for (const std::string& strDeployment : args.GetArgs("-vbparams")) {
|
for (const std::string& strDeployment : args.GetArgs("-vbparams")) {
|
||||||
std::vector<std::string> vDeploymentParams;
|
std::vector<std::string> vDeploymentParams;
|
||||||
boost::split(vDeploymentParams, strDeployment, boost::is_any_of(":"));
|
boost::split(vDeploymentParams, strDeployment, boost::is_any_of(":"));
|
||||||
if (vDeploymentParams.size() != 3) {
|
if (vDeploymentParams.size() < 3 || 4 < vDeploymentParams.size()) {
|
||||||
throw std::runtime_error("Version bits parameters malformed, expecting deployment:start:end");
|
throw std::runtime_error("Version bits parameters malformed, expecting deployment:start:end[:min_activation_height]");
|
||||||
}
|
}
|
||||||
int64_t nStartTime, nTimeout;
|
int64_t nStartTime, nTimeout;
|
||||||
|
int min_activation_height = 0;
|
||||||
if (!ParseInt64(vDeploymentParams[1], &nStartTime)) {
|
if (!ParseInt64(vDeploymentParams[1], &nStartTime)) {
|
||||||
throw std::runtime_error(strprintf("Invalid nStartTime (%s)", vDeploymentParams[1]));
|
throw std::runtime_error(strprintf("Invalid nStartTime (%s)", vDeploymentParams[1]));
|
||||||
}
|
}
|
||||||
if (!ParseInt64(vDeploymentParams[2], &nTimeout)) {
|
if (!ParseInt64(vDeploymentParams[2], &nTimeout)) {
|
||||||
throw std::runtime_error(strprintf("Invalid nTimeout (%s)", vDeploymentParams[2]));
|
throw std::runtime_error(strprintf("Invalid nTimeout (%s)", vDeploymentParams[2]));
|
||||||
}
|
}
|
||||||
|
if (vDeploymentParams.size() >= 4 && !ParseInt32(vDeploymentParams[3], &min_activation_height)) {
|
||||||
|
throw std::runtime_error(strprintf("Invalid min_activation_height (%s)", vDeploymentParams[3]));
|
||||||
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int j=0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) {
|
for (int j=0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) {
|
||||||
if (vDeploymentParams[0] == VersionBitsDeploymentInfo[j].name) {
|
if (vDeploymentParams[0] == VersionBitsDeploymentInfo[j].name) {
|
||||||
UpdateVersionBitsParameters(Consensus::DeploymentPos(j), nStartTime, nTimeout);
|
UpdateVersionBitsParameters(Consensus::DeploymentPos(j), nStartTime, nTimeout, min_activation_height);
|
||||||
found = true;
|
found = true;
|
||||||
LogPrintf("Setting version bits activation parameters for %s to start=%ld, timeout=%ld\n", vDeploymentParams[0], nStartTime, nTimeout);
|
LogPrintf("Setting version bits activation parameters for %s to start=%ld, timeout=%ld, min_activation_height=%d\n", vDeploymentParams[0], nStartTime, nTimeout, min_activation_height);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ void SetupChainParamsBaseOptions(ArgsManager& argsman)
|
|||||||
"This is intended for regression testing tools and app development. Equivalent to -chain=regtest.", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
|
"This is intended for regression testing tools and app development. Equivalent to -chain=regtest.", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
|
||||||
argsman.AddArg("-segwitheight=<n>", "Set the activation height of segwit. -1 to disable. (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-segwitheight=<n>", "Set the activation height of segwit. -1 to disable. (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-testnet", "Use the test chain. Equivalent to -chain=test.", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
|
argsman.AddArg("-testnet", "Use the test chain. Equivalent to -chain=test.", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
|
||||||
argsman.AddArg("-vbparams=deployment:start:end", "Use given start/end times for specified version bits deployment (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
|
argsman.AddArg("-vbparams=deployment:start:end[:min_activation_height]", "Use given start/end times and min_activation_height for specified version bits deployment (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS);
|
||||||
argsman.AddArg("-signet", "Use the signet chain. Equivalent to -chain=signet. Note that the network is defined by the -signetchallenge parameter", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
|
argsman.AddArg("-signet", "Use the signet chain. Equivalent to -chain=signet. Note that the network is defined by the -signetchallenge parameter", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS);
|
||||||
argsman.AddArg("-signetchallenge", "Blocks must satisfy the given script to be considered valid (only for signet networks; defaults to the global default signet test network challenge)", ArgsManager::ALLOW_STRING, OptionsCategory::CHAINPARAMS);
|
argsman.AddArg("-signetchallenge", "Blocks must satisfy the given script to be considered valid (only for signet networks; defaults to the global default signet test network challenge)", ArgsManager::ALLOW_STRING, OptionsCategory::CHAINPARAMS);
|
||||||
argsman.AddArg("-signetseednode", "Specify a seed node for the signet network, in the hostname[:port] format, e.g. sig.net:1234 (may be used multiple times to specify multiple seed nodes; defaults to the global default signet test network seed node(s))", ArgsManager::ALLOW_STRING, OptionsCategory::CHAINPARAMS);
|
argsman.AddArg("-signetseednode", "Specify a seed node for the signet network, in the hostname[:port] format, e.g. sig.net:1234 (may be used multiple times to specify multiple seed nodes; defaults to the global default signet test network seed node(s))", ArgsManager::ALLOW_STRING, OptionsCategory::CHAINPARAMS);
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ struct BIP9Deployment {
|
|||||||
int64_t nStartTime;
|
int64_t nStartTime;
|
||||||
/** Timeout/expiry MedianTime for the deployment attempt. */
|
/** Timeout/expiry MedianTime for the deployment attempt. */
|
||||||
int64_t nTimeout;
|
int64_t nTimeout;
|
||||||
|
/** If lock in occurs, delay activation until at least this block
|
||||||
|
* height. Note that activation will only occur on a retarget
|
||||||
|
* boundary.
|
||||||
|
*/
|
||||||
|
int min_activation_height{0};
|
||||||
|
|
||||||
/** Constant for nTimeout very far in the future. */
|
/** Constant for nTimeout very far in the future. */
|
||||||
static constexpr int64_t NO_TIMEOUT = std::numeric_limits<int64_t>::max();
|
static constexpr int64_t NO_TIMEOUT = std::numeric_limits<int64_t>::max();
|
||||||
|
|||||||
@@ -1258,6 +1258,7 @@ static void BIP9SoftForkDescPushBack(UniValue& softforks, const std::string &nam
|
|||||||
statsUV.pushKV("possible", statsStruct.possible);
|
statsUV.pushKV("possible", statsStruct.possible);
|
||||||
bip9.pushKV("statistics", statsUV);
|
bip9.pushKV("statistics", statsUV);
|
||||||
}
|
}
|
||||||
|
bip9.pushKV("min_activation_height", consensusParams.vDeployments[id].min_activation_height);
|
||||||
|
|
||||||
UniValue rv(UniValue::VOBJ);
|
UniValue rv(UniValue::VOBJ);
|
||||||
rv.pushKV("type", "bip9");
|
rv.pushKV("type", "bip9");
|
||||||
@@ -1304,6 +1305,7 @@ RPCHelpMan getblockchaininfo()
|
|||||||
{RPCResult::Type::NUM_TIME, "start_time", "the minimum median time past of a block at which the bit gains its meaning"},
|
{RPCResult::Type::NUM_TIME, "start_time", "the minimum median time past of a block at which the bit gains its meaning"},
|
||||||
{RPCResult::Type::NUM_TIME, "timeout", "the median time past of a block at which the deployment is considered failed if not yet locked in"},
|
{RPCResult::Type::NUM_TIME, "timeout", "the median time past of a block at which the deployment is considered failed if not yet locked in"},
|
||||||
{RPCResult::Type::NUM, "since", "height of the first block to which the status applies"},
|
{RPCResult::Type::NUM, "since", "height of the first block to which the status applies"},
|
||||||
|
{RPCResult::Type::NUM, "min_activation_height", "minimum height of blocks for which the rules may be enforced"},
|
||||||
{RPCResult::Type::OBJ, "statistics", "numeric statistics about BIP9 signalling for a softfork (only for \"started\" status)",
|
{RPCResult::Type::OBJ, "statistics", "numeric statistics about BIP9 signalling for a softfork (only for \"started\" status)",
|
||||||
{
|
{
|
||||||
{RPCResult::Type::NUM, "period", "the length in blocks of the BIP9 signalling period"},
|
{RPCResult::Type::NUM, "period", "the length in blocks of the BIP9 signalling period"},
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ static void check_computeblockversion(const Consensus::Params& params, Consensus
|
|||||||
int64_t bit = params.vDeployments[dep].bit;
|
int64_t bit = params.vDeployments[dep].bit;
|
||||||
int64_t nStartTime = params.vDeployments[dep].nStartTime;
|
int64_t nStartTime = params.vDeployments[dep].nStartTime;
|
||||||
int64_t nTimeout = params.vDeployments[dep].nTimeout;
|
int64_t nTimeout = params.vDeployments[dep].nTimeout;
|
||||||
|
int min_activation_height = params.vDeployments[dep].min_activation_height;
|
||||||
|
|
||||||
// should not be any signalling for first block
|
// should not be any signalling for first block
|
||||||
BOOST_CHECK_EQUAL(ComputeBlockVersion(nullptr, params), VERSIONBITS_TOP_BITS);
|
BOOST_CHECK_EQUAL(ComputeBlockVersion(nullptr, params), VERSIONBITS_TOP_BITS);
|
||||||
@@ -267,6 +268,7 @@ static void check_computeblockversion(const Consensus::Params& params, Consensus
|
|||||||
BOOST_REQUIRE(nTimeout <= std::numeric_limits<uint32_t>::max() || nTimeout == Consensus::BIP9Deployment::NO_TIMEOUT);
|
BOOST_REQUIRE(nTimeout <= std::numeric_limits<uint32_t>::max() || nTimeout == Consensus::BIP9Deployment::NO_TIMEOUT);
|
||||||
BOOST_REQUIRE(0 <= bit && bit < 32);
|
BOOST_REQUIRE(0 <= bit && bit < 32);
|
||||||
BOOST_REQUIRE(((1 << bit) & VERSIONBITS_TOP_MASK) == 0);
|
BOOST_REQUIRE(((1 << bit) & VERSIONBITS_TOP_MASK) == 0);
|
||||||
|
BOOST_REQUIRE(min_activation_height == 0);
|
||||||
|
|
||||||
// In the first chain, test that the bit is set by CBV until it has failed.
|
// In the first chain, test that the bit is set by CBV until it has failed.
|
||||||
// In the second chain, test the bit is set by CBV while STARTED and
|
// In the second chain, test the bit is set by CBV while STARTED and
|
||||||
|
|||||||
+6
-2
@@ -9,6 +9,7 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
|
|||||||
{
|
{
|
||||||
int nPeriod = Period(params);
|
int nPeriod = Period(params);
|
||||||
int nThreshold = Threshold(params);
|
int nThreshold = Threshold(params);
|
||||||
|
int min_activation_height = MinActivationHeight(params);
|
||||||
int64_t nTimeStart = BeginTime(params);
|
int64_t nTimeStart = BeginTime(params);
|
||||||
int64_t nTimeTimeout = EndTime(params);
|
int64_t nTimeTimeout = EndTime(params);
|
||||||
|
|
||||||
@@ -78,8 +79,10 @@ ThresholdState AbstractThresholdConditionChecker::GetStateFor(const CBlockIndex*
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ThresholdState::LOCKED_IN: {
|
case ThresholdState::LOCKED_IN: {
|
||||||
// Always progresses into ACTIVE.
|
// Progresses into ACTIVE provided activation height will have been reached.
|
||||||
stateNext = ThresholdState::ACTIVE;
|
if (pindexPrev->nHeight + 1 >= min_activation_height) {
|
||||||
|
stateNext = ThresholdState::ACTIVE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ThresholdState::FAILED:
|
case ThresholdState::FAILED:
|
||||||
@@ -170,6 +173,7 @@ private:
|
|||||||
protected:
|
protected:
|
||||||
int64_t BeginTime(const Consensus::Params& params) const override { return params.vDeployments[id].nStartTime; }
|
int64_t BeginTime(const Consensus::Params& params) const override { return params.vDeployments[id].nStartTime; }
|
||||||
int64_t EndTime(const Consensus::Params& params) const override { return params.vDeployments[id].nTimeout; }
|
int64_t EndTime(const Consensus::Params& params) const override { return params.vDeployments[id].nTimeout; }
|
||||||
|
int MinActivationHeight(const Consensus::Params& params) const override { return params.vDeployments[id].min_activation_height; }
|
||||||
int Period(const Consensus::Params& params) const override { return params.nMinerConfirmationWindow; }
|
int Period(const Consensus::Params& params) const override { return params.nMinerConfirmationWindow; }
|
||||||
int Threshold(const Consensus::Params& params) const override { return params.nRuleChangeActivationThreshold; }
|
int Threshold(const Consensus::Params& params) const override { return params.nRuleChangeActivationThreshold; }
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -25,7 +25,7 @@ static const int32_t VERSIONBITS_NUM_BITS = 29;
|
|||||||
enum class ThresholdState {
|
enum class ThresholdState {
|
||||||
DEFINED, // First state that each softfork starts out as. The genesis block is by definition in this state for each deployment.
|
DEFINED, // First state that each softfork starts out as. The genesis block is by definition in this state for each deployment.
|
||||||
STARTED, // For blocks past the starttime.
|
STARTED, // For blocks past the starttime.
|
||||||
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.
|
LOCKED_IN, // For at least one retarget period after the first retarget period with STARTED blocks of which at least threshold have the associated bit set in nVersion, until min_activation_height is reached.
|
||||||
ACTIVE, // For all blocks after the LOCKED_IN retarget period (final state)
|
ACTIVE, // For all blocks after the LOCKED_IN retarget period (final state)
|
||||||
FAILED, // For all blocks once the first retarget period after the timeout time is hit, if LOCKED_IN wasn't already reached (final state)
|
FAILED, // For all blocks once the first retarget period after the timeout time is hit, if LOCKED_IN wasn't already reached (final state)
|
||||||
};
|
};
|
||||||
@@ -57,6 +57,7 @@ protected:
|
|||||||
virtual bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const =0;
|
virtual bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const =0;
|
||||||
virtual int64_t BeginTime(const Consensus::Params& params) const =0;
|
virtual int64_t BeginTime(const Consensus::Params& params) const =0;
|
||||||
virtual int64_t EndTime(const Consensus::Params& params) const =0;
|
virtual int64_t EndTime(const Consensus::Params& params) const =0;
|
||||||
|
virtual int MinActivationHeight(const Consensus::Params& params) const { return 0; }
|
||||||
virtual int Period(const Consensus::Params& params) const =0;
|
virtual int Period(const Consensus::Params& params) const =0;
|
||||||
virtual int Threshold(const Consensus::Params& params) const =0;
|
virtual int Threshold(const Consensus::Params& params) const =0;
|
||||||
|
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ class BlockchainTest(BitcoinTestFramework):
|
|||||||
'count': 57,
|
'count': 57,
|
||||||
'possible': True,
|
'possible': True,
|
||||||
},
|
},
|
||||||
|
'min_activation_height': 0,
|
||||||
},
|
},
|
||||||
'active': False
|
'active': False
|
||||||
},
|
},
|
||||||
@@ -158,7 +159,8 @@ class BlockchainTest(BitcoinTestFramework):
|
|||||||
'status': 'active',
|
'status': 'active',
|
||||||
'start_time': -1,
|
'start_time': -1,
|
||||||
'timeout': 9223372036854775807,
|
'timeout': 9223372036854775807,
|
||||||
'since': 0
|
'since': 0,
|
||||||
|
'min_activation_height': 0,
|
||||||
},
|
},
|
||||||
'height': 0,
|
'height': 0,
|
||||||
'active': True
|
'active': True
|
||||||
|
|||||||
Reference in new issue
Block a user