From c268632ec98b5f23fae1b48c7bfe9c448d5c3af7 Mon Sep 17 00:00:00 2001 From: pasta Date: Fri, 11 Feb 2022 13:53:12 +0700 Subject: [PATCH 1/3] feat: introduce devnetVersion as a method for breaking changes to devnets include devnetVersion in expected version for devnet connections --- src/chainparams.cpp | 11 ++++++----- src/chainparams.h | 2 ++ src/init.cpp | 2 +- src/net_processing.cpp | 5 +++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index de2ec7b9ea03..40dfea1ee503 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -43,7 +43,7 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi return genesis; } -static CBlock CreateDevNetGenesisBlock(const uint256 &prevBlockHash, const std::string& devNetName, uint32_t nTime, uint32_t nNonce, uint32_t nBits, const CAmount& genesisReward) +static CBlock CreateDevNetGenesisBlock(const uint256 &prevBlockHash, const std::string& devNetName, int devnet_version, uint32_t nTime, uint32_t nNonce, uint32_t nBits, const CAmount& genesisReward) { assert(!devNetName.empty()); @@ -52,7 +52,7 @@ static CBlock CreateDevNetGenesisBlock(const uint256 &prevBlockHash, const std:: txNew.vin.resize(1); txNew.vout.resize(1); // put height (BIP34) and devnet name into coinbase - txNew.vin[0].scriptSig = CScript() << 1 << std::vector(devNetName.begin(), devNetName.end()); + txNew.vin[0].scriptSig = CScript() << 1 << std::vector(devNetName.begin(), devNetName.end()) << devnet_version; txNew.vout[0].nValue = genesisReward; txNew.vout[0].scriptPubKey = CScript() << OP_RETURN; @@ -85,12 +85,12 @@ static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward); } -static CBlock FindDevNetGenesisBlock(const CBlock &prevBlock, const CAmount& reward) +static CBlock FindDevNetGenesisBlock(const CBlock &prevBlock, const CAmount& reward, int devnet_version) { std::string devNetName = gArgs.GetDevNetName(); assert(!devNetName.empty()); - CBlock block = CreateDevNetGenesisBlock(prevBlock.GetHash(), devNetName, prevBlock.nTime + 1, 0, prevBlock.nBits, reward); + CBlock block = CreateDevNetGenesisBlock(prevBlock.GetHash(), devNetName, devnet_version, prevBlock.nTime + 1, 0, prevBlock.nBits, reward); arith_uint256 bnTarget; bnTarget.SetCompact(block.nBits); @@ -682,7 +682,8 @@ class CDevNetParams : public CChainParams { assert(consensus.hashGenesisBlock == uint256S("0x000008ca1832a4baf228eb1553c03d3a2c8e02399550dd6ea8d65cec3ef23d2e")); assert(genesis.hashMerkleRoot == uint256S("0xe0028eb9648db56b1ac77cf090b99048a8007e2bb64b68f092c03c7f56a662c7")); - devnetGenesis = FindDevNetGenesisBlock(genesis, 50 * COIN); + devnetVersion = 1; // This should be bumped every time there is some breaking change to devnets + devnetGenesis = FindDevNetGenesisBlock(genesis, /*reward=*/50 * COIN, /*devnet_version=*/devnetVersion); consensus.hashDevnetGenesisBlock = devnetGenesis.GetHash(); vFixedSeeds.clear(); diff --git a/src/chainparams.h b/src/chainparams.h index 48560caa4a1d..cedab597757d 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -64,6 +64,7 @@ class CChainParams const CBlock& GenesisBlock() const { return genesis; } const CBlock& DevNetGenesisBlock() const { return devnetGenesis; } + int DevNetVersion() const { return devnetVersion; } /** Default value for -checkmempool and -checkblockindex argument */ bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; } /** Policy: Filter transactions that do not match well-defined patterns */ @@ -124,6 +125,7 @@ class CChainParams std::string strNetworkID; CBlock genesis; CBlock devnetGenesis; + int devnetVersion; std::vector vFixedSeeds; bool fDefaultConsistencyChecks; bool fRequireStandard; diff --git a/src/init.cpp b/src/init.cpp index 4ceb288b7611..fd293d12600b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1775,7 +1775,7 @@ bool AppInitMain(InitInterfaces& interfaces) if (chainparams.NetworkIDString() == CBaseChainParams::DEVNET) { // Add devnet name to user agent. This allows to disconnect nodes immediately if they don't belong to our own devnet - uacomments.push_back(strprintf("devnet.%s", gArgs.GetDevNetName())); + uacomments.push_back(strprintf("devnet.%d.%s", chainparams.DevNetVersion(), gArgs.GetDevNetName())); } for (const std::string& cmt : gArgs.GetArgs("-uacomment")) { diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 5f5360fa6631..08e4e08dabea 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -2513,9 +2513,10 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr PushNodeVersion(pfrom, connman, GetAdjustedTime()); if (Params().NetworkIDString() == CBaseChainParams::DEVNET) { - if (cleanSubVer.find(strprintf("devnet.%s", gArgs.GetDevNetName())) == std::string::npos) { + auto expected_version = strprintf("devnet.%d.%s", Params().DevNetVersion(), gArgs.GetDevNetName()); + if (cleanSubVer.find(expected_version) == std::string::npos) { LOCK(cs_main); - LogPrintf("connected to wrong devnet. Reported version is %s, expected devnet name is %s\n", cleanSubVer, gArgs.GetDevNetName()); + LogPrintf("connected to wrong devnet. Reported version is %s, expected devnet name is %s\n", cleanSubVer, expected_version); if (!pfrom->fInbound) Misbehaving(pfrom->GetId(), 100); // don't try to connect again else From de681538d4bd9707cde06f87778173b027df02a3 Mon Sep 17 00:00:00 2001 From: pasta Date: Fri, 11 Feb 2022 14:50:20 +0700 Subject: [PATCH 2/3] feat: always use DGW on devnets --- src/chainparams.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 40dfea1ee503..32f3fabde6d9 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -593,8 +593,8 @@ class CDevNetParams : public CChainParams { consensus.nPowTargetSpacing = 2.5 * 60; // Dash: 2.5 minutes consensus.fPowAllowMinDifficultyBlocks = true; consensus.fPowNoRetargeting = false; - consensus.nPowKGWHeight = 4001; // nPowKGWHeight >= nPowDGWHeight means "no KGW" - consensus.nPowDGWHeight = 4001; + consensus.nPowKGWHeight = 0; // nPowKGWHeight >= nPowDGWHeight means "no KGW" + consensus.nPowDGWHeight = 0; consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28; From 746f51656c2dd6f7f9feebb7d17bcaa801b16fa7 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 12 Feb 2022 15:21:30 +0300 Subject: [PATCH 3/3] fix p2p_connect_to_devnet.py --- test/functional/test_framework/mininode.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/functional/test_framework/mininode.py b/test/functional/test_framework/mininode.py index 24fe3680dc81..e000f16a19f5 100755 --- a/test/functional/test_framework/mininode.py +++ b/test/functional/test_framework/mininode.py @@ -157,10 +157,11 @@ def peer_connect(self, dstaddr, dstport, *, net, uacomment=None): if net == "devnet": devnet_name = "devnet1" # see initialize_datadir() + devnet_version = 1 if self.uacomment is None: - self.strSubVer = MY_SUBVERSION % ("(devnet.devnet-%s)" % devnet_name).encode() + self.strSubVer = MY_SUBVERSION % ("(devnet.%d.devnet-%s)" % (devnet_version, devnet_name)).encode() else: - self.strSubVer = MY_SUBVERSION % ("(devnet.devnet-%s,%s)" % (devnet_name, self.uacomment)).encode() + self.strSubVer = MY_SUBVERSION % ("(devnet.%d.devnet-%s,%s)" % (devnet_version, devnet_name, self.uacomment)).encode() elif self.uacomment is not None: self.strSubVer = MY_SUBVERSION % ("(%s)" % self.uacomment).encode() else: