Changeset View
Changeset View
Standalone View
Standalone View
src/chainparams.cpp
// Copyright (c) 2010 Satoshi Nakamoto | // Copyright (c) 2010 Satoshi Nakamoto | ||||
// Copyright (c) 2009-2016 The Bitcoin Core developers | // Copyright (c) 2009-2016 The Bitcoin Core developers | ||||
// Copyright (c) 2017-2020 The Bitcoin developers | // Copyright (c) 2017-2020 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <chainparams.h> | #include <chainparams.h> | ||||
#include <chainparamsconstants.h> | #include <chainparamsconstants.h> | ||||
#include <chainparamsseeds.h> | |||||
#include <consensus/merkle.h> | #include <consensus/merkle.h> | ||||
#include <network.h> | #include <network.h> | ||||
#include <tinyformat.h> | #include <tinyformat.h> | ||||
#include <util/strencodings.h> | #include <util/strencodings.h> | ||||
#include <util/system.h> | #include <util/system.h> | ||||
#include <cassert> | #include <cassert> | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | const CScript genesisOutputScript = | ||||
<< OP_CHECKSIG; | << OP_CHECKSIG; | ||||
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, | return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, | ||||
nBits, nVersion, genesisReward); | nBits, nVersion, genesisReward); | ||||
} | } | ||||
/** | /** | ||||
* Main network | * Main network | ||||
*/ | */ | ||||
class CMainParams : public CChainParams { | CMainParams::CMainParams() { | ||||
public: | |||||
CMainParams() { | |||||
strNetworkID = CBaseChainParams::MAIN; | strNetworkID = CBaseChainParams::MAIN; | ||||
consensus.nSubsidyHalvingInterval = 210000; | consensus.nSubsidyHalvingInterval = 210000; | ||||
// 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - | // 00000000000000ce80a7e057163a4db1d5ad7b20fb6f598c9597b9665c8fb0d4 - | ||||
// April 1, 2012 | // April 1, 2012 | ||||
consensus.BIP16Height = 173805; | consensus.BIP16Height = 173805; | ||||
consensus.BIP34Height = 227931; | consensus.BIP34Height = 227931; | ||||
consensus.BIP34Hash = BlockHash::fromHex( | consensus.BIP34Hash = BlockHash::fromHex( | ||||
"000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); | "000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8"); | ||||
// 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 | // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 | ||||
consensus.BIP65Height = 388381; | consensus.BIP65Height = 388381; | ||||
// 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 | // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 | ||||
consensus.BIP66Height = 363725; | consensus.BIP66Height = 363725; | ||||
// 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5 | // 000000000000000004a1b34462cb8aeebd5799177f7a29cf28f2d1961716b5b5 | ||||
consensus.CSVHeight = 419328; | consensus.CSVHeight = 419328; | ||||
consensus.powLimit = uint256S( | consensus.powLimit = uint256S( | ||||
"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
// two weeks | // two weeks | ||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | ||||
consensus.nPowTargetSpacing = 10 * 60; | consensus.nPowTargetSpacing = 10 * 60; | ||||
consensus.fPowAllowMinDifficultyBlocks = false; | consensus.fPowAllowMinDifficultyBlocks = false; | ||||
consensus.fPowNoRetargeting = false; | consensus.fPowNoRetargeting = false; | ||||
// two days | // two days | ||||
consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | ||||
// nPowTargetTimespan / nPowTargetSpacing | // nPowTargetTimespan / nPowTargetSpacing | ||||
consensus.nMinerConfirmationWindow = 2016; | consensus.nMinerConfirmationWindow = 2016; | ||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | ||||
.bit = 28, | .bit = 28, | ||||
// 95% of 2016 | // 95% of 2016 | ||||
.nActivationThreshold = 1916, | .nActivationThreshold = 1916, | ||||
// January 1, 2008 | // January 1, 2008 | ||||
.nStartTime = 1199145601, | .nStartTime = 1199145601, | ||||
// December 31, 2008 | // December 31, 2008 | ||||
.nTimeout = 1230767999, | .nTimeout = 1230767999, | ||||
}; | }; | ||||
// The miner fund is enabled by default on mainnet. | // The miner fund is enabled by default on mainnet. | ||||
consensus.enableMinerFund = ENABLE_MINER_FUND; | consensus.enableMinerFund = ENABLE_MINER_FUND; | ||||
// The best chain should have at least this much work. | // The best chain should have at least this much work. | ||||
consensus.nMinimumChainWork = | consensus.nMinimumChainWork = | ||||
ChainParamsConstants::MAINNET_MINIMUM_CHAIN_WORK; | ChainParamsConstants::MAINNET_MINIMUM_CHAIN_WORK; | ||||
// By default assume that the signatures in ancestors of this block are | // By default assume that the signatures in ancestors of this block are | ||||
// valid. | // valid. | ||||
consensus.defaultAssumeValid = | consensus.defaultAssumeValid = | ||||
ChainParamsConstants::MAINNET_DEFAULT_ASSUME_VALID; | ChainParamsConstants::MAINNET_DEFAULT_ASSUME_VALID; | ||||
// August 1, 2017 hard fork | // August 1, 2017 hard fork | ||||
consensus.uahfHeight = 478558; | consensus.uahfHeight = 478558; | ||||
// November 13, 2017 hard fork | // November 13, 2017 hard fork | ||||
consensus.daaHeight = 504031; | consensus.daaHeight = 504031; | ||||
// November 15, 2018 hard fork | // November 15, 2018 hard fork | ||||
consensus.magneticAnomalyHeight = 556766; | consensus.magneticAnomalyHeight = 556766; | ||||
// November 15, 2019 protocol upgrade | // November 15, 2019 protocol upgrade | ||||
consensus.gravitonHeight = 609135; | consensus.gravitonHeight = 609135; | ||||
// May 15, 2020 12:00:00 UTC protocol upgrade | // May 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.phononHeight = 635258; | consensus.phononHeight = 635258; | ||||
// Nov 15, 2020 12:00:00 UTC protocol upgrade | // Nov 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.axionActivationTime = 1605441600; | consensus.axionActivationTime = 1605441600; | ||||
// May 15, 2021 12:00:00 UTC protocol upgrade | // May 15, 2021 12:00:00 UTC protocol upgrade | ||||
consensus.tachyonActivationTime = 1621080000; | consensus.tachyonActivationTime = 1621080000; | ||||
/** | /** | ||||
* The message start string is designed to be unlikely to occur in | * The message start string is designed to be unlikely to occur in | ||||
* normal data. The characters are rarely used upper ASCII, not valid as | * normal data. The characters are rarely used upper ASCII, not valid as | ||||
* UTF-8, and produce a large 32-bit integer with any alignment. | * UTF-8, and produce a large 32-bit integer with any alignment. | ||||
*/ | */ | ||||
diskMagic[0] = 0xf9; | diskMagic[0] = 0xf9; | ||||
diskMagic[1] = 0xbe; | diskMagic[1] = 0xbe; | ||||
diskMagic[2] = 0xb4; | diskMagic[2] = 0xb4; | ||||
diskMagic[3] = 0xd9; | diskMagic[3] = 0xd9; | ||||
netMagic[0] = 0xe3; | netMagic[0] = 0xe3; | ||||
netMagic[1] = 0xe1; | netMagic[1] = 0xe1; | ||||
netMagic[2] = 0xf3; | netMagic[2] = 0xf3; | ||||
netMagic[3] = 0xe8; | netMagic[3] = 0xe8; | ||||
nDefaultPort = 8333; | nDefaultPort = 8333; | ||||
nPruneAfterHeight = 100000; | nPruneAfterHeight = 100000; | ||||
m_assumed_blockchain_size = | m_assumed_blockchain_size = | ||||
ChainParamsConstants::MAINNET_ASSUMED_BLOCKCHAIN_SIZE; | ChainParamsConstants::MAINNET_ASSUMED_BLOCKCHAIN_SIZE; | ||||
m_assumed_chain_state_size = | m_assumed_chain_state_size = | ||||
ChainParamsConstants::MAINNET_ASSUMED_CHAINSTATE_SIZE; | ChainParamsConstants::MAINNET_ASSUMED_CHAINSTATE_SIZE; | ||||
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, | genesis = | ||||
50 * COIN); | CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN); | ||||
consensus.hashGenesisBlock = genesis.GetHash(); | consensus.hashGenesisBlock = genesis.GetHash(); | ||||
assert(consensus.hashGenesisBlock == | assert(consensus.hashGenesisBlock == | ||||
uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1" | uint256S("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1" | ||||
"b60a8ce26f")); | "b60a8ce26f")); | ||||
assert(genesis.hashMerkleRoot == | assert(genesis.hashMerkleRoot == | ||||
uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" | uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" | ||||
"7afdeda33b")); | "7afdeda33b")); | ||||
// Note that of those which support the service bits prefix, most only | // Note that of those which support the service bits prefix, most only | ||||
// support a subset of possible options. This is fine at runtime as | // 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 | // 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 we want, but we should get them updated to support all | ||||
// service bits wanted by any release ASAP to avoid it where possible. | // service bits wanted by any release ASAP to avoid it where possible. | ||||
// Bitcoin ABC seeder | // Bitcoin ABC seeder | ||||
vSeeds.emplace_back("seed.bitcoinabc.org"); | vSeeds.emplace_back("seed.bitcoinabc.org"); | ||||
// bitcoinforks seeders | // bitcoinforks seeders | ||||
vSeeds.emplace_back("seed-bch.bitcoinforks.org"); | vSeeds.emplace_back("seed-bch.bitcoinforks.org"); | ||||
// BU backed seeder | // BU backed seeder | ||||
vSeeds.emplace_back("btccash-seeder.bitcoinunlimited.info"); | vSeeds.emplace_back("btccash-seeder.bitcoinunlimited.info"); | ||||
// Jason B. Cox | // Jason B. Cox | ||||
vSeeds.emplace_back("seeder.jasonbcox.com"); | vSeeds.emplace_back("seeder.jasonbcox.com"); | ||||
// Amaury SÉCHET | // Amaury SÉCHET | ||||
vSeeds.emplace_back("seed.deadalnix.me"); | vSeeds.emplace_back("seed.deadalnix.me"); | ||||
// BCHD | // BCHD | ||||
vSeeds.emplace_back("seed.bchd.cash"); | vSeeds.emplace_back("seed.bchd.cash"); | ||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0); | base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0); | ||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 5); | base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 5); | ||||
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 128); | base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 128); | ||||
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E}; | base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E}; | ||||
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4}; | base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4}; | ||||
cashaddrPrefix = "bitcoincash"; | cashaddrPrefix = "bitcoincash"; | ||||
vFixedSeeds = std::vector<SeedSpec6>( | |||||
pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main)); | |||||
fDefaultConsistencyChecks = false; | fDefaultConsistencyChecks = false; | ||||
fRequireStandard = true; | fRequireStandard = true; | ||||
m_is_test_chain = false; | m_is_test_chain = false; | ||||
m_is_mockable_chain = false; | m_is_mockable_chain = false; | ||||
checkpointData = CheckpointData(CBaseChainParams::MAIN); | checkpointData = CheckpointData(CBaseChainParams::MAIN); | ||||
// Data as of block | // Data as of block | ||||
// 000000000000000001d2ce557406b017a928be25ee98906397d339c3f68eec5d | // 000000000000000001d2ce557406b017a928be25ee98906397d339c3f68eec5d | ||||
// (height 523992). | // (height 523992). | ||||
chainTxData = ChainTxData{ | chainTxData = ChainTxData{ | ||||
// UNIX timestamp of last known number of transactions. | // UNIX timestamp of last known number of transactions. | ||||
1522608016, | 1522608016, | ||||
// Total number of transactions between genesis and that timestamp | // Total number of transactions between genesis and that timestamp | ||||
// (the tx=... number in the ChainStateFlushed debug.log lines) | // (the tx=... number in the ChainStateFlushed debug.log lines) | ||||
248589038, | 248589038, | ||||
// Estimated number of transactions per second after that timestamp. | // Estimated number of transactions per second after that timestamp. | ||||
3.2, | 3.2, | ||||
}; | }; | ||||
} | } | ||||
}; | |||||
/** | /** | ||||
* Testnet (v3) | * Testnet (v3) | ||||
*/ | */ | ||||
class CTestNetParams : public CChainParams { | CTestNetParams::CTestNetParams() { | ||||
public: | |||||
CTestNetParams() { | |||||
strNetworkID = CBaseChainParams::TESTNET; | strNetworkID = CBaseChainParams::TESTNET; | ||||
consensus.nSubsidyHalvingInterval = 210000; | consensus.nSubsidyHalvingInterval = 210000; | ||||
// 00000000040b4e986385315e14bee30ad876d8b47f748025b26683116d21aa65 | // 00000000040b4e986385315e14bee30ad876d8b47f748025b26683116d21aa65 | ||||
consensus.BIP16Height = 514; | consensus.BIP16Height = 514; | ||||
consensus.BIP34Height = 21111; | consensus.BIP34Height = 21111; | ||||
consensus.BIP34Hash = BlockHash::fromHex( | consensus.BIP34Hash = BlockHash::fromHex( | ||||
"0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"); | "0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8"); | ||||
// 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 | // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 | ||||
consensus.BIP65Height = 581885; | consensus.BIP65Height = 581885; | ||||
// 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 | // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 | ||||
consensus.BIP66Height = 330776; | consensus.BIP66Height = 330776; | ||||
// 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb | // 00000000025e930139bac5c6c31a403776da130831ab85be56578f3fa75369bb | ||||
consensus.CSVHeight = 770112; | consensus.CSVHeight = 770112; | ||||
consensus.powLimit = uint256S( | consensus.powLimit = uint256S( | ||||
"00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | "00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
// two weeks | // two weeks | ||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | ||||
consensus.nPowTargetSpacing = 10 * 60; | consensus.nPowTargetSpacing = 10 * 60; | ||||
consensus.fPowAllowMinDifficultyBlocks = true; | consensus.fPowAllowMinDifficultyBlocks = true; | ||||
consensus.fPowNoRetargeting = false; | consensus.fPowNoRetargeting = false; | ||||
// two days | // two days | ||||
consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | ||||
// nPowTargetTimespan / nPowTargetSpacing | // nPowTargetTimespan / nPowTargetSpacing | ||||
consensus.nMinerConfirmationWindow = 2016; | consensus.nMinerConfirmationWindow = 2016; | ||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | ||||
.bit = 28, | .bit = 28, | ||||
// 75% of 2016 | // 75% of 2016 | ||||
.nActivationThreshold = 1512, | .nActivationThreshold = 1512, | ||||
// January 1, 2008 | // January 1, 2008 | ||||
.nStartTime = 1199145601, | .nStartTime = 1199145601, | ||||
// December 31, 2008 | // December 31, 2008 | ||||
.nTimeout = 1230767999, | .nTimeout = 1230767999, | ||||
}; | }; | ||||
// The miner fund is disabled by default on testnet. | // The miner fund is disabled by default on testnet. | ||||
consensus.enableMinerFund = false; | consensus.enableMinerFund = false; | ||||
// The best chain should have at least this much work. | // The best chain should have at least this much work. | ||||
consensus.nMinimumChainWork = | consensus.nMinimumChainWork = | ||||
ChainParamsConstants::TESTNET_MINIMUM_CHAIN_WORK; | ChainParamsConstants::TESTNET_MINIMUM_CHAIN_WORK; | ||||
// By default assume that the signatures in ancestors of this block are | // By default assume that the signatures in ancestors of this block are | ||||
// valid. | // valid. | ||||
consensus.defaultAssumeValid = | consensus.defaultAssumeValid = | ||||
ChainParamsConstants::TESTNET_DEFAULT_ASSUME_VALID; | ChainParamsConstants::TESTNET_DEFAULT_ASSUME_VALID; | ||||
// August 1, 2017 hard fork | // August 1, 2017 hard fork | ||||
consensus.uahfHeight = 1155875; | consensus.uahfHeight = 1155875; | ||||
// November 13, 2017 hard fork | // November 13, 2017 hard fork | ||||
consensus.daaHeight = 1188697; | consensus.daaHeight = 1188697; | ||||
// November 15, 2018 hard fork | // November 15, 2018 hard fork | ||||
consensus.magneticAnomalyHeight = 1267996; | consensus.magneticAnomalyHeight = 1267996; | ||||
// November 15, 2019 protocol upgrade | // November 15, 2019 protocol upgrade | ||||
consensus.gravitonHeight = 1341711; | consensus.gravitonHeight = 1341711; | ||||
// May 15, 2020 12:00:00 UTC protocol upgrade | // May 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.phononHeight = 1378460; | consensus.phononHeight = 1378460; | ||||
// Nov 15, 2020 12:00:00 UTC protocol upgrade | // Nov 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.axionActivationTime = 1605441600; | consensus.axionActivationTime = 1605441600; | ||||
// May 15, 2021 12:00:00 UTC protocol upgrade | // May 15, 2021 12:00:00 UTC protocol upgrade | ||||
consensus.tachyonActivationTime = 1621080000; | consensus.tachyonActivationTime = 1621080000; | ||||
diskMagic[0] = 0x0b; | diskMagic[0] = 0x0b; | ||||
diskMagic[1] = 0x11; | diskMagic[1] = 0x11; | ||||
diskMagic[2] = 0x09; | diskMagic[2] = 0x09; | ||||
diskMagic[3] = 0x07; | diskMagic[3] = 0x07; | ||||
netMagic[0] = 0xf4; | netMagic[0] = 0xf4; | ||||
netMagic[1] = 0xe5; | netMagic[1] = 0xe5; | ||||
netMagic[2] = 0xf3; | netMagic[2] = 0xf3; | ||||
netMagic[3] = 0xf4; | netMagic[3] = 0xf4; | ||||
nDefaultPort = 18333; | nDefaultPort = 18333; | ||||
nPruneAfterHeight = 1000; | nPruneAfterHeight = 1000; | ||||
m_assumed_blockchain_size = | m_assumed_blockchain_size = | ||||
ChainParamsConstants::TESTNET_ASSUMED_BLOCKCHAIN_SIZE; | ChainParamsConstants::TESTNET_ASSUMED_BLOCKCHAIN_SIZE; | ||||
m_assumed_chain_state_size = | m_assumed_chain_state_size = | ||||
ChainParamsConstants::TESTNET_ASSUMED_CHAINSTATE_SIZE; | ChainParamsConstants::TESTNET_ASSUMED_CHAINSTATE_SIZE; | ||||
genesis = | genesis = | ||||
CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); | CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN); | ||||
consensus.hashGenesisBlock = genesis.GetHash(); | consensus.hashGenesisBlock = genesis.GetHash(); | ||||
assert(consensus.hashGenesisBlock == | assert(consensus.hashGenesisBlock == | ||||
uint256S("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526" | uint256S("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526" | ||||
"f8d77f4943")); | "f8d77f4943")); | ||||
assert(genesis.hashMerkleRoot == | assert(genesis.hashMerkleRoot == | ||||
uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" | uint256S("4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b" | ||||
"7afdeda33b")); | "7afdeda33b")); | ||||
vFixedSeeds.clear(); | |||||
vSeeds.clear(); | vSeeds.clear(); | ||||
// nodes with support for servicebits filtering should be at the top | // nodes with support for servicebits filtering should be at the top | ||||
// Bitcoin ABC seeder | // Bitcoin ABC seeder | ||||
vSeeds.emplace_back("testnet-seed.bitcoinabc.org"); | vSeeds.emplace_back("testnet-seed.bitcoinabc.org"); | ||||
// bitcoinforks seeders | // bitcoinforks seeders | ||||
vSeeds.emplace_back("testnet-seed-bch.bitcoinforks.org"); | vSeeds.emplace_back("testnet-seed-bch.bitcoinforks.org"); | ||||
// Amaury SÉCHET | // Amaury SÉCHET | ||||
vSeeds.emplace_back("testnet-seed.deadalnix.me"); | vSeeds.emplace_back("testnet-seed.deadalnix.me"); | ||||
// BCHD | // BCHD | ||||
vSeeds.emplace_back("testnet-seed.bchd.cash"); | vSeeds.emplace_back("testnet-seed.bchd.cash"); | ||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111); | base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111); | ||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196); | base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196); | ||||
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239); | base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239); | ||||
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; | base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; | ||||
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; | base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; | ||||
cashaddrPrefix = "bchtest"; | cashaddrPrefix = "bchtest"; | ||||
vFixedSeeds = std::vector<SeedSpec6>( | |||||
pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test)); | |||||
fDefaultConsistencyChecks = false; | fDefaultConsistencyChecks = false; | ||||
fRequireStandard = false; | fRequireStandard = false; | ||||
m_is_test_chain = true; | m_is_test_chain = true; | ||||
m_is_mockable_chain = false; | m_is_mockable_chain = false; | ||||
checkpointData = CheckpointData(CBaseChainParams::TESTNET); | checkpointData = CheckpointData(CBaseChainParams::TESTNET); | ||||
// Data as of block | // Data as of block | ||||
// 000000000005b07ecf85563034d13efd81c1a29e47e22b20f4fc6919d5b09cd6 | // 000000000005b07ecf85563034d13efd81c1a29e47e22b20f4fc6919d5b09cd6 | ||||
// (height 1223263) | // (height 1223263) | ||||
chainTxData = ChainTxData{1522608381, 15052068, 0.15}; | chainTxData = ChainTxData{1522608381, 15052068, 0.15}; | ||||
} | } | ||||
}; | |||||
/** | /** | ||||
* Regression test | * Regression test | ||||
*/ | */ | ||||
class CRegTestParams : public CChainParams { | CRegTestParams::CRegTestParams() { | ||||
public: | |||||
CRegTestParams() { | |||||
strNetworkID = CBaseChainParams::REGTEST; | strNetworkID = CBaseChainParams::REGTEST; | ||||
consensus.nSubsidyHalvingInterval = 150; | consensus.nSubsidyHalvingInterval = 150; | ||||
// always enforce P2SH BIP16 on regtest | // always enforce P2SH BIP16 on regtest | ||||
consensus.BIP16Height = 0; | consensus.BIP16Height = 0; | ||||
// BIP34 activated on regtest (Used in functional tests) | // BIP34 activated on regtest (Used in functional tests) | ||||
consensus.BIP34Height = 500; | consensus.BIP34Height = 500; | ||||
consensus.BIP34Hash = BlockHash(); | consensus.BIP34Hash = BlockHash(); | ||||
// BIP65 activated on regtest (Used in functional tests) | // BIP65 activated on regtest (Used in functional tests) | ||||
consensus.BIP65Height = 1351; | consensus.BIP65Height = 1351; | ||||
// BIP66 activated on regtest (Used in functional tests) | // BIP66 activated on regtest (Used in functional tests) | ||||
consensus.BIP66Height = 1251; | consensus.BIP66Height = 1251; | ||||
// CSV activated on regtest (Used in functional tests) | // CSV activated on regtest (Used in functional tests) | ||||
consensus.CSVHeight = 576; | consensus.CSVHeight = 576; | ||||
consensus.powLimit = uint256S( | consensus.powLimit = uint256S( | ||||
"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); | ||||
// two weeks | // two weeks | ||||
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; | ||||
consensus.nPowTargetSpacing = 10 * 60; | consensus.nPowTargetSpacing = 10 * 60; | ||||
consensus.fPowAllowMinDifficultyBlocks = true; | consensus.fPowAllowMinDifficultyBlocks = true; | ||||
consensus.fPowNoRetargeting = true; | consensus.fPowNoRetargeting = true; | ||||
// two days | // two days | ||||
consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | consensus.nDAAHalfLife = 2 * 24 * 60 * 60; | ||||
// Faster than normal for regtest (144 instead of 2016) | // Faster than normal for regtest (144 instead of 2016) | ||||
consensus.nMinerConfirmationWindow = 144; | consensus.nMinerConfirmationWindow = 144; | ||||
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY] = { | ||||
.bit = 28, | .bit = 28, | ||||
// 75% of 144 | // 75% of 144 | ||||
.nActivationThreshold = 108, | .nActivationThreshold = 108, | ||||
}; | }; | ||||
// The miner fund is disabled by default on regnet. | // The miner fund is disabled by default on regnet. | ||||
consensus.enableMinerFund = false; | consensus.enableMinerFund = false; | ||||
// The best chain should have at least this much work. | // The best chain should have at least this much work. | ||||
consensus.nMinimumChainWork = uint256S("0x00"); | consensus.nMinimumChainWork = uint256S("0x00"); | ||||
// By default assume that the signatures in ancestors of this block are | // By default assume that the signatures in ancestors of this block are | ||||
// valid. | // valid. | ||||
consensus.defaultAssumeValid = BlockHash(); | consensus.defaultAssumeValid = BlockHash(); | ||||
// UAHF is always enabled on regtest. | // UAHF is always enabled on regtest. | ||||
consensus.uahfHeight = 0; | consensus.uahfHeight = 0; | ||||
// November 13, 2017 hard fork is always on on regtest. | // November 13, 2017 hard fork is always on on regtest. | ||||
consensus.daaHeight = 0; | consensus.daaHeight = 0; | ||||
// November 15, 2018 hard fork is always on on regtest. | // November 15, 2018 hard fork is always on on regtest. | ||||
consensus.magneticAnomalyHeight = 0; | consensus.magneticAnomalyHeight = 0; | ||||
// November 15, 2019 protocol upgrade | // November 15, 2019 protocol upgrade | ||||
consensus.gravitonHeight = 0; | consensus.gravitonHeight = 0; | ||||
// May 15, 2020 12:00:00 UTC protocol upgrade | // May 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.phononHeight = 0; | consensus.phononHeight = 0; | ||||
// Nov 15, 2020 12:00:00 UTC protocol upgrade | // Nov 15, 2020 12:00:00 UTC protocol upgrade | ||||
consensus.axionActivationTime = 1605441600; | consensus.axionActivationTime = 1605441600; | ||||
// May 15, 2021 12:00:00 UTC protocol upgrade | // May 15, 2021 12:00:00 UTC protocol upgrade | ||||
consensus.tachyonActivationTime = 1621080000; | consensus.tachyonActivationTime = 1621080000; | ||||
diskMagic[0] = 0xfa; | diskMagic[0] = 0xfa; | ||||
diskMagic[1] = 0xbf; | diskMagic[1] = 0xbf; | ||||
diskMagic[2] = 0xb5; | diskMagic[2] = 0xb5; | ||||
diskMagic[3] = 0xda; | diskMagic[3] = 0xda; | ||||
netMagic[0] = 0xda; | netMagic[0] = 0xda; | ||||
netMagic[1] = 0xb5; | netMagic[1] = 0xb5; | ||||
netMagic[2] = 0xbf; | netMagic[2] = 0xbf; | ||||
netMagic[3] = 0xfa; | netMagic[3] = 0xfa; | ||||
nDefaultPort = 18444; | nDefaultPort = 18444; | ||||
nPruneAfterHeight = 1000; | nPruneAfterHeight = 1000; | ||||
m_assumed_blockchain_size = 0; | m_assumed_blockchain_size = 0; | ||||
m_assumed_chain_state_size = 0; | m_assumed_chain_state_size = 0; | ||||
genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); | genesis = CreateGenesisBlock(1296688602, 2, 0x207fffff, 1, 50 * COIN); | ||||
consensus.hashGenesisBlock = genesis.GetHash(); | consensus.hashGenesisBlock = genesis.GetHash(); | ||||
assert(consensus.hashGenesisBlock == | assert(consensus.hashGenesisBlock == | ||||
uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b" | uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b" | ||||
"1a11466e2206")); | "1a11466e2206")); | ||||
assert(genesis.hashMerkleRoot == | assert(genesis.hashMerkleRoot == | ||||
uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab212" | uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab212" | ||||
"7b7afdeda33b")); | "7b7afdeda33b")); | ||||
//! Regtest mode doesn't have any fixed seeds. | |||||
vFixedSeeds.clear(); | |||||
//! Regtest mode doesn't have any DNS seeds. | //! Regtest mode doesn't have any DNS seeds. | ||||
vSeeds.clear(); | vSeeds.clear(); | ||||
fDefaultConsistencyChecks = true; | fDefaultConsistencyChecks = true; | ||||
fRequireStandard = true; | fRequireStandard = true; | ||||
m_is_test_chain = true; | m_is_test_chain = true; | ||||
m_is_mockable_chain = true; | m_is_mockable_chain = true; | ||||
checkpointData = CheckpointData(CBaseChainParams::REGTEST); | checkpointData = CheckpointData(CBaseChainParams::REGTEST); | ||||
chainTxData = ChainTxData{0, 0, 0}; | chainTxData = ChainTxData{0, 0, 0}; | ||||
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111); | base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111); | ||||
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196); | base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196); | ||||
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239); | base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239); | ||||
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; | base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF}; | ||||
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; | base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94}; | ||||
cashaddrPrefix = "bchreg"; | cashaddrPrefix = "bchreg"; | ||||
} | } | ||||
}; | |||||
static std::unique_ptr<CChainParams> globalChainParams; | static std::unique_ptr<CChainParams> globalChainParams; | ||||
const CChainParams &Params() { | const CChainParams &Params() { | ||||
assert(globalChainParams); | assert(globalChainParams); | ||||
return *globalChainParams; | return *globalChainParams; | ||||
} | } | ||||
Show All 21 Lines |