From f88b9cb471da0d54bf1ff7ad2c565db62e851525 Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Fri, 7 Mar 2025 04:18:27 -0500 Subject: [PATCH] Remove Taproot activation height Drop DEPLOYMENT_TAPROOT from consensus.vDeployments. Bump MinBIP9WarningHeight. Clarify what is considered a BuriedDeployment and drop taproot from getdeploymentinfo RPC. Add a test to getblocktemplate to ensure the taproot rule is still set. Co-Authored-By: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> --- doc/bips.md | 3 ++- doc/release-notes-26201.md | 4 ++++ src/consensus/params.h | 7 +++++-- src/deploymentinfo.cpp | 4 ---- src/kernel/chainparams.cpp | 33 ++----------------------------- src/rpc/blockchain.cpp | 4 ++-- src/rpc/mining.cpp | 8 +++++++- test/functional/mining_basic.py | 3 +++ test/functional/rpc_blockchain.py | 13 ------------ 9 files changed, 25 insertions(+), 54 deletions(-) create mode 100644 doc/release-notes-26201.md diff --git a/doc/bips.md b/doc/bips.md index a95b3159ecb..97645d0eebe 100644 --- a/doc/bips.md +++ b/doc/bips.md @@ -58,7 +58,8 @@ BIPs that are implemented by Bitcoin Core: Validation rules for Taproot (including Schnorr signatures and Tapscript leaves) are implemented as of **v0.21.0** ([PR 19953](https://github.com/bitcoin/bitcoin/pull/19953)), with mainnet activation as of **v0.21.1** ([PR 21377](https://github.com/bitcoin/bitcoin/pull/21377), - [PR 21686](https://github.com/bitcoin/bitcoin/pull/21686)). + [PR 21686](https://github.com/bitcoin/bitcoin/pull/21686)), + always active as of **v24.0** ([PR 23536](https://github.com/bitcoin/bitcoin/pull/23536)). * [`BIP 350`](https://github.com/bitcoin/bips/blob/master/bip-0350.mediawiki): Addresses for native v1+ segregated Witness outputs use Bech32m instead of Bech32 as of **v22.0** ([PR 20861](https://github.com/bitcoin/bitcoin/pull/20861)). * [`BIP 371`](https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki): Taproot fields for PSBT as of **v24.0** ([PR 22558](https://github.com/bitcoin/bitcoin/pull/22558)). * [`BIP 379`](https://github.com/bitcoin/bips/blob/master/bip-0379.md): Miniscript was partially implemented in **v24.0** ([PR 24148](https://github.com/bitcoin/bitcoin/pull/24148)), and fully implemented as of **v26.0** ([PR 27255](https://github.com/bitcoin/bitcoin/pull/27255)). diff --git a/doc/release-notes-26201.md b/doc/release-notes-26201.md new file mode 100644 index 00000000000..66c9da54061 --- /dev/null +++ b/doc/release-notes-26201.md @@ -0,0 +1,4 @@ +RPC +--- + +- 'taproot' has been removed from 'getdeploymentinfo' because its historical activation height is no longer used anywhere in the codebase. (#26201) diff --git a/src/consensus/params.h b/src/consensus/params.h index dd29b9408e2..43a62cf1f20 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -18,6 +18,7 @@ namespace Consensus { /** * A buried deployment is one where the height of the activation has been hardcoded into * the client implementation long after the consensus change has activated. See BIP 90. + * Consensus changes for which the new rules are enforced from genesis are not listed here. */ enum BuriedDeployment : int16_t { // buried deployments get negative values to avoid overlap with DeploymentPos @@ -25,14 +26,16 @@ enum BuriedDeployment : int16_t { DEPLOYMENT_CLTV, DEPLOYMENT_DERSIG, DEPLOYMENT_CSV, + // SCRIPT_VERIFY_WITNESS is enforced from genesis, but the check for downloading + // missing witness data is not. BIP 147 also relies on hardcoded activation height. DEPLOYMENT_SEGWIT, }; constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_SEGWIT; } enum DeploymentPos : uint16_t { DEPLOYMENT_TESTDUMMY, - DEPLOYMENT_TAPROOT, // Deployment of Schnorr/Taproot (BIPs 340-342) // NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp + // Removing an entry may require bumping MinBIP9WarningHeight. MAX_VERSION_BITS_DEPLOYMENTS }; constexpr bool ValidDeployment(DeploymentPos dep) { return dep < MAX_VERSION_BITS_DEPLOYMENTS; } @@ -95,7 +98,7 @@ struct Params { * BIP 16 exception blocks. */ int SegwitHeight; /** Don't warn about unknown BIP 9 activations below this height. - * This prevents us from warning about the CSV and segwit activations. */ + * This prevents us from warning about the CSV, segwit and taproot activations. */ int MinBIP9WarningHeight; /** * Minimum blocks including miner confirmation of the total of 2016 blocks in a retargeting period, diff --git a/src/deploymentinfo.cpp b/src/deploymentinfo.cpp index 185a7dcb54c..ff5d8482d69 100644 --- a/src/deploymentinfo.cpp +++ b/src/deploymentinfo.cpp @@ -13,10 +13,6 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B /*.name =*/ "testdummy", /*.gbt_force =*/ true, }, - { - /*.name =*/ "taproot", - /*.gbt_force =*/ true, - }, }; std::string DeploymentName(Consensus::BuriedDeployment dep) diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp index 72e5e6dbe51..3b0094fa0a8 100644 --- a/src/kernel/chainparams.cpp +++ b/src/kernel/chainparams.cpp @@ -97,7 +97,7 @@ public: consensus.BIP66Height = 363725; // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 consensus.CSVHeight = 419328; // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5 consensus.SegwitHeight = 481824; // 0000000000000000001c8018d9cb3b742ef25114f27563e3fc4a1902167f9893 - consensus.MinBIP9WarningHeight = 483840; // segwit activation height + miner confirmation window + consensus.MinBIP9WarningHeight = 711648; // taproot activation height + miner confirmation window consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}; consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks consensus.nPowTargetSpacing = 10 * 60; @@ -111,12 +111,6 @@ public: consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay - // Deployment of Taproot (BIPs 340-342) - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2; - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1619222400; // April 24th, 2021 - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021 - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 709632; // Approximately November 12th, 2021 - consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000b1f3b93b65b16d035a82be84"}; consensus.defaultAssumeValid = uint256{"00000000000000000001b658dd1120e82e66d2790811f89ede9742ada3ed6d77"}; // 886157 @@ -227,7 +221,7 @@ public: consensus.BIP66Height = 330776; // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 consensus.CSVHeight = 770112; // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb consensus.SegwitHeight = 834624; // 00000000002b980fcd729daaa248fd9316a5200e9b367f4ff2c42453e84201ca - consensus.MinBIP9WarningHeight = 836640; // segwit activation height + miner confirmation window + consensus.MinBIP9WarningHeight = 2013984; // taproot activation height + miner confirmation window consensus.powLimit = uint256{"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}; consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks consensus.nPowTargetSpacing = 10 * 60; @@ -241,12 +235,6 @@ public: consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay - // Deployment of Taproot (BIPs 340-342) - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2; - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nStartTime = 1619222400; // April 24th, 2021 - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021 - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay - consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000000015f5e0c9f13455b0eb17"}; consensus.defaultAssumeValid = uint256{"00000000000003fc7967410ba2d0a8a8d50daedc318d43e8baf1a9782c236a57"}; // 3974606 @@ -340,12 +328,6 @@ public: consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay - // Deployment of Taproot (BIPs 340-342) - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2; - 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].min_activation_height = 0; // No activation delay - consensus.nMinimumChainWork = uint256{"0000000000000000000000000000000000000000000001d6dce8651b6094e4c1"}; consensus.defaultAssumeValid = uint256{"0000000000003ed4f08dbdf6f7d6b271a6bcffce25675cb40aa9fa43179a89f3"}; // 72600 @@ -480,12 +462,6 @@ public: consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].min_activation_height = 0; // No activation delay - // Activation of Taproot (BIPs 340-342) - consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].bit = 2; - 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].min_activation_height = 0; // No activation delay - // message start is defined as the first 4 bytes of the sha256d of the block script HashWriter h{}; h << consensus.signet_challenge; @@ -558,11 +534,6 @@ public: 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].nStartTime = Consensus::BIP9Deployment::ALWAYS_ACTIVE; - 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.defaultAssumeValid = uint256{}; diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index ac1ce6285f7..dbc0e13ad7a 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1407,7 +1407,6 @@ UniValue DeploymentInfo(const CBlockIndex* blockindex, const ChainstateManager& SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_CSV); SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_SEGWIT); SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TESTDUMMY); - SoftForkDescPushBack(blockindex, softforks, chainman, Consensus::DEPLOYMENT_TAPROOT); return softforks; } } // anon namespace @@ -1415,7 +1414,8 @@ UniValue DeploymentInfo(const CBlockIndex* blockindex, const ChainstateManager& RPCHelpMan getdeploymentinfo() { return RPCHelpMan{"getdeploymentinfo", - "Returns an object containing various state info regarding deployments of consensus changes.", + "Returns an object containing various state info regarding deployments of consensus changes.\n" + "Consensus changes for which the new rules are enforced from genesis are not listed here.", { {"blockhash", RPCArg::Type::STR_HEX, RPCArg::Default{"hash of current chain tip"}, "The block hash at which to query deployment state"}, }, diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index b527e686a46..7320273e515 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -919,8 +919,14 @@ static RPCHelpMan getblocktemplate() result.pushKV("capabilities", std::move(aCaps)); UniValue aRules(UniValue::VARR); + // See getblocktemplate changes in BIP 9: + // ! indicates a more subtle change to the block structure or generation transaction + // Otherwise clients may assume the rule will not impact usage of the template as-is. aRules.push_back("csv"); - if (!fPreSegWit) aRules.push_back("!segwit"); + if (!fPreSegWit) { + aRules.push_back("!segwit"); + aRules.push_back("taproot"); + } if (consensusParams.signet_blocks) { // indicate to miner that they must understand signet rules // when attempting to mine with this template diff --git a/test/functional/mining_basic.py b/test/functional/mining_basic.py index fea7ced3752..a9f49794d2d 100755 --- a/test/functional/mining_basic.py +++ b/test/functional/mining_basic.py @@ -376,6 +376,9 @@ class MiningTest(BitcoinTestFramework): self.log.info("getblocktemplate: segwit rule must be set") assert_raises_rpc_error(-8, "getblocktemplate must be called with the segwit rule set", node.getblocktemplate, {}) + self.log.info("getblocktemplate: result should set the right rules") + assert_equal(['csv', '!segwit', 'taproot'], self.nodes[0].getblocktemplate(NORMAL_GBT_REQUEST_PARAMS)['rules']) + self.log.info("getblocktemplate: Test valid block") assert_template(node, block, None) diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py index 583edf6a8c9..04c34d8106f 100755 --- a/test/functional/rpc_blockchain.py +++ b/test/functional/rpc_blockchain.py @@ -238,19 +238,6 @@ class BlockchainTest(BitcoinTestFramework): }, 'active': False }, - 'taproot': { - 'type': 'bip9', - 'bip9': { - 'start_time': -1, - 'timeout': 9223372036854775807, - 'min_activation_height': 0, - 'status': 'active', - 'status_next': 'active', - 'since': 0, - }, - 'height': 0, - 'active': True - } } })