362 lines
17 KiB
C++
362 lines
17 KiB
C++
// Copyright (c) 2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2015 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 "chainparams.h"
|
|
#include "consensus/merkle.h"
|
|
|
|
#include "tinyformat.h"
|
|
#include "util.h"
|
|
#include "utilstrencodings.h"
|
|
|
|
#include <assert.h>
|
|
|
|
#include <boost/assign/list_of.hpp>
|
|
|
|
#include "chainparamsseeds.h"
|
|
|
|
using namespace std;
|
|
|
|
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
|
|
{
|
|
// Genesis block
|
|
|
|
// MainNet:
|
|
|
|
//CBlock(hash=000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90, nTime=1393221600, nBits=1e0fffff, nNonce=164482, vtx=1, vchBlockSig=)
|
|
// Coinbase(hash=12630d16a9, nTime=1393221600, ver=1, vin.size=1, vout.size=1, nLockTime=0)
|
|
// CTxIn(COutPoint(0000000000, 4294967295), coinbase 00012a24323020466562203230313420426974636f696e2041544d7320636f6d6520746f20555341)
|
|
// CTxOut(empty)
|
|
// vMerkleTree: 12630d16a9
|
|
|
|
// TestNet:
|
|
|
|
//CBlock(hash=0000724595fb3b9609d441cbfb9577615c292abf07d996d3edabc48de843642d, ver=1, hashPrevBlock=0000000000000000000000000000000000000000000000000000000000000000, hashMerkleRoot=12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90, nTime=1393221600, nBits=1f00ffff, nNonce=216178, vtx=1, vchBlockSig=)
|
|
// Coinbase(hash=12630d16a9, nTime=1393221600, ver=1, vin.size=1, vout.size=1, nLockTime=0)
|
|
// CTxIn(COutPoint(0000000000, 4294967295), coinbase 00012a24323020466562203230313420426974636f696e2041544d7320636f6d6520746f20555341)
|
|
// CTxOut(empty)
|
|
// vMerkleTree: 12630d16a9
|
|
|
|
CMutableTransaction txNew;
|
|
txNew.nVersion = 1;
|
|
txNew.nTime = nTime;
|
|
txNew.vin.resize(1);
|
|
txNew.vout.resize(1);
|
|
txNew.vin[0].scriptSig = CScript() << 0 << CScriptNum(42) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
|
txNew.vout[0].nValue = genesisReward;
|
|
|
|
CBlock genesis;
|
|
genesis.nTime = nTime;
|
|
genesis.nBits = nBits;
|
|
genesis.nNonce = nNonce;
|
|
genesis.nVersion = nVersion;
|
|
genesis.vtx.push_back(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.
|
|
*/
|
|
static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
|
|
{
|
|
const char* pszTimestamp = "20 Feb 2014 Bitcoin ATMs come to USA";
|
|
const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
|
return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
|
|
}
|
|
|
|
/**
|
|
* Main network
|
|
*/
|
|
/**
|
|
* What makes a good checkpoint block?
|
|
* + Is surrounded by blocks with reasonable timestamps
|
|
* (no blocks before with a timestamp after, none after with
|
|
* timestamp before)
|
|
* + Contains no strange transactions
|
|
*/
|
|
|
|
class CMainParams : public CChainParams {
|
|
public:
|
|
CMainParams() {
|
|
strNetworkID = "main";
|
|
consensus.nMaxReorganizationDepth = 500;
|
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
|
consensus.nMajorityRejectBlockOutdated = 950;
|
|
consensus.nMajorityWindow = 1000;
|
|
consensus.powLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimitV2 = uint256S("000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.nTargetTimespan = 16 * 60; // 16 mins
|
|
consensus.nTargetSpacingV1 = 60;
|
|
consensus.nTargetSpacing = 64;
|
|
consensus.BIP34Height = -1;
|
|
consensus.BIP34Hash = uint256();
|
|
consensus.fPowAllowMinDifficultyBlocks = false;
|
|
consensus.fPowNoRetargeting = false;
|
|
consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
|
|
consensus.nMinerConfirmationWindow = 2016; // nTargetTimespan / nTargetSpacing
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
|
|
|
// Deployment of BIP68, BIP112, and BIP113.
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 999999999999ULL; // never
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 0; // out of time
|
|
|
|
consensus.nProtocolV1RetargetingFixedTime = 1395631999;
|
|
consensus.nProtocolV2Time = 1407053625;
|
|
consensus.nProtocolV3Time = 1444028400;
|
|
consensus.nLastPOWBlock = 10000;
|
|
consensus.nStakeTimestampMask = 0xf; // 15
|
|
consensus.nCoinbaseMaturity = 500;
|
|
consensus.nStakeMinConfirmations = 500;
|
|
consensus.nStakeMinAge = 8 * 60 * 60; // 8 hours
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
pchMessageStart[0] = 0x70;
|
|
pchMessageStart[1] = 0x35;
|
|
pchMessageStart[2] = 0x22;
|
|
pchMessageStart[3] = 0x05;
|
|
nDefaultPort = 15714;
|
|
nMaxTipAge = 24 * 60 * 60;
|
|
nPruneAfterHeight = 100000;
|
|
|
|
genesis = CreateGenesisBlock(1393221600, 164482, 0x1e0fffff, 1, 0);
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
|
assert(consensus.hashGenesisBlock == uint256S("0x000001faef25dec4fbcf906e6242621df2c183bf232f263d0ba5b101911e4563"));
|
|
assert(genesis.hashMerkleRoot == uint256S("0x12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90"));
|
|
|
|
vSeeds.push_back(CDNSSeedData("vasin.nl", "dnsseed.vasin.nl"));
|
|
vSeeds.push_back(CDNSSeedData("vps.joshuajbouw.com", "dnsseed.joshuajbouw.com"));
|
|
|
|
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,25);
|
|
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,85);
|
|
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,153);
|
|
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
|
|
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
|
|
cashaddrPrefix = "blackcoin";
|
|
|
|
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
|
|
|
|
fMiningRequiresPeers = true;
|
|
fDefaultConsistencyChecks = false;
|
|
fRequireStandard = true;
|
|
fMineBlocksOnDemand = false;
|
|
fTestnetToBeDeprecatedFieldRPC = false;
|
|
|
|
checkpointData = (CCheckpointData) {
|
|
boost::assign::map_list_of
|
|
( 5001, uint256S("0x2fac9021be0c311e7b6dc0933a72047c70f817e2eb1e01bede011193ad1b28bc")) // hardfork
|
|
( 10000, uint256S("0x0000000000827e4dc601f7310a91c45af8df0dfc1b6fa1dfa5b896cb00c8767c")) // last pow block
|
|
( 38425, uint256S("0x62bf2e9701226d2f88d9fa99d650bd81f3faf2e56f305b7d71ccd1e7aa9c3075")) // hardfork
|
|
(254348, uint256S("0x9bf8d9bd757d3ef23d5906d70567e5f0da93f1e0376588c8d421a95e2421838b")) // minor network split
|
|
(319002, uint256S("0x0011494d03b2cdf1ecfc8b0818f1e0ef7ee1d9e9b3d1279c10d35456bc3899ef")) // hardfork
|
|
(872456, uint256S("0xe4fd321ced1de06213d2e246b150b4bfd8c4aa0989965dce88f2a58668c64860")), // hardfork
|
|
1444028528, // * UNIX timestamp of last checkpoint block
|
|
2774767, // * total number of transactions between genesis and last checkpoint
|
|
// (the tx=... number in the SetBestChain debug.log lines)
|
|
3500.0 // * estimated number of transactions per day after checkpoint
|
|
};
|
|
}
|
|
};
|
|
static CMainParams mainParams;
|
|
|
|
/**
|
|
* Testnet
|
|
*/
|
|
class CTestNetParams : public CChainParams {
|
|
public:
|
|
CTestNetParams() {
|
|
strNetworkID = "test";
|
|
consensus.nMaxReorganizationDepth = 500;
|
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
|
consensus.nMajorityRejectBlockOutdated = 950;
|
|
consensus.nMajorityWindow = 1000;
|
|
consensus.powLimit = uint256S("0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimit = uint256S("00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimitV2 = uint256S("000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.nTargetTimespan = 16 * 60; // 16 mins
|
|
consensus.nTargetSpacingV1 = 60;
|
|
consensus.nTargetSpacing = 64;
|
|
consensus.BIP34Height = -1;
|
|
consensus.BIP34Hash = uint256();
|
|
consensus.fPowAllowMinDifficultyBlocks = true;
|
|
consensus.fPowNoRetargeting = false;
|
|
consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
|
|
consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
|
|
|
consensus.nProtocolV1RetargetingFixedTime = 1395631999;
|
|
consensus.nProtocolV2Time = 1407053625;
|
|
consensus.nProtocolV3Time = 1444028400;
|
|
consensus.nLastPOWBlock = 10000;
|
|
consensus.nStakeTimestampMask = 0xf; // 15
|
|
consensus.nCoinbaseMaturity = 50;
|
|
consensus.nStakeMinConfirmations = 50;
|
|
consensus.nStakeMinAge = 1 * 60 * 60; // 1 hour
|
|
|
|
pchMessageStart[0] = 0xcd;
|
|
pchMessageStart[1] = 0xf2;
|
|
pchMessageStart[2] = 0xc0;
|
|
pchMessageStart[3] = 0xef;
|
|
nDefaultPort = 25714;
|
|
nMaxTipAge = 0x7fffffff;
|
|
nPruneAfterHeight = 1000;
|
|
|
|
genesis = CreateGenesisBlock(1393221600, 216178, 0x1f00ffff, 1, 0);
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
|
assert(consensus.hashGenesisBlock == uint256S("0x0000724595fb3b9609d441cbfb9577615c292abf07d996d3edabc48de843642d"));
|
|
assert(genesis.hashMerkleRoot == uint256S("0x12630d16a97f24b287c8c2594dda5fb98c9e6c70fc61d44191931ea2aa08dc90"));
|
|
|
|
vFixedSeeds.clear();
|
|
vSeeds.clear();
|
|
|
|
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
|
|
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
|
|
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,239);
|
|
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x35)(0x87)(0xCF).convert_to_container<std::vector<unsigned char> >();
|
|
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x35)(0x83)(0x94).convert_to_container<std::vector<unsigned char> >();
|
|
cashaddrPrefix = "blktest";
|
|
|
|
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
|
|
|
|
fMiningRequiresPeers = true;
|
|
fDefaultConsistencyChecks = false;
|
|
fRequireStandard = false;
|
|
fMineBlocksOnDemand = false;
|
|
fTestnetToBeDeprecatedFieldRPC = true;
|
|
|
|
checkpointData = (CCheckpointData) {
|
|
boost::assign::map_list_of
|
|
( 0, uint256S("0x0000724595fb3b9609d441cbfb9577615c292abf07d996d3edabc48de843642d")),
|
|
0,
|
|
0,
|
|
0
|
|
};
|
|
|
|
}
|
|
};
|
|
static CTestNetParams testNetParams;
|
|
|
|
/**
|
|
* Regression test
|
|
*/
|
|
class CRegTestParams : public CChainParams {
|
|
public:
|
|
CRegTestParams() {
|
|
strNetworkID = "regtest";
|
|
consensus.nMaxReorganizationDepth = 50;
|
|
consensus.nMajorityEnforceBlockUpgrade = 51;
|
|
consensus.nMajorityRejectBlockOutdated = 75;
|
|
consensus.nMajorityWindow = 100;
|
|
consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.posLimitV2 = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
consensus.nTargetTimespan = 16 * 60; // 16 mins
|
|
consensus.nTargetSpacingV1 = 60;
|
|
consensus.nTargetSpacing = 64;
|
|
consensus.BIP34Height = -1; // BIP34 has not necessarily activated on regtest
|
|
consensus.BIP34Hash = uint256();
|
|
consensus.fPowAllowMinDifficultyBlocks = true;
|
|
consensus.fPowNoRetargeting = true;
|
|
consensus.nRuleChangeActivationThreshold = 108;// 75% for regtest
|
|
consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit = 28;
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
|
|
consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
|
|
|
|
// Deployment of BIP68, BIP112, and BIP113.
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].bit = 0;
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nStartTime = 999999999999ULL; // never
|
|
// consensus.vDeployments[Consensus::DEPLOYMENT_CSV].nTimeout = 0; // out of time
|
|
|
|
consensus.nProtocolV1RetargetingFixedTime = 1395631999;
|
|
consensus.nProtocolV2Time = 1407053625;
|
|
consensus.nProtocolV3Time = 1444028400;
|
|
consensus.nLastPOWBlock = 1000;
|
|
consensus.nStakeTimestampMask = 0xf;
|
|
consensus.nCoinbaseMaturity = 50;
|
|
consensus.nStakeMinConfirmations = 50;
|
|
consensus.nStakeMinAge = 1 * 60 * 60;
|
|
|
|
pchMessageStart[0] = 0x70;
|
|
pchMessageStart[1] = 0x35;
|
|
pchMessageStart[2] = 0x22;
|
|
pchMessageStart[3] = 0x06;
|
|
nDefaultPort = 25714;
|
|
nMaxTipAge = 0x7fffffff;
|
|
nPruneAfterHeight = 100000;
|
|
|
|
genesis = CreateGenesisBlock(1504695029, 17, 0x207fffff, 7, 0);
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
|
assert(consensus.hashGenesisBlock == uint256S("0xf42eb1d043cb8003e491b48e6404f7c3465df16c04ba9370b8307fad87b21216"));
|
|
assert(genesis.hashMerkleRoot == uint256S("0xca4884e59066db370e5bf6d368c49d5ec8c7dc1161109f71be5f17c6aeb0e30f"));
|
|
|
|
vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
|
|
vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
|
|
|
|
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
|
|
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
|
|
base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,239);
|
|
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
|
|
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
|
|
cashaddrPrefix = "blkreg";
|
|
|
|
fMiningRequiresPeers = false;
|
|
fDefaultConsistencyChecks = true;
|
|
fRequireStandard = false;
|
|
fMineBlocksOnDemand = true;
|
|
fTestnetToBeDeprecatedFieldRPC = false;
|
|
|
|
checkpointData = (CCheckpointData) {
|
|
boost::assign::map_list_of
|
|
( 0, uint256S("0xf42eb1d043cb8003e491b48e6404f7c3465df16c04ba9370b8307fad87b21216")),
|
|
0,
|
|
0,
|
|
0
|
|
};
|
|
|
|
}
|
|
};
|
|
static CRegTestParams regTestParams;
|
|
|
|
|
|
|
|
static CChainParams *pCurrentParams = 0;
|
|
|
|
const CChainParams &Params() {
|
|
assert(pCurrentParams);
|
|
return *pCurrentParams;
|
|
}
|
|
|
|
CChainParams& Params(const std::string& chain)
|
|
{
|
|
if (chain == CBaseChainParams::MAIN)
|
|
return mainParams;
|
|
else if (chain == CBaseChainParams::TESTNET)
|
|
return testNetParams;
|
|
else if (chain == CBaseChainParams::REGTEST)
|
|
return regTestParams;
|
|
else
|
|
throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain));
|
|
}
|
|
|
|
void SelectParams(const std::string& network)
|
|
{
|
|
SelectBaseParams(network);
|
|
pCurrentParams = &Params(network);
|
|
}
|
|
|