Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14865128
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
22 KB
Subscribers
None
View Options
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index 7e3747821..0f6235ad3 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -1,550 +1,566 @@
// Copyright (c) 2010 Satoshi Nakamoto
// Copyright (c) 2009-2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <kernel/chainparams.h>
#include <chainparamsconstants.h>
#include <chainparamsseeds.h>
#include <consensus/amount.h>
#include <consensus/merkle.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <script/script.h>
#include <uint256.h>
#include <util/chaintype.h>
#include <util/strencodings.h>
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <cstring>
static CBlock CreateGenesisBlock(const char *pszTimestamp,
const CScript &genesisOutputScript,
uint32_t nTime, uint32_t nNonce,
uint32_t nBits, int32_t nVersion,
const Amount genesisReward) {
CMutableTransaction txNew;
txNew.nVersion = 1;
txNew.vin.resize(1);
txNew.vout.resize(1);
txNew.vin[0].scriptSig =
CScript() << 486604799 << CScriptNum(4)
<< std::vector<uint8_t>((const uint8_t *)pszTimestamp,
(const uint8_t *)pszTimestamp +
strlen(pszTimestamp));
txNew.vout[0].nValue = genesisReward;
txNew.vout[0].scriptPubKey = genesisOutputScript;
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
}
/**
* Build the genesis block. Note that the output of its generation transaction
* cannot be spent since it did not originally exist in the database.
*
* CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000,
* hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893,
* vtx=1)
* CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
* CTxIn(COutPoint(000000, -1), coinbase
* 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
* CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
* vMerkleTree: 4a5e1e
*/
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce,
uint32_t nBits, int32_t nVersion,
const Amount genesisReward) {
const char *pszTimestamp =
"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
const CScript genesisOutputScript =
CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909"
"a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112"
"de5c384df7ba0b8d578a4c702b6bf11d5f")
<< OP_CHECKSIG;
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce,
nBits, nVersion, genesisReward);
}
/**
* Main network
*/
class CMainParams : public CChainParams {
public:
explicit CMainParams(const ChainOptions &opts) {
m_chain_type = ChainType::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;
// The miner fund is enabled by default on mainnet.
consensus.enableMinerFund = true;
// The staking rewards are enabled by default on mainnet.
consensus.enableStakingRewards = true;
// 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.axionHeight = 661647;
// May 15, 2023 12:00:00 UTC protocol upgrade
consensus.wellingtonHeight = 792116;
// Nov 15, 2023 12:00:00 UTC protocol upgrade
consensus.cowperthwaiteHeight = 818669;
// May 15, 2025 12:00:00 UTC protocol upgrade
consensus.schumpeterActivationTime = 1747310400;
// Nov. 15, 2025 12:00:00 UTC protocol upgrade
consensus.shibusawaActivationTime = 1763208000;
/**
* 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 an addrfetch 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");
// Fabien
vSeeds.emplace_back("seeder.fabien.cash");
// status.cash
vSeeds.emplace_back("seeder.status.cash");
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 0);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 5);
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 128);
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};
cashaddrPrefix = opts.ecash ? "ecash" : "bitcoincash";
vFixedSeeds = std::vector<SeedSpec6>(std::begin(pnSeed6_main),
std::end(pnSeed6_main));
fDefaultConsistencyChecks = false;
fRequireStandard = true;
m_is_test_chain = false;
m_is_mockable_chain = false;
checkpointData = CheckpointData(ChainType::MAIN);
m_assumeutxo_data = {
- // TODO to be specified in a future patch.
+ // v0.31.5
+ {.height = 896'800,
+ .hash_serialized =
+ AssumeutxoHash{uint256S("0x2f783c045f353b4a900139f8a66c7bcbb62"
+ "c93a4f298472d77dad9bfb0186665")},
+ .nChainTx = 299'407'257,
+ .blockhash =
+ BlockHash{uint256S("0x0000000000000000297efb200794348b44bff4bf"
+ "b31716cf64dc45bac0a251ea")}},
};
// 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:
explicit CTestNetParams(const ChainOptions &opts) {
m_chain_type = ChainType::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;
// The miner fund is disabled by default on testnet.
consensus.enableMinerFund = false;
// The staking rewards are disabled by default on testnet.
consensus.enableStakingRewards = 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.axionHeight = 1421481;
// May 15, 2023 12:00:00 UTC protocol upgrade
consensus.wellingtonHeight = 1556117;
// Nov 15, 2023 12:00:00 UTC protocol upgrade
consensus.cowperthwaiteHeight = 1584485;
// May 15, 2025 12:00:00 UTC protocol upgrade
consensus.schumpeterActivationTime = 1747310400;
// Nov. 15, 2025 12:00:00 UTC protocol upgrade
consensus.shibusawaActivationTime = 1763208000;
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");
// Fabien
vSeeds.emplace_back("testnet-seeder.fabien.cash");
// status.cash
vSeeds.emplace_back("testnet-seeder.status.cash");
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196);
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
cashaddrPrefix = opts.ecash ? "ectest" : "bchtest";
vFixedSeeds = std::vector<SeedSpec6>(std::begin(pnSeed6_test),
std::end(pnSeed6_test));
fDefaultConsistencyChecks = false;
fRequireStandard = false;
m_is_test_chain = true;
m_is_mockable_chain = false;
checkpointData = CheckpointData(ChainType::TESTNET);
m_assumeutxo_data = {
- // TODO to be specified in a future patch.
+ // v0.31.5
+ {.height = 1'661'000,
+ .hash_serialized =
+ AssumeutxoHash{uint256S("0xc7a2aa5dfdbafa2d6a6613d254d25a2ab9d"
+ "893c01099d241f1e7a3785cb5f50f")},
+ .nChainTx = 63'977'749,
+ .blockhash =
+ BlockHash{uint256S("0x000000000000c7d18ee9b71a1ab4d8d21aa9d758"
+ "7bf260e93df029ccb392d403")}},
};
// Data as of block
// 000000000005b07ecf85563034d13efd81c1a29e47e22b20f4fc6919d5b09cd6
// (height 1223263)
chainTxData = ChainTxData{1522608381, 15052068, 0.15};
}
};
/**
* Regression test
*/
class CRegTestParams : public CChainParams {
public:
explicit CRegTestParams(const ChainOptions &opts) {
m_chain_type = ChainType::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;
// The miner fund is disabled by default on regtest.
consensus.enableMinerFund = false;
// The staking rewards are disabled by default on regtest.
consensus.enableStakingRewards = 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.axionHeight = 0;
// May 15, 2023 12:00:00 UTC protocol upgrade
consensus.wellingtonHeight = 0;
// Nov 15, 2023 12:00:00 UTC protocol upgrade
consensus.cowperthwaiteHeight = 0;
// May 15, 2025 12:00:00 UTC protocol upgrade
consensus.schumpeterActivationTime = 1747310400;
// Nov. 15, 2025 12:00:00 UTC protocol upgrade
consensus.shibusawaActivationTime = 1763208000;
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 = opts.fastprune ? 100 : 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(ChainType::REGTEST);
m_assumeutxo_data = {
{.height = 110,
.hash_serialized =
AssumeutxoHash{uint256S("0xd754ca97ef24c5132f8d2147c19310b7a6b"
"d136766430304735a73372fe36213")},
.nChainTx = 111,
.blockhash =
BlockHash{uint256S("0x47cfb2b77860d250060e78d3248bb05092876545"
"3cbcbdbc121e3c48b99a376c")}},
{// For use by test/functional/feature_assumeutxo.py
.height = 299,
.hash_serialized =
AssumeutxoHash{uint256S("0xa966794ed5a2f9debaefc7ca48dbc5d5e12"
"a89ff9fe45bd00ec5732d074580a9")},
.nChainTx = 334,
.blockhash =
BlockHash{uint256S("0x118a7d5473bccce9b314789e14ce426fc65fb09d"
"feda0131032bb6d86ed2fd0b")}},
};
chainTxData = ChainTxData{0, 0, 0};
base58Prefixes[PUBKEY_ADDRESS] = std::vector<uint8_t>(1, 111);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<uint8_t>(1, 196);
base58Prefixes[SECRET_KEY] = std::vector<uint8_t>(1, 239);
base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
cashaddrPrefix = opts.ecash ? "ecregtest" : "bchreg";
}
};
std::unique_ptr<const CChainParams>
CChainParams::RegTest(const ChainOptions &options) {
return std::make_unique<const CRegTestParams>(options);
}
std::unique_ptr<const CChainParams>
CChainParams::Main(const ChainOptions &options) {
return std::make_unique<const CMainParams>(options);
}
std::unique_ptr<const CChainParams>
CChainParams::TestNet(const ChainOptions &options) {
return std::make_unique<const CTestNetParams>(options);
}
std::vector<int> CChainParams::GetAvailableSnapshotHeights() const {
std::vector<int> heights;
heights.reserve(m_assumeutxo_data.size());
for (const auto &data : m_assumeutxo_data) {
heights.emplace_back(data.height);
}
return heights;
}
std::optional<ChainType>
GetNetworkForMagic(CMessageHeader::MessageMagic &message) {
CChainParams::ChainOptions opts{};
const auto mainnet_msg = CChainParams::Main(opts)->DiskMagic();
const auto testnet_msg = CChainParams::TestNet(opts)->DiskMagic();
const auto regtest_msg = CChainParams::RegTest(opts)->DiskMagic();
if (std::equal(message.begin(), message.end(), mainnet_msg.data())) {
return ChainType::MAIN;
} else if (std::equal(message.begin(), message.end(), testnet_msg.data())) {
return ChainType::TESTNET;
} else if (std::equal(message.begin(), message.end(), regtest_msg.data())) {
return ChainType::REGTEST;
}
return std::nullopt;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, May 22, 01:51 (13 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5850920
Default Alt Text
(22 KB)
Attached To
rABC Bitcoin ABC
Event Timeline
Log In to Comment