diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py --- a/contrib/seeds/generate-seeds.py +++ b/contrib/seeds/generate-seeds.py @@ -22,14 +22,14 @@ The output will be two data structures with the peers in binary format: - static SeedSpec6 pnSeed6_main[]={ + static std::vector pnSeed6_main = { ... } - static SeedSpec6 pnSeed6_test[]={ + static std::vector pnSeed6_test = { ... } -These should be pasted into `src/chainparamsseeds.h`. +These should be pasted into `src/chainparamsseeds.cpp`. ''' from base64 import b32decode @@ -97,8 +97,8 @@ return (host, port) -def process_nodes(g, f, structname, defaultport): - g.write('static SeedSpec6 {}[] = {{\n'.format(structname)) +def process_nodes(g, f, structname, defaultport, chainparamsclass): + g.write('static std::vector {} = {{\n'.format(structname)) first = True for line in f: comment = line.find('#') @@ -115,6 +115,10 @@ hoststr = ','.join(('0x{:02x}'.format(b)) for b in host) g.write(' {{{{{}}}, {}}}'.format(hoststr, port)) g.write('\n};\n') + g.write('const std::vector &{}::FixedSeeds() const {{\n'.format( + chainparamsclass)) + g.write(' return {};\n'.format(structname)) + g.write('}\n') def main(): @@ -126,8 +130,7 @@ sys.exit(1) g = sys.stdout indir = sys.argv[1] - g.write('#ifndef BITCOIN_CHAINPARAMSSEEDS_H\n') - g.write('#define BITCOIN_CHAINPARAMSSEEDS_H\n') + g.write('#include \n') g.write('/**\n') g.write(' * List of fixed seed nodes for the bitcoin network\n') g.write(' * @{} by contrib/seeds/generate-seeds.py\n'.format('generated')) @@ -137,11 +140,10 @@ ' * IPv4 as well as onion addresses are wrapped inside an IPv6 address accordingly.\n') g.write(' */\n') with open(os.path.join(indir, 'nodes_main.txt'), 'r', encoding="utf8") as f: - process_nodes(g, f, 'pnSeed6_main', 8333) + process_nodes(g, f, 'pnSeed6_main', 8333, 'CMainParams') g.write('\n') with open(os.path.join(indir, 'nodes_test.txt'), 'r', encoding="utf8") as f: - process_nodes(g, f, 'pnSeed6_test', 18333) - g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n') + process_nodes(g, f, 'pnSeed6_test', 18333, 'CTestNetParams') if __name__ == '__main__': diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -427,9 +427,9 @@ endfunction() add_network_sources(NETWORK_SOURCES + chainparamsconstants.cpp checkpoints.cpp network.cpp - chainparamsconstants.cpp ) # More completely unrelated features shared by all executables. @@ -442,6 +442,7 @@ cashaddrenc.cpp chainparams.cpp chainparamsconstants.cpp + chainparamsseeds.cpp config.cpp consensus/merkle.cpp coins.cpp diff --git a/src/chainparams.h b/src/chainparams.h --- a/src/chainparams.h +++ b/src/chainparams.h @@ -37,6 +37,8 @@ double dTxRate; }; +static std::vector EMPTY_FIXED_SEEDS = {}; + /** * CChainParams defines various tweakable parameters of a given instance of the * Bitcoin system. There are three: the main network on which people trade goods @@ -46,6 +48,8 @@ */ class CChainParams { public: + virtual ~CChainParams() {} + enum Base58Type { PUBKEY_ADDRESS, SCRIPT_ADDRESS, @@ -90,7 +94,9 @@ return base58Prefixes[type]; } const std::string &CashAddrPrefix() const { return cashaddrPrefix; } - const std::vector &FixedSeeds() const { return vFixedSeeds; } + virtual const std::vector &FixedSeeds() const { + return EMPTY_FIXED_SEEDS; + } const CCheckpointData &Checkpoints() const { return checkpointData; } const ChainTxData &TxData() const { return chainTxData; } @@ -109,7 +115,6 @@ std::string cashaddrPrefix; std::string strNetworkID; CBlock genesis; - std::vector vFixedSeeds; bool fDefaultConsistencyChecks; bool fRequireStandard; bool m_is_test_chain; @@ -118,6 +123,23 @@ ChainTxData chainTxData; }; +class CMainParams : public CChainParams { +public: + CMainParams(); + const std::vector &FixedSeeds() const override; +}; + +class CTestNetParams : public CChainParams { +public: + CTestNetParams(); + const std::vector &FixedSeeds() const override; +}; + +class CRegTestParams : public CChainParams { +public: + CRegTestParams(); +}; + /** * Creates and returns a std::unique_ptr of the chosen chain. * @returns a CChainParams* of the chosen chain. diff --git a/src/chainparams.cpp b/src/chainparams.cpp --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -7,7 +7,6 @@ #include #include -#include #include #include #include @@ -73,407 +72,390 @@ /** * Main network */ -class CMainParams : public CChainParams { -public: - CMainParams() { - strNetworkID = CBaseChainParams::MAIN; - consensus.nSubsidyHalvingInterval = 210000; - // 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - - // April 1, 2012 - consensus.BIP16Height = 173805; - consensus.BIP34Height = 227931; - consensus.BIP34Hash = BlockHash::fromHex( - "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); - // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 - consensus.BIP65Height = 388381; - // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 - consensus.BIP66Height = 363725; - // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5 - consensus.CSVHeight = 419328; - consensus.powLimit = uint256S( - "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - // two weeks - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; - consensus.nPowTargetSpacing = 10 * 60; - consensus.fPowAllowMinDifficultyBlocks = false; - consensus.fPowNoRetargeting = false; - - // two days - consensus.nDAAHalfLife = 2 * 24 * 60 * 60; - - // nPowTargetTimespan / nPowTargetSpacing - consensus.nMinerConfirmationWindow = 2016; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { - .bit = 28, - // 95% of 2016 - .nActivationThreshold = 1916, - // January 1, 2008 - .nStartTime = 1199145601, - // December 31, 2008 - .nTimeout = 1230767999, - }; - - // The miner fund is enabled by default on mainnet. - consensus.enableMinerFund = ENABLE_MINER_FUND; - - // The best chain should have at least this much work. - consensus.nMinimumChainWork = - ChainParamsConstants::MAINNET_MINIMUM_CHAIN_WORK; - - // By default assume that the signatures in ancestors of this block are - // valid. - consensus.defaultAssumeValid = - ChainParamsConstants::MAINNET_DEFAULT_ASSUME_VALID; - - // August 1, 2017 hard fork - consensus.uahfHeight = 478558; - - // November 13, 2017 hard fork - consensus.daaHeight = 504031; - - // November 15, 2018 hard fork - consensus.magneticAnomalyHeight = 556766; - - // November 15, 2019 protocol upgrade - consensus.gravitonHeight = 609135; - - // May 15, 2020 12:00:00 UTC protocol upgrade - consensus.phononHeight = 635258; - - // Nov 15, 2020 12:00:00 UTC protocol upgrade - consensus.axionActivationTime = 1605441600; - - // May 15, 2021 12:00:00 UTC protocol upgrade - consensus.tachyonActivationTime = 1621080000; - - /** - * The message start string is designed to be unlikely to occur in - * normal data. The characters are rarely used upper ASCII, not valid as - * UTF-8, and produce a large 32-bit integer with any alignment. - */ - diskMagic[0] = 0xf9; - diskMagic[1] = 0xbe; - diskMagic[2] = 0xb4; - diskMagic[3] = 0xd9; - netMagic[0] = 0xe3; - netMagic[1] = 0xe1; - netMagic[2] = 0xf3; - netMagic[3] = 0xe8; - nDefaultPort = 8333; - nPruneAfterHeight = 100000; - m_assumed_blockchain_size = - ChainParamsConstants::MAINNET_ASSUMED_BLOCKCHAIN_SIZE; - m_assumed_chain_state_size = - ChainParamsConstants::MAINNET_ASSUMED_CHAINSTATE_SIZE; - - genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, - 50 * COIN); - consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == - uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1" - "b60a8ce26f")); - assert(genesis.hashMerkleRoot == - uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" - "7afdeda33b")); - - // Note that of those which support the service bits prefix, most only - // support a subset of possible options. This is fine at runtime as - // we'll fall back to using them as a oneshot if they don't support the - // service bits we want, but we should get them updated to support all - // service bits wanted by any release ASAP to avoid it where possible. - // Bitcoin ABC seeder - vSeeds.emplace_back("seed.bitcoinabc.org"); - // bitcoinforks seeders - vSeeds.emplace_back("seed-bch.bitcoinforks.org"); - // BU backed seeder - vSeeds.emplace_back("btccash-seeder.bitcoinunlimited.info"); - // Jason B. Cox - vSeeds.emplace_back("seeder.jasonbcox.com"); - // Amaury SÉCHET - vSeeds.emplace_back("seed.deadalnix.me"); - // BCHD - vSeeds.emplace_back("seed.bchd.cash"); - - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 0); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 5); - base58Prefixes[SECRET_KEY] = std::vector(1, 128); - base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E}; - base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4}; - cashaddrPrefix = "bitcoincash"; - - vFixedSeeds = std::vector( - pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main)); - - fDefaultConsistencyChecks = false; - fRequireStandard = true; - m_is_test_chain = false; - m_is_mockable_chain = false; - - checkpointData = CheckpointData(CBaseChainParams::MAIN); - - // Data as of block - // 000000000000000001d2ce557406b017a928be25ee98906397d339c3f68eec5d - // (height 523992). - chainTxData = ChainTxData{ - // UNIX timestamp of last known number of transactions. - 1522608016, - // Total number of transactions between genesis and that timestamp - // (the tx=... number in the ChainStateFlushed debug.log lines) - 248589038, - // Estimated number of transactions per second after that timestamp. - 3.2, - }; - } -}; +CMainParams::CMainParams() { + strNetworkID = CBaseChainParams::MAIN; + consensus.nSubsidyHalvingInterval = 210000; + // 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - + // April 1, 2012 + consensus.BIP16Height = 173805; + consensus.BIP34Height = 227931; + consensus.BIP34Hash = BlockHash::fromHex( + "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); + // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 + consensus.BIP65Height = 388381; + // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 + consensus.BIP66Height = 363725; + // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5 + consensus.CSVHeight = 419328; + consensus.powLimit = uint256S( + "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + // two weeks + consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; + consensus.nPowTargetSpacing = 10 * 60; + consensus.fPowAllowMinDifficultyBlocks = false; + consensus.fPowNoRetargeting = false; + + // two days + consensus.nDAAHalfLife = 2 * 24 * 60 * 60; + + // nPowTargetTimespan / nPowTargetSpacing + consensus.nMinerConfirmationWindow = 2016; + consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { + .bit = 28, + // 95% of 2016 + .nActivationThreshold = 1916, + // January 1, 2008 + .nStartTime = 1199145601, + // December 31, 2008 + .nTimeout = 1230767999, + }; + + // The miner fund is enabled by default on mainnet. + consensus.enableMinerFund = ENABLE_MINER_FUND; + + // The best chain should have at least this much work. + consensus.nMinimumChainWork = + ChainParamsConstants::MAINNET_MINIMUM_CHAIN_WORK; + + // By default assume that the signatures in ancestors of this block are + // valid. + consensus.defaultAssumeValid = + ChainParamsConstants::MAINNET_DEFAULT_ASSUME_VALID; + + // August 1, 2017 hard fork + consensus.uahfHeight = 478558; + + // November 13, 2017 hard fork + consensus.daaHeight = 504031; + + // November 15, 2018 hard fork + consensus.magneticAnomalyHeight = 556766; + + // November 15, 2019 protocol upgrade + consensus.gravitonHeight = 609135; + + // May 15, 2020 12:00:00 UTC protocol upgrade + consensus.phononHeight = 635258; + + // Nov 15, 2020 12:00:00 UTC protocol upgrade + consensus.axionActivationTime = 1605441600; + + // May 15, 2021 12:00:00 UTC protocol upgrade + consensus.tachyonActivationTime = 1621080000; + + /** + * The message start string is designed to be unlikely to occur in + * normal data. The characters are rarely used upper ASCII, not valid as + * UTF-8, and produce a large 32-bit integer with any alignment. + */ + diskMagic[0] = 0xf9; + diskMagic[1] = 0xbe; + diskMagic[2] = 0xb4; + diskMagic[3] = 0xd9; + netMagic[0] = 0xe3; + netMagic[1] = 0xe1; + netMagic[2] = 0xf3; + netMagic[3] = 0xe8; + nDefaultPort = 8333; + nPruneAfterHeight = 100000; + m_assumed_blockchain_size = + ChainParamsConstants::MAINNET_ASSUMED_BLOCKCHAIN_SIZE; + m_assumed_chain_state_size = + ChainParamsConstants::MAINNET_ASSUMED_CHAINSTATE_SIZE; + + genesis = + CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN); + consensus.hashGenesisBlock = genesis.GetHash(); + assert(consensus.hashGenesisBlock == + uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1" + "b60a8ce26f")); + assert(genesis.hashMerkleRoot == + uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" + "7afdeda33b")); + + // Note that of those which support the service bits prefix, most only + // support a subset of possible options. This is fine at runtime as + // we'll fall back to using them as a oneshot if they don't support the + // service bits we want, but we should get them updated to support all + // service bits wanted by any release ASAP to avoid it where possible. + // Bitcoin ABC seeder + vSeeds.emplace_back("seed.bitcoinabc.org"); + // bitcoinforks seeders + vSeeds.emplace_back("seed-bch.bitcoinforks.org"); + // BU backed seeder + vSeeds.emplace_back("btccash-seeder.bitcoinunlimited.info"); + // Jason B. Cox + vSeeds.emplace_back("seeder.jasonbcox.com"); + // Amaury SÉCHET + vSeeds.emplace_back("seed.deadalnix.me"); + // BCHD + vSeeds.emplace_back("seed.bchd.cash"); + + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 0); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 5); + base58Prefixes[SECRET_KEY] = std::vector(1, 128); + base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E}; + base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4}; + cashaddrPrefix = "bitcoincash"; + + fDefaultConsistencyChecks = false; + fRequireStandard = true; + m_is_test_chain = false; + m_is_mockable_chain = false; + + checkpointData = CheckpointData(CBaseChainParams::MAIN); + + // Data as of block + // 000000000000000001d2ce557406b017a928be25ee98906397d339c3f68eec5d + // (height 523992). + chainTxData = ChainTxData{ + // UNIX timestamp of last known number of transactions. + 1522608016, + // Total number of transactions between genesis and that timestamp + // (the tx=... number in the ChainStateFlushed debug.log lines) + 248589038, + // Estimated number of transactions per second after that timestamp. + 3.2, + }; +} /** * Testnet (v3) */ -class CTestNetParams : public CChainParams { -public: - CTestNetParams() { - strNetworkID = CBaseChainParams::TESTNET; - consensus.nSubsidyHalvingInterval = 210000; - // 00000000040b4e986385315e14bee30ad876d8b47f748025b26683116d21aa65 - consensus.BIP16Height = 514; - consensus.BIP34Height = 21111; - consensus.BIP34Hash = BlockHash::fromHex( - "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"); - // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 - consensus.BIP65Height = 581885; - // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 - consensus.BIP66Height = 330776; - // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb - consensus.CSVHeight = 770112; - consensus.powLimit = uint256S( - "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - // two weeks - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; - consensus.nPowTargetSpacing = 10 * 60; - consensus.fPowAllowMinDifficultyBlocks = true; - consensus.fPowNoRetargeting = false; - - // two days - consensus.nDAAHalfLife = 2 * 24 * 60 * 60; - - // nPowTargetTimespan / nPowTargetSpacing - consensus.nMinerConfirmationWindow = 2016; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { - .bit = 28, - // 75% of 2016 - .nActivationThreshold = 1512, - // January 1, 2008 - .nStartTime = 1199145601, - // December 31, 2008 - .nTimeout = 1230767999, - }; - - // The miner fund is disabled by default on testnet. - consensus.enableMinerFund = false; - - // The best chain should have at least this much work. - consensus.nMinimumChainWork = - ChainParamsConstants::TESTNET_MINIMUM_CHAIN_WORK; - - // By default assume that the signatures in ancestors of this block are - // valid. - consensus.defaultAssumeValid = - ChainParamsConstants::TESTNET_DEFAULT_ASSUME_VALID; - - // August 1, 2017 hard fork - consensus.uahfHeight = 1155875; - - // November 13, 2017 hard fork - consensus.daaHeight = 1188697; - - // November 15, 2018 hard fork - consensus.magneticAnomalyHeight = 1267996; - - // November 15, 2019 protocol upgrade - consensus.gravitonHeight = 1341711; - - // May 15, 2020 12:00:00 UTC protocol upgrade - consensus.phononHeight = 1378460; - - // Nov 15, 2020 12:00:00 UTC protocol upgrade - consensus.axionActivationTime = 1605441600; - - // May 15, 2021 12:00:00 UTC protocol upgrade - consensus.tachyonActivationTime = 1621080000; - - diskMagic[0] = 0x0b; - diskMagic[1] = 0x11; - diskMagic[2] = 0x09; - diskMagic[3] = 0x07; - netMagic[0] = 0xf4; - netMagic[1] = 0xe5; - netMagic[2] = 0xf3; - netMagic[3] = 0xf4; - nDefaultPort = 18333; - nPruneAfterHeight = 1000; - m_assumed_blockchain_size = - ChainParamsConstants::TESTNET_ASSUMED_BLOCKCHAIN_SIZE; - m_assumed_chain_state_size = - ChainParamsConstants::TESTNET_ASSUMED_CHAINSTATE_SIZE; - - genesis = - CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); - consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == - uint256S("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526" - "f8d77f4943")); - assert(genesis.hashMerkleRoot == - uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" - "7afdeda33b")); - - vFixedSeeds.clear(); - vSeeds.clear(); - // nodes with support for servicebits filtering should be at the top - // Bitcoin ABC seeder - vSeeds.emplace_back("testnet-seed.bitcoinabc.org"); - // bitcoinforks seeders - vSeeds.emplace_back("testnet-seed-bch.bitcoinforks.org"); - // Amaury SÉCHET - vSeeds.emplace_back("testnet-seed.deadalnix.me"); - // BCHD - vSeeds.emplace_back("testnet-seed.bchd.cash"); - - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 111); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 196); - base58Prefixes[SECRET_KEY] = std::vector(1, 239); - base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; - base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; - cashaddrPrefix = "bchtest"; - vFixedSeeds = std::vector( - pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test)); - - fDefaultConsistencyChecks = false; - fRequireStandard = false; - m_is_test_chain = true; - m_is_mockable_chain = false; - - checkpointData = CheckpointData(CBaseChainParams::TESTNET); - - // Data as of block - // 000000000005b07ecf85563034d13efd81c1a29e47e22b20f4fc6919d5b09cd6 - // (height 1223263) - chainTxData = ChainTxData{1522608381, 15052068, 0.15}; - } -}; +CTestNetParams::CTestNetParams() { + strNetworkID = CBaseChainParams::TESTNET; + consensus.nSubsidyHalvingInterval = 210000; + // 00000000040b4e986385315e14bee30ad876d8b47f748025b26683116d21aa65 + consensus.BIP16Height = 514; + consensus.BIP34Height = 21111; + consensus.BIP34Hash = BlockHash::fromHex( + "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"); + // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 + consensus.BIP65Height = 581885; + // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 + consensus.BIP66Height = 330776; + // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb + consensus.CSVHeight = 770112; + consensus.powLimit = uint256S( + "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + // two weeks + consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; + consensus.nPowTargetSpacing = 10 * 60; + consensus.fPowAllowMinDifficultyBlocks = true; + consensus.fPowNoRetargeting = false; + + // two days + consensus.nDAAHalfLife = 2 * 24 * 60 * 60; + + // nPowTargetTimespan / nPowTargetSpacing + consensus.nMinerConfirmationWindow = 2016; + consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { + .bit = 28, + // 75% of 2016 + .nActivationThreshold = 1512, + // January 1, 2008 + .nStartTime = 1199145601, + // December 31, 2008 + .nTimeout = 1230767999, + }; + + // The miner fund is disabled by default on testnet. + consensus.enableMinerFund = false; + + // The best chain should have at least this much work. + consensus.nMinimumChainWork = + ChainParamsConstants::TESTNET_MINIMUM_CHAIN_WORK; + + // By default assume that the signatures in ancestors of this block are + // valid. + consensus.defaultAssumeValid = + ChainParamsConstants::TESTNET_DEFAULT_ASSUME_VALID; + + // August 1, 2017 hard fork + consensus.uahfHeight = 1155875; + + // November 13, 2017 hard fork + consensus.daaHeight = 1188697; + + // November 15, 2018 hard fork + consensus.magneticAnomalyHeight = 1267996; + + // November 15, 2019 protocol upgrade + consensus.gravitonHeight = 1341711; + + // May 15, 2020 12:00:00 UTC protocol upgrade + consensus.phononHeight = 1378460; + + // Nov 15, 2020 12:00:00 UTC protocol upgrade + consensus.axionActivationTime = 1605441600; + + // May 15, 2021 12:00:00 UTC protocol upgrade + consensus.tachyonActivationTime = 1621080000; + + diskMagic[0] = 0x0b; + diskMagic[1] = 0x11; + diskMagic[2] = 0x09; + diskMagic[3] = 0x07; + netMagic[0] = 0xf4; + netMagic[1] = 0xe5; + netMagic[2] = 0xf3; + netMagic[3] = 0xf4; + nDefaultPort = 18333; + nPruneAfterHeight = 1000; + m_assumed_blockchain_size = + ChainParamsConstants::TESTNET_ASSUMED_BLOCKCHAIN_SIZE; + m_assumed_chain_state_size = + ChainParamsConstants::TESTNET_ASSUMED_CHAINSTATE_SIZE; + + genesis = + CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); + consensus.hashGenesisBlock = genesis.GetHash(); + assert(consensus.hashGenesisBlock == + uint256S("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526" + "f8d77f4943")); + assert(genesis.hashMerkleRoot == + uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" + "7afdeda33b")); + + vSeeds.clear(); + // nodes with support for servicebits filtering should be at the top + // Bitcoin ABC seeder + vSeeds.emplace_back("testnet-seed.bitcoinabc.org"); + // bitcoinforks seeders + vSeeds.emplace_back("testnet-seed-bch.bitcoinforks.org"); + // Amaury SÉCHET + vSeeds.emplace_back("testnet-seed.deadalnix.me"); + // BCHD + vSeeds.emplace_back("testnet-seed.bchd.cash"); + + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 111); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 196); + base58Prefixes[SECRET_KEY] = std::vector(1, 239); + base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; + base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; + cashaddrPrefix = "bchtest"; + + fDefaultConsistencyChecks = false; + fRequireStandard = false; + m_is_test_chain = true; + m_is_mockable_chain = false; + + checkpointData = CheckpointData(CBaseChainParams::TESTNET); + + // Data as of block + // 000000000005b07ecf85563034d13efd81c1a29e47e22b20f4fc6919d5b09cd6 + // (height 1223263) + chainTxData = ChainTxData{1522608381, 15052068, 0.15}; +} /** * Regression test */ -class CRegTestParams : public CChainParams { -public: - CRegTestParams() { - strNetworkID = CBaseChainParams::REGTEST; - consensus.nSubsidyHalvingInterval = 150; - // always enforce P2SH BIP16 on regtest - consensus.BIP16Height = 0; - // BIP34 activated on regtest (Used in functional tests) - consensus.BIP34Height = 500; - consensus.BIP34Hash = BlockHash(); - // BIP65 activated on regtest (Used in functional tests) - consensus.BIP65Height = 1351; - // BIP66 activated on regtest (Used in functional tests) - consensus.BIP66Height = 1251; - // CSV activated on regtest (Used in functional tests) - consensus.CSVHeight = 576; - consensus.powLimit = uint256S( - "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - // two weeks - consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; - consensus.nPowTargetSpacing = 10 * 60; - consensus.fPowAllowMinDifficultyBlocks = true; - consensus.fPowNoRetargeting = true; - - // two days - consensus.nDAAHalfLife = 2 * 24 * 60 * 60; - - // Faster than normal for regtest (144 instead of 2016) - consensus.nMinerConfirmationWindow = 144; - consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { - .bit = 28, - // 75% of 144 - .nActivationThreshold = 108, - }; - - // The miner fund is disabled by default on regnet. - consensus.enableMinerFund = false; - - // The best chain should have at least this much work. - consensus.nMinimumChainWork = uint256S("0x00"); - - // By default assume that the signatures in ancestors of this block are - // valid. - consensus.defaultAssumeValid = BlockHash(); - - // UAHF is always enabled on regtest. - consensus.uahfHeight = 0; - - // November 13, 2017 hard fork is always on on regtest. - consensus.daaHeight = 0; - - // November 15, 2018 hard fork is always on on regtest. - consensus.magneticAnomalyHeight = 0; - - // November 15, 2019 protocol upgrade - consensus.gravitonHeight = 0; - - // May 15, 2020 12:00:00 UTC protocol upgrade - consensus.phononHeight = 0; - - // Nov 15, 2020 12:00:00 UTC protocol upgrade - consensus.axionActivationTime = 1605441600; - - // May 15, 2021 12:00:00 UTC protocol upgrade - consensus.tachyonActivationTime = 1621080000; - - diskMagic[0] = 0xfa; - diskMagic[1] = 0xbf; - diskMagic[2] = 0xb5; - diskMagic[3] = 0xda; - netMagic[0] = 0xda; - netMagic[1] = 0xb5; - netMagic[2] = 0xbf; - netMagic[3] = 0xfa; - nDefaultPort = 18444; - nPruneAfterHeight = 1000; - m_assumed_blockchain_size = 0; - m_assumed_chain_state_size = 0; - - genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); - consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == - uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b" - "1a11466e2206")); - assert(genesis.hashMerkleRoot == - uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab212" - "7b7afdeda33b")); - - //! Regtest mode doesn't have any fixed seeds. - vFixedSeeds.clear(); - //! Regtest mode doesn't have any DNS seeds. - vSeeds.clear(); - - fDefaultConsistencyChecks = true; - fRequireStandard = true; - m_is_test_chain = true; - m_is_mockable_chain = true; - - checkpointData = CheckpointData(CBaseChainParams::REGTEST); - - chainTxData = ChainTxData{0, 0, 0}; - - base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 111); - base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 196); - base58Prefixes[SECRET_KEY] = std::vector(1, 239); - base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; - base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; - cashaddrPrefix = "bchreg"; - } -}; +CRegTestParams::CRegTestParams() { + strNetworkID = CBaseChainParams::REGTEST; + consensus.nSubsidyHalvingInterval = 150; + // always enforce P2SH BIP16 on regtest + consensus.BIP16Height = 0; + // BIP34 activated on regtest (Used in functional tests) + consensus.BIP34Height = 500; + consensus.BIP34Hash = BlockHash(); + // BIP65 activated on regtest (Used in functional tests) + consensus.BIP65Height = 1351; + // BIP66 activated on regtest (Used in functional tests) + consensus.BIP66Height = 1251; + // CSV activated on regtest (Used in functional tests) + consensus.CSVHeight = 576; + consensus.powLimit = uint256S( + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + // two weeks + consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; + consensus.nPowTargetSpacing = 10 * 60; + consensus.fPowAllowMinDifficultyBlocks = true; + consensus.fPowNoRetargeting = true; + + // two days + consensus.nDAAHalfLife = 2 * 24 * 60 * 60; + + // Faster than normal for regtest (144 instead of 2016) + consensus.nMinerConfirmationWindow = 144; + consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { + .bit = 28, + // 75% of 144 + .nActivationThreshold = 108, + }; + + // The miner fund is disabled by default on regnet. + consensus.enableMinerFund = false; + + // The best chain should have at least this much work. + consensus.nMinimumChainWork = uint256S("0x00"); + + // By default assume that the signatures in ancestors of this block are + // valid. + consensus.defaultAssumeValid = BlockHash(); + + // UAHF is always enabled on regtest. + consensus.uahfHeight = 0; + + // November 13, 2017 hard fork is always on on regtest. + consensus.daaHeight = 0; + + // November 15, 2018 hard fork is always on on regtest. + consensus.magneticAnomalyHeight = 0; + + // November 15, 2019 protocol upgrade + consensus.gravitonHeight = 0; + + // May 15, 2020 12:00:00 UTC protocol upgrade + consensus.phononHeight = 0; + + // Nov 15, 2020 12:00:00 UTC protocol upgrade + consensus.axionActivationTime = 1605441600; + + // May 15, 2021 12:00:00 UTC protocol upgrade + consensus.tachyonActivationTime = 1621080000; + + diskMagic[0] = 0xfa; + diskMagic[1] = 0xbf; + diskMagic[2] = 0xb5; + diskMagic[3] = 0xda; + netMagic[0] = 0xda; + netMagic[1] = 0xb5; + netMagic[2] = 0xbf; + netMagic[3] = 0xfa; + nDefaultPort = 18444; + nPruneAfterHeight = 1000; + m_assumed_blockchain_size = 0; + m_assumed_chain_state_size = 0; + + genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); + consensus.hashGenesisBlock = genesis.GetHash(); + assert(consensus.hashGenesisBlock == + uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b" + "1a11466e2206")); + assert(genesis.hashMerkleRoot == + uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab212" + "7b7afdeda33b")); + + //! Regtest mode doesn't have any DNS seeds. + vSeeds.clear(); + + fDefaultConsistencyChecks = true; + fRequireStandard = true; + m_is_test_chain = true; + m_is_mockable_chain = true; + + checkpointData = CheckpointData(CBaseChainParams::REGTEST); + + chainTxData = ChainTxData{0, 0, 0}; + + base58Prefixes[PUBKEY_ADDRESS] = std::vector(1, 111); + base58Prefixes[SCRIPT_ADDRESS] = std::vector(1, 196); + base58Prefixes[SECRET_KEY] = std::vector(1, 239); + base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; + base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; + cashaddrPrefix = "bchreg"; +} static std::unique_ptr globalChainParams; diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.cpp rename from src/chainparamsseeds.h rename to src/chainparamsseeds.cpp --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.cpp @@ -1,5 +1,4 @@ -#ifndef BITCOIN_CHAINPARAMSSEEDS_H -#define BITCOIN_CHAINPARAMSSEEDS_H +#include /** * List of fixed seed nodes for the bitcoin network * @generated by contrib/seeds/generate-seeds.py @@ -7,7 +6,7 @@ * Each line contains a 16-byte IPv6 address and a port. * IPv4 as well as onion addresses are wrapped inside an IPv6 address accordingly. */ -static SeedSpec6 pnSeed6_main[] = { +static std::vector pnSeed6_main = { {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0d,0x5a,0x8d,0x0d}, 8333}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x78,0x09,0xd8}, 8333}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x19,0xf1,0xe0}, 8333}, @@ -94,8 +93,11 @@ {{0x2a,0x03,0x1b,0x20,0x00,0x01,0xf4,0x10,0x00,0x40,0x00,0x00,0x00,0x00,0xac,0xef}, 8333}, {{0x2a,0x04,0x21,0x80,0x00,0x01,0x00,0x11,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x16}, 8333} }; +const std::vector &CMainParams::FixedSeeds() const { + return pnSeed6_main; +} -static SeedSpec6 pnSeed6_test[] = { +static std::vector pnSeed6_test = { {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x03,0x89,0x44,0x8c}, 48433}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x8d,0x4f}, 18333}, {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x22,0xfd,0x33,0xeb}, 18333}, @@ -122,4 +124,6 @@ {{0x20,0x01,0x0b,0xc8,0x18,0x28,0x13,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 18433}, {{0x26,0x01,0x06,0x02,0x8d,0x80,0x0b,0x63,0xdc,0x6d,0x61,0xff,0xfe,0x9f,0x7f,0x29}, 18333} }; -#endif // BITCOIN_CHAINPARAMSSEEDS_H +const std::vector &CTestNetParams::FixedSeeds() const { + return pnSeed6_test; +}