Skip to content

Commit 5bb734b

Browse files
jamesobJeremyRubin
andcommitted
consensus: add a CTV deployment for regtest only
Co-authored-by: Jeremy Rubin <j@rubin.io>
1 parent 4c57901 commit 5bb734b

File tree

9 files changed

+349
-19
lines changed

9 files changed

+349
-19
lines changed

src/consensus/params.h

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ enum DeploymentPos : uint16_t {
3333
DEPLOYMENT_TESTDUMMY,
3434
DEPLOYMENT_TAPROOT, // Deployment of Schnorr/Taproot (BIPs 340-342)
3535
// NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp
36+
DEPLOYMENT_CTV, // Deployment of CHECKTEMPLATEVERIFY (BIP 119) (regtest only)
3637
MAX_VERSION_BITS_DEPLOYMENTS
3738
};
3839
constexpr bool ValidDeployment(DeploymentPos dep) { return dep < MAX_VERSION_BITS_DEPLOYMENTS; }

src/deploymentinfo.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B
1717
/*.name =*/ "taproot",
1818
/*.gbt_force =*/ true,
1919
},
20+
{
21+
/*.name =*/ "ctv",
22+
/*.gbt_force =*/ true,
23+
},
2024
};
2125

2226
std::string DeploymentName(Consensus::BuriedDeployment dep)

src/kernel/chainparams.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,11 @@ class CRegTestParams : public CChainParams
557557
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
558558
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
559559

560+
consensus.vDeployments[Consensus::DEPLOYMENT_CTV].bit = 1;
561+
consensus.vDeployments[Consensus::DEPLOYMENT_CTV].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE;
562+
consensus.vDeployments[Consensus::DEPLOYMENT_CTV].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT;
563+
consensus.vDeployments[Consensus::DEPLOYMENT_CTV].min_activation_height = 0; // No activation delay
564+
560565
consensus.nMinimumChainWork = uint256{};
561566
consensus.defaultAssumeValid = uint256{};
562567

src/policy/policy.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,7 @@ static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS{MANDATORY_SCRIPT_VERI
125125
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION |
126126
SCRIPT_VERIFY_DISCOURAGE_OP_SUCCESS |
127127
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_PUBKEYTYPE |
128-
SCRIPT_VERIFY_DISCOURAGE_CHECKTEMPLATEVERIFY |
129-
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_CHECKTEMPLATEVERIFY |
130-
SCRIPT_VERIFY_CHECKTEMPLATEVERIFY};
128+
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_CHECKTEMPLATEVERIFY};
131129

132130

133131
/** For convenience, standard but not mandatory verify flags. */

src/rpc/blockchain.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1408,6 +1408,10 @@ UniValue DeploymentInfo(const CBlockIndex* blockindex, const ChainstateManager&
14081408
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_SEGWIT);
14091409
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TESTDUMMY);
14101410
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TAPROOT);
1411+
1412+
if (chainman.GetParams().GetChainType() == ChainType::REGTEST) {
1413+
SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_CTV);
1414+
}
14111415
return softforks;
14121416
}
14131417
} // anon namespace

src/test/versionbits_tests.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,12 @@ BOOST_FIXTURE_TEST_CASE(versionbits_computeblockversion, BlockVersionTest)
435435
// the same bit might overlap, even when non-overlapping start-end
436436
// times are picked.
437437
const uint32_t dep_mask{vbcache.Mask(chainParams->GetConsensus(), dep)};
438+
439+
if (chain_type != ChainType::REGTEST && dep == Consensus::DEPLOYMENT_CTV) {
440+
// CTV only exists as a deployment on regtest, so skip over it for other
441+
// chains.
442+
continue;
443+
}
438444
BOOST_CHECK(!(chain_all_vbits & dep_mask));
439445
chain_all_vbits |= dep_mask;
440446
check_computeblockversion(vbcache, chainParams->GetConsensus(), dep);

src/validation.cpp

+11-1
Original file line numberDiff line numberDiff line change
@@ -1231,7 +1231,12 @@ bool MemPoolAccept::PolicyScriptChecks(const ATMPArgs& args, Workspace& ws)
12311231
const CTransaction& tx = *ws.m_ptx;
12321232
TxValidationState& state = ws.m_state;
12331233

1234-
constexpr unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS;
1234+
unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS;
1235+
1236+
// CHECKTEMPLATEVERIFY (BIP119) is always active on regtest, but no other chain.
1237+
if (args.m_chainparams.GetChainType() == ChainType::REGTEST) {
1238+
scriptVerifyFlags |= SCRIPT_VERIFY_CHECKTEMPLATEVERIFY;
1239+
}
12351240

12361241
// Check input scripts and signatures.
12371242
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
@@ -2410,6 +2415,11 @@ static unsigned int GetBlockScriptFlags(const CBlockIndex& block_index, const Ch
24102415
flags = it->second;
24112416
}
24122417

2418+
// Enforce CHECKLOCKTIMEVERIFY (BIP119)
2419+
if (DeploymentActiveAt(block_index, chainman, Consensus::DEPLOYMENT_CTV)) {
2420+
flags |= SCRIPT_VERIFY_CHECKTEMPLATEVERIFY;
2421+
}
2422+
24132423
// Enforce the DERSIG (BIP66) rule
24142424
if (DeploymentActiveAt(block_index, chainman, Consensus::DEPLOYMENT_DERSIG)) {
24152425
flags |= SCRIPT_VERIFY_DERSIG;

0 commit comments

Comments
 (0)