From 0de3923b06ed007c5e7dc6e698d9946db9d3ef92 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Wed, 21 Aug 2024 19:55:28 +0700 Subject: [PATCH 1/3] feat: bury fork mn_rr (masternode reward reallocation) --- src/chainparams.cpp | 49 ++++--------------- src/chainparamsbase.cpp | 2 +- src/consensus/params.h | 8 ++- src/deploymentinfo.cpp | 6 +-- src/rpc/blockchain.cpp | 2 +- src/test/block_reward_reallocation_tests.cpp | 12 +---- test/functional/feature_asset_locks.py | 11 +++-- test/functional/feature_llmq_chainlocks.py | 4 +- test/functional/feature_llmq_evo.py | 8 +-- .../feature_llmq_is_cl_conflicts.py | 2 +- test/functional/rpc_blockchain.py | 12 +---- test/functional/test_framework/blocktools.py | 1 + .../test_framework/test_framework.py | 18 +------ 13 files changed, 38 insertions(+), 97 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 9b48ea2527..701f8e225b 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -193,7 +193,8 @@ public: consensus.DIP0024QuorumsHeight = 1738698; // 000000000000001aa25181e4c466e593992c98f9eb21c69ee757b8bb0af50244 consensus.V19Height = 1899072; // 0000000000000015e32e73052d663626327004c81c5c22cb8b42c361015c0eae consensus.V20Height = 1987776; // 000000000000001bf41cff06b76780050682ca29e61a91c391893d4745579777 - consensus.MinBIP9WarningHeight = 1987776 + 2016; // V20 activation height + miner confirmation window + consensus.MN_RRHeight = 2128896; // 0000000000000009a9696da93d3807eb14eb00a4ff449206d689156a21b27f26 + consensus.MinBIP9WarningHeight = 2128896 + 2016; // mn_rr activation height + miner confirmation window consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20 consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes @@ -208,16 +209,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_MN_RR].bit = 10; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nStartTime = 1704067200; // January 1, 2024 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nTimeout = 1767225600; // January 1, 2026 - // NOTE: nWindowSize for MN_RR __MUST__ be greater than or equal to nSuperblockMaturityWindow for CSuperblock::GetPaymentsLimit() to work correctly - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nWindowSize = 4032; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdStart = 3226; // 80% of 4032 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdMin = 2420; // 60% of 4032 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nFalloffCoeff = 5; // this corresponds to 10 periods - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].useEHF = true; - // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000988117deadb0db9cd5b8"); // 2109672 @@ -388,7 +379,8 @@ public: consensus.DIP0024QuorumsHeight = 770730; // 0000003c43b3ae7fffe61278ca5537a0e256ebf4d709d45f0ab040271074d51e consensus.V19Height = 850100; // 000004728b8ff2a16b9d4eebb0fd61eeffadc9c7fe4b0ec0b5a739869401ab5b consensus.V20Height = 905100; // 0000020c5e0f86f385cbf8e90210de9a9fd63633f01433bf47a6b3227a2851fd - consensus.MinBIP9WarningHeight = 905100 + 2016; // v19 activation height + miner confirmation window + consensus.MN_RRHeight = 1066900; // 000000d05d445958a9a4ad6bdc0f4bfb25af124b2326060703373ff2d3b397e9 + consensus.MinBIP9WarningHeight = 1066900 + 2016; // mn_rr activation height + miner confirmation window consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 20 consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes @@ -403,15 +395,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_MN_RR].bit = 10; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nStartTime = 1693526400; // Friday, September 1, 2023 0:00:00 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nWindowSize = 100; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdStart = 80; // 80% of 100 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdMin = 60; // 60% of 100 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nFalloffCoeff = 5; // this corresponds to 10 periods - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].useEHF = true; - // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000031779704a0f54b4"); // 1069875 @@ -557,7 +540,8 @@ public: consensus.DIP0024QuorumsHeight = 300; consensus.V19Height = 300; consensus.V20Height = 300; - consensus.MinBIP9WarningHeight = 300 + 2016; // v20 activation height + miner confirmation window + consensus.MN_RRHeight = 300; + consensus.MinBIP9WarningHeight = 300 + 2016; // mn_rr activation height + miner confirmation window consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1 consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes @@ -572,15 +556,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_MN_RR].bit = 10; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nStartTime = 1661990400; // Sep 1st, 2022 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nWindowSize = 120; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdStart = 80; // 80% of 100 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdMin = 60; // 60% of 100 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nFalloffCoeff = 5; // this corresponds to 10 periods - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].useEHF = true; - // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000000000000000"); @@ -790,6 +765,7 @@ public: consensus.DIP0024QuorumsHeight = 900; consensus.V19Height = 900; consensus.V20Height = 900; + consensus.MN_RRHeight = 900; consensus.MinBIP9WarningHeight = 0; consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); // ~uint256(0) >> 1 consensus.nPowTargetTimespan = 24 * 60 * 60; // Dash: 1 day @@ -806,15 +782,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_MN_RR].bit = 10; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nStartTime = 0; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nTimeout = Consensus::BIP9Deployment::NO_TIMEOUT; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nWindowSize = 12; - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdStart = 9; // 80% of 12 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nThresholdMin = 7; // 60% of 7 - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].nFalloffCoeff = 5; // this corresponds to 10 periods - consensus.vDeployments[Consensus::DEPLOYMENT_MN_RR].useEHF = true; - // The best chain should have at least this much work. consensus.nMinimumChainWork = uint256S("0x00"); @@ -1036,6 +1003,8 @@ static void MaybeUpdateHeights(const ArgsManager& args, Consensus::Params& conse consensus.DIP0020Height = int{height}; } else if (name == "v20") { consensus.V20Height = int{height}; + } else if (name == "mn_rr") { + consensus.MN_RRHeight = int{height}; } else { throw std::runtime_error(strprintf("Invalid name (%s) for -testactivationheight=name@height.", arg)); } diff --git a/src/chainparamsbase.cpp b/src/chainparamsbase.cpp index 4e2f7f8a4e..3426ead096 100644 --- a/src/chainparamsbase.cpp +++ b/src/chainparamsbase.cpp @@ -22,7 +22,7 @@ void SetupChainParamsBaseOptions(ArgsManager& argsman) argsman.AddArg("-dip3params=:", "Override DIP3 activation and enforcement heights (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS); argsman.AddArg("-dip8params=", "Override DIP8 activation height (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS); argsman.AddArg("-bip147height=", "Override BIP147 activation height (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CHAINPARAMS); - argsman.AddArg("-testactivationheight=name@height.", "Set the activation height of 'name' (bip147, bip34, dersig, cltv, csv, brr, dip0001, dip0008, dip0020, v20). (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); + argsman.AddArg("-testactivationheight=name@height.", "Set the activation height of 'name' (bip147, bip34, dersig, cltv, csv, brr, dip0001, dip0008, dip0020, v20, mn_rr). (regtest-only)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); argsman.AddArg("-highsubsidyblocks=", "The number of blocks with a higher than normal subsidy to mine at the start of a chain. Block after that height will have fixed subsidy base. (default: 0, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS); argsman.AddArg("-highsubsidyfactor=", "The factor to multiply the normal block subsidy by while in the highsubsidyblocks window of a chain (default: 1, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS); argsman.AddArg("-llmqchainlocks=", "Override the default LLMQ type used for ChainLocks. Allows using ChainLocks with smaller LLMQs. (default: llmq_devnet, devnet-only)", ArgsManager::ALLOW_ANY, OptionsCategory::CHAINPARAMS); diff --git a/src/consensus/params.h b/src/consensus/params.h index 2fbd5f4442..95918aa6db 100644 --- a/src/consensus/params.h +++ b/src/consensus/params.h @@ -33,12 +33,12 @@ enum BuriedDeployment : int16_t { DEPLOYMENT_BRR, DEPLOYMENT_V19, DEPLOYMENT_V20, + DEPLOYMENT_MN_RR, }; -constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_V20; } +constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_MN_RR; } enum DeploymentPos : uint16_t { DEPLOYMENT_TESTDUMMY, - DEPLOYMENT_MN_RR, // Deployment of Masternode Reward Location Reallocation // NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp MAX_VERSION_BITS_DEPLOYMENTS }; @@ -144,6 +144,8 @@ struct Params { int V19Height; /** Block height at which V20 (Deployment of EHF, LLMQ Randomness Beacon) becomes active */ int V20Height; + /** Block height at which MN_RR (Deployment of Masternode Reward Location Reallocation) becomes active */ + int MN_RRHeight; /** Don't warn about unknown BIP 9 activations below this height. * This prevents us from warning about the CSV and DIP activations. */ int MinBIP9WarningHeight; @@ -209,6 +211,8 @@ struct Params { return V19Height; case DEPLOYMENT_V20: return V20Height; + case DEPLOYMENT_MN_RR: + return MN_RRHeight; } // no default case, so the compiler can warn about missing cases return std::numeric_limits::max(); } diff --git a/src/deploymentinfo.cpp b/src/deploymentinfo.cpp index 5a0f86ef91..98ba9b3652 100644 --- a/src/deploymentinfo.cpp +++ b/src/deploymentinfo.cpp @@ -11,10 +11,6 @@ const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_B /*.name =*/ "testdummy", /*.gbt_force =*/ true, }, - { - /*.name =*/"mn_rr", - /*.gbt_force =*/true, - }, }; std::string DeploymentName(Consensus::BuriedDeployment dep) @@ -47,6 +43,8 @@ std::string DeploymentName(Consensus::BuriedDeployment dep) return "v19"; case Consensus::DEPLOYMENT_V20: return "v20"; + case Consensus::DEPLOYMENT_MN_RR: + return "mn_rr"; } // no default case, so the compiler can warn about missing cases return ""; } diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 4160636467..c62b0e8e6e 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1840,7 +1840,7 @@ RPCHelpMan getblockchaininfo() SoftForkDescPushBack(tip, softforks, consensusParams, Consensus::DEPLOYMENT_BRR); SoftForkDescPushBack(tip, softforks, consensusParams, Consensus::DEPLOYMENT_V19); SoftForkDescPushBack(tip, softforks, consensusParams, Consensus::DEPLOYMENT_V20); - SoftForkDescPushBack(tip, ehfSignals, softforks, consensusParams, Consensus::DEPLOYMENT_MN_RR); + SoftForkDescPushBack(tip, softforks, consensusParams, Consensus::DEPLOYMENT_MN_RR); SoftForkDescPushBack(tip, ehfSignals, softforks, consensusParams, Consensus::DEPLOYMENT_TESTDUMMY); obj.pushKV("softforks", softforks); diff --git a/src/test/block_reward_reallocation_tests.cpp b/src/test/block_reward_reallocation_tests.cpp index 4e9aa135f9..d42f9d3bce 100644 --- a/src/test/block_reward_reallocation_tests.cpp +++ b/src/test/block_reward_reallocation_tests.cpp @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -37,7 +36,7 @@ struct TestChainBRRBeforeActivationSetup : public TestChainSetup // Force fast DIP3 activation TestChainBRRBeforeActivationSetup() : TestChainSetup(497, {"-dip3params=30:50", "-testactivationheight=brr@1000", "-testactivationheight=v20@1200", - "-vbparams=mn_rr:0:999999999999:0:20:16:12:5:1"}) + "-testactivationheight=mn_rr@2200"}) { } }; @@ -230,8 +229,7 @@ BOOST_FIXTURE_TEST_CASE(block_reward_reallocation, TestChainBRRBeforeActivationS BOOST_CHECK_EQUAL(pblocktemplate->voutMasternodePayments[0].nValue, 14423624841); // 0.4999999999 } - // Reallocation should kick-in with the superblock mined at height = 2010, - // there will be 19 adjustments, 3 superblocks long each + // Reallocation should kick-in with the superblock after 19 adjustments, 3 superblocks long each for ([[maybe_unused]] auto i : irange::range(19)) { for ([[maybe_unused]] auto j : irange::range(3)) { for ([[maybe_unused]] auto k : irange::range(consensus_params.nSuperblockCycle)) { @@ -268,12 +266,6 @@ BOOST_FIXTURE_TEST_CASE(block_reward_reallocation, TestChainBRRBeforeActivationS } BOOST_CHECK(!DeploymentActiveAfter(m_node.chainman->ActiveChain().Tip(), consensus_params, Consensus::DEPLOYMENT_MN_RR)); - // Activate EHF "MN_RR" - { - LOCK(cs_main); - m_node.mnhf_manager->AddSignal(m_node.chainman->ActiveChain().Tip(), 10); - } - // Reward split should stay ~75/25 after reallocation is done, // check 10 next superblocks for ([[maybe_unused]] auto i : irange::range(10)) { diff --git a/test/functional/feature_asset_locks.py b/test/functional/feature_asset_locks.py index 5f0f03e77a..930415ee81 100755 --- a/test/functional/feature_asset_locks.py +++ b/test/functional/feature_asset_locks.py @@ -47,7 +47,11 @@ blocks_in_one_day = 576 class AssetLocksTest(DashTestFramework): def set_test_params(self): - self.set_dash_test_params(4, 2, [["-whitelist=127.0.0.1", "-llmqtestinstantsenddip0024=llmq_test_instantsend"]] * 4, evo_count=2) + self.set_dash_test_params(4, 2, [[ + "-whitelist=127.0.0.1", + "-llmqtestinstantsenddip0024=llmq_test_instantsend", + "-testactivationheight=mn_rr@2500", + ]] * 4, evo_count=2) def skip_test_if_missing_module(self): self.skip_if_no_wallet() @@ -626,8 +630,7 @@ class AssetLocksTest(DashTestFramework): def test_mn_rr(self, node_wallet, node, pubkey): self.log.info("Activate mn_rr...") locked = self.get_credit_pool_balance() - node.generate(12 - node.getblockcount() % 12) - self.activate_mn_rr(expected_activation_height=node.getblockcount() + 12 * 3) + self.activate_mn_rr(expected_activation_height=2500) self.log.info(f'height: {node.getblockcount()} credit: {self.get_credit_pool_balance()}') assert_equal(locked, self.get_credit_pool_balance()) @@ -639,7 +642,7 @@ class AssetLocksTest(DashTestFramework): all_mn_rewards = platform_reward + owner_reward + operator_reward assert_equal(all_mn_rewards, bt['coinbasevalue'] * 3 // 4) # 75/25 mn/miner reward split assert_equal(platform_reward, all_mn_rewards * 375 // 1000) # 0.375 platform share - assert_equal(platform_reward, 37015386) + assert_equal(platform_reward, 34371430) assert_equal(locked, self.get_credit_pool_balance()) node.generate(1) self.sync_all() diff --git a/test/functional/feature_llmq_chainlocks.py b/test/functional/feature_llmq_chainlocks.py index 49563bb46e..ab18e3824a 100755 --- a/test/functional/feature_llmq_chainlocks.py +++ b/test/functional/feature_llmq_chainlocks.py @@ -20,7 +20,7 @@ from test_framework.util import assert_equal, assert_raises_rpc_error, force_fin class LLMQChainLocksTest(DashTestFramework): def set_test_params(self): - self.set_dash_test_params(5, 4) + self.set_dash_test_params(5, 4, [["-testactivationheight=mn_rr@1100"]] * 5) def run_test(self): @@ -249,7 +249,7 @@ class LLMQChainLocksTest(DashTestFramework): self.log.info("Test that bestCLHeightDiff conditions are relaxed before mn_rr") self.test_bestCLHeightDiff(False) - self.activate_mn_rr() + self.activate_mn_rr(expected_activation_height=1100) self.log.info("Activated mn_rr at height:" + str(self.nodes[0].getblockcount())) self.log.info("Test that bestCLHeightDiff conditions are stricter after mn_rr") diff --git a/test/functional/feature_llmq_evo.py b/test/functional/feature_llmq_evo.py index a26f385995..234e880894 100755 --- a/test/functional/feature_llmq_evo.py +++ b/test/functional/feature_llmq_evo.py @@ -46,7 +46,7 @@ class TestP2PConn(P2PInterface): class LLMQEvoNodesTest(DashTestFramework): def set_test_params(self): - self.set_dash_test_params(5, 4, evo_count=5) + self.set_dash_test_params(5, 4, [["-testactivationheight=mn_rr@1200"]] * 5, evo_count=5) self.set_dash_llmq_test_params(4, 4) def run_test(self): @@ -112,11 +112,11 @@ class LLMQEvoNodesTest(DashTestFramework): self.test_evo_protx_are_in_mnlist(evo_protxhash_list) self.log.info("Test that EvoNodes are paid 4x blocks in a row") - self.test_evo_payments(window_analysis=48) + self.test_evo_payments(window_analysis=48, mnrr_active=False) self.test_masternode_winners() self.activate_mn_rr() - self.log.info("Activated MN RewardReallocation at height:" + str(self.nodes[0].getblockcount())) + self.log.info("Activated MN RewardReallocation, current height:" + str(self.nodes[0].getblockcount())) # Generate a few blocks to make EvoNode/MN analysis on a pure MN RewardReallocation window self.bump_mocktime(1) @@ -131,7 +131,7 @@ class LLMQEvoNodesTest(DashTestFramework): return - def test_evo_payments(self, window_analysis, mnrr_active=False): + def test_evo_payments(self, window_analysis, mnrr_active): current_evo = None consecutive_payments = 0 n_payments = 0 if mnrr_active else 4 diff --git a/test/functional/feature_llmq_is_cl_conflicts.py b/test/functional/feature_llmq_is_cl_conflicts.py index f7cf10cd13..333826f860 100755 --- a/test/functional/feature_llmq_is_cl_conflicts.py +++ b/test/functional/feature_llmq_is_cl_conflicts.py @@ -49,7 +49,7 @@ class TestP2PConn(P2PInterface): class LLMQ_IS_CL_Conflicts(DashTestFramework): def set_test_params(self): - self.set_dash_test_params(5, 4) + self.set_dash_test_params(5, 4, [["-testactivationheight=mn_rr@2000"]] * 5) self.set_dash_llmq_test_params(4, 4) self.supports_cli = False diff --git a/test/functional/rpc_blockchain.py b/test/functional/rpc_blockchain.py index c5720db513..c2b4fcf901 100755 --- a/test/functional/rpc_blockchain.py +++ b/test/functional/rpc_blockchain.py @@ -156,17 +156,7 @@ class BlockchainTest(BitcoinTestFramework): 'realloc': { 'type': 'buried', 'active': True, 'height': 1}, 'v19': { 'type': 'buried', 'active': False, 'height': 900}, 'v20': { 'type': 'buried', 'active': False, 'height': 900}, - 'mn_rr': { - 'type': 'bip9', - 'bip9': { - 'status': 'defined', - 'start_time': 0, - 'timeout': 9223372036854775807, - 'since': 0, - 'min_activation_height': 0, - 'ehf': True, - }, - 'active': False}, + 'mn_rr': { 'type': 'buried', 'active': False, 'height': 900}, 'testdummy': { 'type': 'bip9', 'bip9': { diff --git a/test/functional/test_framework/blocktools.py b/test/functional/test_framework/blocktools.py index e1e2244570..96ebd8cd9d 100644 --- a/test/functional/test_framework/blocktools.py +++ b/test/functional/test_framework/blocktools.py @@ -64,6 +64,7 @@ def create_block(hashprev=None, coinbase=None, ntime=None, *, version=None, tmpl block.calc_sha256() return block +# TODO: imlement MN_RR support here or remove it def create_block_with_mnpayments(mninfo, node, vtx=None, mn_payee=None, mn_amount=None): if vtx is None: vtx = [] diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index eebc89d266..5512a71a90 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -47,7 +47,6 @@ from .util import ( check_json_precision, copy_datadir, force_finish_mnsync, - get_bip9_details, get_datadir_path, initialize_datadir, p2p_port, @@ -1185,23 +1184,8 @@ class DashTestFramework(BitcoinTestFramework): def activate_v20(self, expected_activation_height=None): self.activate_by_name('v20', expected_activation_height) - def activate_ehf_by_name(self, name, expected_activation_height=None): - self.nodes[0].sporkupdate("SPORK_24_TEST_EHF", 0) - self.wait_for_sporks_same() - assert get_bip9_details(self.nodes[0], name)['ehf'] - ehf_height = 0 - while ehf_height == 0: - time.sleep(1) - try: - ehf_height = get_bip9_details(self.nodes[0], name)['ehf_height'] - except KeyError: - pass - self.nodes[0].generate(1) - self.sync_all() - self.activate_by_name(name, expected_activation_height) - def activate_mn_rr(self, expected_activation_height=None): - self.activate_ehf_by_name('mn_rr', expected_activation_height) + self.activate_by_name('mn_rr', expected_activation_height) def set_dash_llmq_test_params(self, llmq_size, llmq_threshold): self.llmq_size = llmq_size From da0dc06eea17f09802bbc485bc613ffc8b281200 Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Fri, 27 Sep 2024 13:44:04 +0700 Subject: [PATCH 2/3] perf: optimize feature_mnehf.py by generating less blocks --- test/functional/feature_mnehf.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/functional/feature_mnehf.py b/test/functional/feature_mnehf.py index 17eab92f15..865e99fa54 100755 --- a/test/functional/feature_mnehf.py +++ b/test/functional/feature_mnehf.py @@ -24,7 +24,7 @@ from test_framework.util import ( class MnehfTest(DashTestFramework): def set_test_params(self): - extra_args = [["-vbparams=testdummy:0:999999999999:0:12:12:12:5:1", "-persistmempool=0"] for _ in range(4)] + extra_args = [["-vbparams=testdummy:0:999999999999:0:4:4:4:5:1", "-persistmempool=0"] for _ in range(4)] self.set_dash_test_params(4, 3, extra_args=extra_args) def skip_test_if_missing_module(self): @@ -34,7 +34,7 @@ class MnehfTest(DashTestFramework): for inode in range(self.num_nodes): self.log.info(f"Restart node {inode} with {self.extra_args[inode]}") if params is not None: - self.extra_args[inode][0] = f"-vbparams=testdummy:{params[0]}:{params[1]}:0:12:12:12:5:1" + self.extra_args[inode][0] = f"-vbparams=testdummy:{params[0]}:{params[1]}:0:4:4:4:5:1" self.log.info(f"Actual restart options: {self.extra_args[inode]}") self.restart_node(0) @@ -169,7 +169,7 @@ class MnehfTest(DashTestFramework): self.log.info(f"mempool: {node.getmempoolinfo()}") assert_equal(node.getmempoolinfo()['size'], 0) - while (node.getblockcount() + 1) % 12 != 0: + while (node.getblockcount() + 1) % 4 != 0: self.check_fork('defined') node.generate(1) self.sync_all() @@ -177,13 +177,13 @@ class MnehfTest(DashTestFramework): self.restart_all_nodes() - for _ in range(12): + for _ in range(4): self.check_fork('started') node.generate(1) self.sync_all() - for i in range(12): + for i in range(4): self.check_fork('locked_in') node.generate(1) self.sync_all() @@ -198,7 +198,7 @@ class MnehfTest(DashTestFramework): inode.invalidateblock(ehf_blockhash) self.log.info("Expecting for fork to be defined in next blocks because no MnEHF tx here") - for _ in range(12): + for _ in range(4): self.check_fork('defined') node.generate(1) self.sync_all() @@ -213,7 +213,7 @@ class MnehfTest(DashTestFramework): assert tx_sent_2 in node.getblock(ehf_blockhash_2)['tx'] self.log.info(f"Generate some more block to jump to `started` status") - for _ in range(12): + for _ in range(4): node.generate(1) self.check_fork('started') self.restart_all_nodes() @@ -260,7 +260,7 @@ class MnehfTest(DashTestFramework): assert ehf_tx_sent in block['tx'] self.check_fork('defined') - self.slowly_generate_batch(12 * 4) + self.slowly_generate_batch(4 * 4) self.check_fork('active') From 9a9d0d5b79d3886ce94985f01e9e59bfc5d4846c Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Thu, 19 Sep 2024 17:06:47 +0700 Subject: [PATCH 3/3] feat: drop SPORK 24 (EHF) so far as this feature works on testnet / mainnet --- src/llmq/context.cpp | 4 ++-- src/llmq/ehf_signals.cpp | 6 ++---- src/llmq/ehf_signals.h | 4 +--- src/spork.h | 3 +-- test/functional/feature_mnehf.py | 36 +++++++++----------------------- 5 files changed, 16 insertions(+), 37 deletions(-) diff --git a/src/llmq/context.cpp b/src/llmq/context.cpp index b460da82cc..aee90f9f8b 100644 --- a/src/llmq/context.cpp +++ b/src/llmq/context.cpp @@ -44,8 +44,8 @@ LLMQContext::LLMQContext(CChainState& chainstate, CConnman& connman, CDeterminis llmq::quorumInstantSendManager = std::make_unique(*llmq::chainLocksHandler, chainstate, connman, *qman, *sigman, *shareman, sporkman, mempool, mn_sync, peerman, is_masternode, unit_tests, wipe); return llmq::quorumInstantSendManager.get(); }()}, - ehfSignalsHandler{std::make_unique(chainstate, mnhfman, *sigman, *shareman, mempool, - *qman, sporkman, peerman)} + ehfSignalsHandler{ + std::make_unique(chainstate, mnhfman, *sigman, *shareman, mempool, *qman, peerman)} { } diff --git a/src/llmq/ehf_signals.cpp b/src/llmq/ehf_signals.cpp index bf84b8d65a..b5ec7a1e33 100644 --- a/src/llmq/ehf_signals.cpp +++ b/src/llmq/ehf_signals.cpp @@ -16,7 +16,6 @@ #include // g_txindex #include #include -#include #include #include @@ -25,14 +24,13 @@ namespace llmq { CEHFSignalsHandler::CEHFSignalsHandler(CChainState& chainstate, CMNHFManager& mnhfman, CSigningManager& sigman, CSigSharesManager& shareman, CTxMemPool& mempool, const CQuorumManager& qman, - const CSporkManager& sporkman, const std::unique_ptr& peerman) : + const std::unique_ptr& peerman) : chainstate(chainstate), mnhfman(mnhfman), sigman(sigman), shareman(shareman), mempool(mempool), qman(qman), - sporkman(sporkman), m_peerman(peerman) { sigman.RegisterRecoveredSigsListener(this); @@ -48,7 +46,7 @@ void CEHFSignalsHandler::UpdatedBlockTip(const CBlockIndex* const pindexNew, boo { if (!DeploymentActiveAfter(pindexNew, Params().GetConsensus(), Consensus::DEPLOYMENT_V20)) return; - if (!is_masternode || (Params().IsTestChain() && !sporkman.IsSporkActive(SPORK_24_TEST_EHF))) { + if (!is_masternode) { return; } diff --git a/src/llmq/ehf_signals.h b/src/llmq/ehf_signals.h index 3629ce2873..22a01cf3fe 100644 --- a/src/llmq/ehf_signals.h +++ b/src/llmq/ehf_signals.h @@ -12,7 +12,6 @@ class CBlockIndex; class CChainState; class CMNHFManager; -class CSporkManager; class CTxMemPool; class PeerManager; @@ -31,7 +30,6 @@ private: CSigSharesManager& shareman; CTxMemPool& mempool; const CQuorumManager& qman; - const CSporkManager& sporkman; const std::unique_ptr& m_peerman; /** @@ -42,7 +40,7 @@ private: public: explicit CEHFSignalsHandler(CChainState& chainstate, CMNHFManager& mnhfman, CSigningManager& sigman, CSigSharesManager& shareman, CTxMemPool& mempool, const CQuorumManager& qman, - const CSporkManager& sporkman, const std::unique_ptr& peerman); + const std::unique_ptr& peerman); ~CEHFSignalsHandler(); diff --git a/src/spork.h b/src/spork.h index 632e30d54a..d30afe3bba 100644 --- a/src/spork.h +++ b/src/spork.h @@ -42,7 +42,7 @@ enum SporkId : int32_t { SPORK_19_CHAINLOCKS_ENABLED = 10018, SPORK_21_QUORUM_ALL_CONNECTED = 10020, SPORK_23_QUORUM_POSE = 10022, - SPORK_24_TEST_EHF = 10023, + // SPORK_24_DEPRECATED = 10023, SPORK_INVALID = -1, }; @@ -76,7 +76,6 @@ struct CSporkDef MAKE_SPORK_DEF(SPORK_19_CHAINLOCKS_ENABLED, 4070908800ULL), // OFF MAKE_SPORK_DEF(SPORK_21_QUORUM_ALL_CONNECTED, 4070908800ULL), // OFF MAKE_SPORK_DEF(SPORK_23_QUORUM_POSE, 4070908800ULL), // OFF - MAKE_SPORK_DEF(SPORK_24_TEST_EHF, 4070908800ULL), // OFF }; #undef MAKE_SPORK_DEF diff --git a/test/functional/feature_mnehf.py b/test/functional/feature_mnehf.py index 865e99fa54..23b9be066a 100755 --- a/test/functional/feature_mnehf.py +++ b/test/functional/feature_mnehf.py @@ -5,6 +5,7 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. import struct +import time from io import BytesIO from test_framework.authproxy import JSONRPCException @@ -45,15 +46,6 @@ class MnehfTest(DashTestFramework): for i in range(1, self.num_nodes): self.connect_nodes(i, 0) - def slowly_generate_batch(self, amount): - self.log.info(f"Slowly generate {amount} blocks") - while amount > 0: - self.log.info(f"Generating batch of blocks {amount} left") - next = min(10, amount) - amount -= next - self.bump_mocktime(next) - self.nodes[1].generate(next) - self.sync_all() def create_mnehf(self, versionBit, pubkey=None): # request ID = sha256("mnhf", versionBit) @@ -241,26 +233,18 @@ class MnehfTest(DashTestFramework): node.generate(1) self.sync_blocks() self.restart_all_nodes(params=[self.mocktime, self.mocktime + 1000000]) + self.check_fork('defined') + self.mine_quorum() - - ehf_tx_new_start = self.create_mnehf(28, pubkey) - - self.log.info("Test spork 24 (EHF)") - self.check_fork('defined') - self.nodes[0].sporkupdate("SPORK_24_TEST_EHF", 0) - self.wait_for_sporks_same() - self.check_fork('defined') - self.log.info("Mine one block and ensure EHF tx for the new deployment is mined") - ehf_tx_sent = self.send_tx(ehf_tx_new_start) - tip_blockhash = node.generate(1)[0] - self.sync_all() - block = node.getblock(tip_blockhash) - assert ehf_tx_sent in block['tx'] - - self.check_fork('defined') - self.slowly_generate_batch(4 * 4) + self.log.info("Waiting a bit to make EHF activating...") + self.mine_quorum() + for _ in range(4 * 4): + time.sleep(1) + self.bump_mocktime(1) + self.nodes[1].generate(1) + self.sync_all() self.check_fork('active')