BSHA3  0.17.99
P2P Blockchain, based on Bitcoin
chainparams.cpp
Go to the documentation of this file.
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 The Bitcoin Core developers
3 // Copyright (c) 2018 The Raven Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #include <chainparams.h>
8 
9 #include <chainparamsseeds.h>
10 #include <consensus/merkle.h>
11 #include <tinyformat.h>
12 #include <util.h>
13 #include <utilstrencodings.h>
14 #include <versionbitsinfo.h>
15 
16 #include <assert.h>
17 
18 #include <arith_uint256.h>
19 
20 #include <chainparamsseeds.h>
21 
22 #include <boost/algorithm/string/classification.hpp>
23 #include <boost/algorithm/string/split.hpp>
24 
25 static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, /* uint32_t nENonce,*/ uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
26 {
27  CMutableTransaction txNew;
28  txNew.nVersion = 1;
29  txNew.vin.resize(1);
30  txNew.vout.resize(1);
31  txNew.vin[0].scriptSig = CScript() << CScriptNum(0) << 486604799 << CScriptNum(60) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
32  txNew.vout[0].nValue = genesisReward;
33  txNew.vout[0].scriptPubKey = genesisOutputScript;
34 
35  CBlock genesis;
36  genesis.nTime = nTime;
37  genesis.nBits = nBits;
38  genesis.nNonce = nNonce;
39  genesis.nVersion = nVersion;
40  genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
41  genesis.hashPrevBlock.SetNull();
42  genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
43  return genesis;
44 }
45 
57 static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, /* uint32_t nENonce,*/ uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
58 {
59  const char* pszTimestamp = "BBC News 20/Oct/2018 US Mega Millions lottery jackpot hits record $1.6bn";
60  const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
61  return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, /*nENonce,*/ nBits, nVersion, genesisReward);
62 }
63 
67 class CMainParams : public CChainParams {
68 public:
70  strNetworkID = "main";
72  consensus.nBIP34Enabled = true;
73  consensus.nBIP65Enabled = true;
74  consensus.nBIP66Enabled = true;
76  consensus.nCSVEnabled = true;
77  consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
78  consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
79  consensus.nPowTargetSpacing = 10 * 60;
82  consensus.nRuleChangeActivationThreshold = 1916; // 95% of 2016
83  consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
85  consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
86  consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
87 
88  // The best chain should have at least this much work.
89  consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000010f4207fc56b");
90 
91  // By default assume that the signatures in ancestors of this block are valid.
93 
99  pchMessageStart[0] = 0xfa;
100  pchMessageStart[1] = 0xbf;
101  pchMessageStart[2] = 0xb5;
102  pchMessageStart[3] = 0xda;
103  nDefaultPort = 8335;
104  nPruneAfterHeight = 100000;
105 
106  genesis = CreateGenesisBlock(1540053565, 10226705, 0x1d00ffff, 4, 50 * COIN);
108 
109  assert(consensus.hashGenesisBlock == uint256S("0x0000000090692ea88f3c87dc1cd28e3972c6b86d6f2e7c8fd8d267e88c4d65f1"));
110  assert(genesis.hashMerkleRoot == uint256S("0x6da02f100f366c604834400e249047aa7c0c594c957783be15fb223543aa7861"));
111 
112  // Note that of those which support the service bits prefix, most only support a subset of
113  // possible options.
114  // This is fine at runtime as we'll fall back to using them as a oneshot if they don't support the
115  // service bits we want, but we should get them updated to support all service bits wanted by any
116  // release ASAP to avoid it where possible.
117  vSeeds.emplace_back("seeder.btcsha3.com"); // Supports x1, x5, x9, and xd
118 
119  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,83);
120  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,88);
121  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,128);
122  base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x88, 0xB2, 0x1E};
123  base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x88, 0xAD, 0xE4};
124 
125  bech32_hrp = "bsha3";
126 
127  vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
128 
130  fRequireStandard = true;
131  fMineBlocksOnDemand = false;
132  fMiningRequiresPeers = true;
133 
134  checkpointData = {
135  {
136  { 1, uint256S("0x00000000230768841f81a8b14b3899ce6b38c0e0e9d8f3a60245cf79c8bc756a")},
137  { 175, uint256S("0x000000004571ee39c82eb143f15577808de9fbfd7f103e6f77d27c6855538aca")},
138  { 176, uint256S("0x000000001adcdf818192b26b9ae9a3506e864f6669ed28fa7e509e2258a0b68c")},
139  { 250, uint256S("0x000000003790c7a9797e9c7d4c6791b9b5051c250e6d5e0b7745f483eb65c4a3")},
140  { 1000, uint256S("0x0000000052707bd216d8c74f4ad773529d063b2f6bcae6f0f9a6dc120647a330")},
141  { 4000, uint256S("0x000000009697e163b20b9d5675d538f2f046972919f804e5c8130479ef6b19a3")}
142  }
143  };
144 
146  // Data from rpc: getchaintxstats 4096
147  /* nTime */ 1541760671,
148  /* nTxCount */ 8532,
149  /* dTxRate */ 0.00714,
150  };
151 
152  /* disable fallback fee on mainnet */
153  m_fallback_fee_enabled = false;
154  }
155 };
156 
160 class CTestNetParams : public CChainParams {
161 public:
163  strNetworkID = "test";
165  consensus.nBIP34Enabled = true;
166  consensus.nBIP65Enabled = true;
167  consensus.nBIP66Enabled = true;
168  consensus.nSegwitEnabled = true;
169  consensus.nCSVEnabled = true;
170  consensus.powLimit = uint256S("0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
171  consensus.nPowTargetTimespan = 14 * 24 * 6 * 6; // two weeks // (60)
172  consensus.nPowTargetSpacing = 1 * 6; // (10)
175  consensus.nRuleChangeActivationThreshold = 1512; // 75% for testchains
176  consensus.nMinerConfirmationWindow = 2016; // nPowTargetTimespan / nPowTargetSpacing
177 
179  consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nStartTime = 1199145601; // January 1, 2008
180  consensus.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].nTimeout = 1230767999; // December 31, 2008
181 
182  // The best chain should have at least this much work.
183  consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000000000000");
184  //consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000007dbe94253893cbd463");
185 
186  // By default assume that the signatures in ancestors of this block are valid.
187  consensus.defaultAssumeValid = uint256S("0x00"); //genesis.GetHash(); //uint256S("0x0000000000000000000000000000000000000000000000000000000000000000");
188  //consensus.defaultAssumeValid = uint256S("0x0000000000000037a8cd3e06cd5edbfe9dd1dbcc5dacab279376ef7cfc2b4c75"); //1354312
189 
190  pchMessageStart[0] = 0x0b;
191  pchMessageStart[1] = 0x11;
192  pchMessageStart[2] = 0x09;
193  pchMessageStart[3] = 0x07;
194  nDefaultPort = 18335;
195  nPruneAfterHeight = 1000;
196 
197  genesis = CreateGenesisBlock(1542337888, 52660, /*i,*/ 0x1f00ffff, 4, 50 * COIN);
199  //assert(consensus.hashGenesisBlock == uint256S("0x000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"));
200  //assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
201 
202  // LogPrintf("HashGenesisBlock: %s\n", consensus.hashGenesisBlock.GetHex());
203 
204  vFixedSeeds.clear();
205  vSeeds.clear();
206  // nodes with support for servicebits filtering should be at the top
207  //vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch");
208  //vSeeds.emplace_back("seed.tbtc.petertodd.org");
209  //vSeeds.emplace_back("seed.testnet.bitcoin.sprovoost.nl");
210  //vSeeds.emplace_back("testnet-seed.bluematt.me"); // Just a static list of stable node(s), only supports x9
211 
212  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
213  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
214  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,239);
215  base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
216  base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
217 
218  bech32_hrp = "tb";
219 
220  vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
221 
223  fRequireStandard = false;
224  fMineBlocksOnDemand = false;
225  fMiningRequiresPeers = true;
226 
227 
228  checkpointData = {
229  {
230  }
231  };
232 
234  0, 0, 0
235  };
236 
237  /* enable fallback fee on testnet */
238  m_fallback_fee_enabled = true;
239  }
240 };
241 
245 class CRegTestParams : public CChainParams {
246 public:
247  explicit CRegTestParams(const ArgsManager& args) {
248  strNetworkID = "regtest";
250  consensus.nBIP34Enabled = true;
251  consensus.nBIP65Enabled = true;
252  consensus.nBIP66Enabled = true;
253  consensus.nSegwitEnabled = true;
254  consensus.nCSVEnabled = true;
255  consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
256  consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
257  consensus.nPowTargetSpacing = 10 * 60;
260  consensus.nRuleChangeActivationThreshold = 108; // 75% for testchains
261  consensus.nMinerConfirmationWindow = 144; // Faster than normal for regtest (144 instead of 2016)
265 
266  // The best chain should have at least this much work.
268 
269  // By default assume that the signatures in ancestors of this block are valid.
271 
272  pchMessageStart[0] = 0xfa;
273  pchMessageStart[1] = 0xbf;
274  pchMessageStart[2] = 0xb5;
275  pchMessageStart[3] = 0xda;
276  nDefaultPort = 18444;
277  nPruneAfterHeight = 1000;
278 
279  //UpdateVersionBitsParametersFromArgs(args);
280 
281  genesis = CreateGenesisBlock(1296688602, 3,/* j,*/ 0x207fffff, 1, 50 * COIN);
283 
284  // assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
285  // assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
286 
287  vFixedSeeds.clear();
288  vSeeds.clear();
289 
291  fRequireStandard = false;
292  fMineBlocksOnDemand = true;
293 
294  checkpointData = {
295  {
297  }
298  };
299 
301  0,
302  0,
303  0
304  };
305 
306  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
307  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
308  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1,239);
309  base58Prefixes[EXT_PUBLIC_KEY] = {0x04, 0x35, 0x87, 0xCF};
310  base58Prefixes[EXT_SECRET_KEY] = {0x04, 0x35, 0x83, 0x94};
311 
312  bech32_hrp = "bcrt";
313  //assert(genesis.ToString() == false);
314  /* enable fallback fee on regtest */
315  m_fallback_fee_enabled = true;
316  }
317 
321  void UpdateVersionBitsParameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
322  {
323  consensus.vDeployments[d].nStartTime = nStartTime;
324  consensus.vDeployments[d].nTimeout = nTimeout;
325  }
327 };
328 
330 {
331  if (!args.IsArgSet("-vbparams")) return;
332 
333  for (const std::string& strDeployment : args.GetArgs("-vbparams")) {
334  std::vector<std::string> vDeploymentParams;
335  boost::split(vDeploymentParams, strDeployment, boost::is_any_of(":"));
336  if (vDeploymentParams.size() != 3) {
337  throw std::runtime_error("Version bits parameters malformed, expecting deployment:start:end");
338  }
339  int64_t nStartTime, nTimeout;
340  if (!ParseInt64(vDeploymentParams[1], &nStartTime)) {
341  throw std::runtime_error(strprintf("Invalid nStartTime (%s)", vDeploymentParams[1]));
342  }
343  if (!ParseInt64(vDeploymentParams[2], &nTimeout)) {
344  throw std::runtime_error(strprintf("Invalid nTimeout (%s)", vDeploymentParams[2]));
345  }
346  bool found = false;
347  for (int j=0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) {
348  if (vDeploymentParams[0] == VersionBitsDeploymentInfo[j].name) {
349  UpdateVersionBitsParameters(Consensus::DeploymentPos(j), nStartTime, nTimeout);
350  found = true;
351  LogPrintf("Setting version bits activation parameters for %s to start=%ld, timeout=%ld\n", vDeploymentParams[0], nStartTime, nTimeout);
352  break;
353  }
354  }
355  if (!found) {
356  throw std::runtime_error(strprintf("Invalid deployment (%s)", vDeploymentParams[0]));
357  }
358  }
359 }
360 
361 static std::unique_ptr<const CChainParams> globalChainParams;
362 
364  assert(globalChainParams);
365  return *globalChainParams;
366 }
367 
368 std::unique_ptr<const CChainParams> CreateChainParams(const std::string& chain)
369 {
370  if (chain == CBaseChainParams::MAIN)
371  return std::unique_ptr<CChainParams>(new CMainParams());
372  else if (chain == CBaseChainParams::TESTNET)
373  return std::unique_ptr<CChainParams>(new CTestNetParams());
374  else if (chain == CBaseChainParams::REGTEST)
375  return std::unique_ptr<CChainParams>(new CRegTestParams(gArgs));
376  throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain));
377 }
378 
379 void SelectParams(const std::string& network)
380 {
381  SelectBaseParams(network);
382  globalChainParams = CreateChainParams(network);
383 }
384 
385 
387  consensus.nSegwitEnabled = false;
388 }
389 
391  consensus.nCSVEnabled = false;
392 }
393 
395  consensus.nBIP34Enabled = false;
396 }
397 
399  consensus.nBIP65Enabled = false;
400 }
401 
403  consensus.nBIP66Enabled = false;
404 }
405 
407  return consensus.nBIP34Enabled;
408 }
409 
411  return consensus.nBIP34Enabled;
412 }
413 
415  return consensus.nBIP34Enabled;
416 }
417 
419  return consensus.nCSVEnabled;
420 }
uint32_t nNonce
Definition: block.h:29
std::unique_ptr< const CChainParams > CreateChainParams(const std::string &chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
void UpdateVersionBitsParametersFromArgs(const ArgsManager &args)
bool fMineBlocksOnDemand
Definition: chainparams.h:110
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: util.cpp:502
void SetNull()
Definition: uint256.h:40
Main network.
Definition: chainparams.cpp:67
int64_t nPowTargetTimespan
Definition: params.h:61
bool fPowNoRetargeting
Definition: params.h:59
static const std::string REGTEST
Definition: block.h:74
#define strprintf
Definition: tinyformat.h:1066
std::vector< CTxIn > vin
Definition: transaction.h:362
std::vector< unsigned char > base58Prefixes[MAX_BASE58_TYPES]
Definition: chainparams.h:103
bool fPowAllowMinDifficultyBlocks
Definition: params.h:58
void TurnOffBIP65()
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system...
Definition: chainparams.h:47
std::string bech32_hrp
Definition: chainparams.h:104
CBlock genesis
Definition: chainparams.h:106
bool CSVEnabled() const
uint32_t nTime
Definition: block.h:27
CMessageHeader::MessageStartChars pchMessageStart
Definition: chainparams.h:99
ChainTxData chainTxData
Definition: chainparams.h:113
static const std::string MAIN
BIP70 chain name strings (main, test or regtest)
int nSubsidyHalvingInterval
Definition: params.h:42
bool nBIP34Enabled
Block height and hash at which BIP34 becomes active.
Definition: params.h:44
bool nSegwitEnabled
Definition: params.h:66
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
bool ParseInt64(const std::string &str, int64_t *out)
Convert string to signed 64-bit integer with strict parse error feedback.
uint256 powLimit
Proof of work parameters.
Definition: params.h:57
bool m_fallback_fee_enabled
Definition: chainparams.h:114
uint256 hashMerkleRoot
Definition: block.h:26
void TurnOffBIP34()
DeploymentPos
Definition: params.h:16
bool fRequireStandard
Definition: chainparams.h:109
const char * name
Definition: rest.cpp:37
void SelectParams(const std::string &network)
Sets the params returned by Params() to those for the given BIP70 chain name.
CRegTestParams(const ArgsManager &args)
uint256 uint256S(const char *str)
Definition: uint256.h:142
int64_t nStartTime
Start MedianTime for version bits miner confirmation.
Definition: params.h:32
Regression test.
int64_t nPowTargetSpacing
Definition: params.h:60
uint256 hashPrevBlock
Definition: block.h:25
Holds various statistics on transactions within a chain.
Definition: chainparams.h:34
std::vector< std::string > vSeeds
Definition: chainparams.h:102
void UpdateVersionBitsParameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout)
Allows modifying the Version Bits regtest parameters.
void TurnOffSegwit()
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:66
bool nBIP65Enabled
Definition: params.h:46
bool nCSVEnabled
Definition: params.h:67
void TurnOffCSV()
uint32_t nMinerConfirmationWindow
Definition: params.h:54
std::vector< CTxOut > vout
Definition: transaction.h:363
Testnet (v3-SHA3)
uint256 GetHash() const
Definition: block.cpp:13
int64_t nTimeout
Timeout/expiry MedianTime for the deployment attempt.
Definition: params.h:34
ArgsManager gArgs
Definition: util.cpp:88
uint256 nMinimumChainWork
Definition: params.h:63
std::vector< CTransactionRef > vtx
Definition: block.h:78
const struct VBDeploymentInfo VersionBitsDeploymentInfo[Consensus::MAX_VERSION_BITS_DEPLOYMENTS]
std::vector< SeedSpec6 > vFixedSeeds
Definition: chainparams.h:107
#define ARRAYLEN(array)
uint256 defaultAssumeValid
Definition: params.h:64
const CChainParams & Params()
Return the currently selected parameters.
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:384
Consensus::Params consensus
Definition: chainparams.h:98
void TurnOffBIP66()
std::string strNetworkID
Definition: chainparams.h:105
bool fMiningRequiresPeers
Definition: chainparams.h:111
static const std::string TESTNET
A mutable version of CTransaction.
Definition: transaction.h:360
bool nBIP66Enabled
Definition: params.h:47
uint32_t nRuleChangeActivationThreshold
Minimum blocks including miner confirmation of the total of 2016 blocks in a retargeting period...
Definition: params.h:53
uint64_t nPruneAfterHeight
Definition: chainparams.h:101
int bit
Bit position to select the particular bit in nVersion.
Definition: params.h:30
std::vector< std::string > GetArgs(const std::string &strArg) const
Return a vector of strings of the given argument.
Definition: util.cpp:483
CCheckpointData checkpointData
Definition: chainparams.h:112
void SelectBaseParams(const std::string &chain)
Sets the params returned by Params() to those for the given network.
int32_t nVersion
Definition: block.h:24
uint256 hashGenesisBlock
Definition: params.h:41
bool fDefaultConsistencyChecks
Definition: chainparams.h:108
BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]
Definition: params.h:55
uint32_t nBits
Definition: block.h:28
std::vector< unsigned char > ParseHex(const char *psz)