PIVX Core  5.6.99
P2P Digital Currency
chainparams.cpp
Go to the documentation of this file.
1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2015 The Bitcoin developers
3 // Copyright (c) 2014-2015 The Dash developers
4 // Copyright (c) 2015-2022 The PIVX Core developers
5 // Distributed under the MIT software license, see the accompanying
6 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
7 
8 #include "chainparams.h"
9 
10 #include "chainparamsseeds.h"
11 #include "consensus/merkle.h"
12 #include "tinyformat.h"
13 #include "utilstrencodings.h"
14 
15 #include <assert.h>
16 
17 static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
18 {
19  CMutableTransaction txNew;
20  txNew.nVersion = 1;
21  txNew.vin.resize(1);
22  txNew.vout.resize(1);
23  txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
24  txNew.vout[0].nValue = genesisReward;
25  txNew.vout[0].scriptPubKey = genesisOutputScript;
26 
27  CBlock genesis;
28  genesis.vtx.push_back(std::make_shared<const CTransaction>(std::move(txNew)));
29  genesis.hashPrevBlock.SetNull();
30  genesis.nVersion = nVersion;
31  genesis.nTime = nTime;
32  genesis.nBits = nBits;
33  genesis.nNonce = nNonce;
34  genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
35  return genesis;
36 }
37 
39 {
40  assert(IsRegTestNet()); // only available for regtest
42  consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
43 }
44 
55 static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
56 {
57  const char* pszTimestamp = "U.S. News & World Report Jan 28 2016 With His Absence, Trump Dominates Another Debate";
58  const CScript genesisOutputScript = CScript() << ParseHex("04c10e83b2703ccf322f7dbd62dd5855ac7c10bd055814ce121ba32607d573b8810c02c0582aed05b4deb9c4b77b26d92428c61256cd42774babea0a073b2ed0c9") << OP_CHECKSIG;
59  return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
60 }
61 
62 // this one is for testing only
63 static Consensus::LLMQParams llmq_test = {
65  .name = "llmq_test",
66  .size = 3,
67  .minSize = 2,
68  .threshold = 2,
69 
70  .dkgInterval = 20, // one every 20 minutes
71  .dkgPhaseBlocks = 2,
72  .dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
73  .dkgMiningWindowEnd = 15,
74  .dkgBadVotesThreshold = 2,
75 
76  .signingActiveQuorumCount = 2, // just a few ones to allow easier testing
77 
78  .keepOldConnections = 3,
79  .recoveryMembers = 3,
80 
81  .cacheDkgInterval = 60,
82 };
83 
84 static Consensus::LLMQParams llmq50_60 = {
86  .name = "llmq_50_60",
87  .size = 50,
88  .minSize = 40,
89  .threshold = 30,
90 
91  .dkgInterval = 60, // one DKG per hour
92  .dkgPhaseBlocks = 6,
93  .dkgMiningWindowStart = 30, // dkgPhaseBlocks * 5 = after finalization
94  .dkgMiningWindowEnd = 40,
95  .dkgBadVotesThreshold = 40,
96 
97  .signingActiveQuorumCount = 24, // a full day worth of LLMQs
98 
99  .keepOldConnections = 25,
100  .recoveryMembers = 25,
101 
102  .cacheDkgInterval = 600,
103 };
104 
105 static Consensus::LLMQParams llmq400_60 = {
107  .name = "llmq_400_60",
108  .size = 400,
109  .minSize = 300,
110  .threshold = 240,
111 
112  .dkgInterval = 60 * 12, // one DKG every 12 hours
113  .dkgPhaseBlocks = 10,
114  .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
115  .dkgMiningWindowEnd = 70,
116  .dkgBadVotesThreshold = 300,
117 
118  .signingActiveQuorumCount = 4, // two days worth of LLMQs
119 
120  .keepOldConnections = 5,
121  .recoveryMembers = 100,
122 
123  .cacheDkgInterval = 60 * 12 * 10, // dkgInterval * 10
124 };
125 
126 // Used for deployment and min-proto-version signaling, so it needs a higher threshold
127 static Consensus::LLMQParams llmq400_85 = {
129  .name = "llmq_400_85",
130  .size = 400,
131  .minSize = 350,
132  .threshold = 340,
133 
134  .dkgInterval = 60 * 24, // one DKG every 24 hours
135  .dkgPhaseBlocks = 10,
136  .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
137  .dkgMiningWindowEnd = 70, // give it a larger mining window to make sure it is mined
138  .dkgBadVotesThreshold = 300,
139 
140  .signingActiveQuorumCount = 4, // four days worth of LLMQs
141 
142  .keepOldConnections = 5,
143  .recoveryMembers = 100,
144 
145  .cacheDkgInterval = 60 * 24 * 10, // dkgInterval * 10
146 };
147 
158 static MapCheckpoints mapCheckpoints = {
159  { 259201, uint256S("1c9121bf9329a6234bfd1ea2d91515f19cd96990725265253f4b164283ade5dd")},
160  { 424998, uint256S("f31e381eedb0ed3ed65fcc98cc71f36012bee32e8efd017c4f9fb0620fd35f6b")},
161  { 616764, uint256S("29dd0bd1c59484f290896687b4ffb6a49afa5c498caf61967c69a541f8191557")},
162  { 623933, uint256S("c7aafa648a0f1450157dc93bd4d7448913a85b7448f803b4ab970d91fc2a7da7")},
163  { 791150, uint256S("8e76f462e4e82d1bd21cb72e1ce1567d4ddda2390f26074ffd1f5d9c270e5e50")},
164  { 795000, uint256S("4423cceeb9fd574137a18733416275a70fdf95283cc79ad976ca399aa424a443")},
165  { 863787, uint256S("5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64")},
166  { 863795, uint256S("2ad866818c4866e0d555181daccc628056216c0db431f88a825e84ed4f469067")},
167  { 863805, uint256S("a755bd9a22b63c70d3db474f4b2b61a1f86c835b290a081bb3ec1ba2103eb4cb")},
168  { 867733, uint256S("03b26296bf693de5782c76843d2fb649cb66d4b05550c6a79c047ff7e1c3ae15")},
169  { 879650, uint256S("227e1d2b738b6cd83c46d1d64617934ec899d77cee34336a56e61b71acd10bb2")},
170  { 895400, uint256S("7796a0274a608fac12d400198174e50beda992c1d522e52e5b95b884bc1beac6")},
171  { 895991, uint256S("d53013ed7ea5c325b9696c95e07667d6858f8ff7ee13fecfa90827bf3c9ae316")},
172  { 908000, uint256S("202708f8c289b676fceb832a079ff6b308a28608339acbf7584de533619d014d")},
173  {1142400, uint256S("98aff9d605bf123247f98b1e3a02567eb5799d208d78ec30fb89737b1c1f79c5")},
174  {1679090, uint256S("f747ce055ba1b12e1f2e842bd480bc647210799359cb2e553ab292065e3419d6")},
175  {1686229, uint256S("bb42bf1e886a7c23474634c90893dd3d68a6ccbfea4ac92a98da5cad0c6a6cb7")},
176  {1778954, uint256S("0d3241268264a2908d6babf00d9cd1ffb83d93d7bb4e428820127fe227c2029c")},
177  {1788528, uint256S("ea9243ff8fc079fdd7a04f11fac415de4d98e1bb0dc38db6f79f8f8bbfdbe496")},
178  {2153200, uint256S("14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5")},
179  {2356049, uint256S("62e80d8e193bca84655fb78893b20f54a79f2d71124c4ea37b7ef51a0d5451c4")},
180  {2365700, uint256S("b5d0beead57735539abc2db2b0b08cd65db3e5928efd3c3bf3182d5bf013f36c")},
181  {2678402, uint256S("580a26ff0a45177a7a6f387f009c5b26140ea48b4790a857d9a796f8b3c25899")},
182  {3014000, uint256S("78ad99b7225f73c42238bd7ca841ff700542b92bba75a0ef2ed351caa560f87f")},
183  {3024000, uint256S("be4bc75afcfb9136924810f7483b2695089a366cc4ee27fd6dc3ecd5396e1f0f")},
184  {3715200, uint256S("a676b9a598c393c82b949c37dd35013aeda55f5d18ab062349db6a8235972aaa")},
185 };
186 
187 static const CCheckpointData data = {
188  &mapCheckpoints,
189  1591401645, // * UNIX timestamp of last checkpoint block
190  5607713, // * total number of transactions between genesis and last checkpoint
191  // (the tx=... number in the UpdateTip debug.log lines)
192  3000 // * estimated number of transactions per day after checkpoint
193 };
194 
195 static MapCheckpoints mapCheckpointsTestnet = {
196  {0, uint256S("0x001")},
197  //{ 201, uint256S("6ae7d52092fd918c8ac8d9b1334400387d3057997e6e927a88e57186dc395231")}, // v5 activation (PoS/Sapling)
198 };
199 
200 static const CCheckpointData dataTestnet = {
201  &mapCheckpointsTestnet,
202  1454124731,
203  0,
204  3000};
205 
206 static MapCheckpoints mapCheckpointsRegtest = {{0, uint256S("0x001")}};
207 static const CCheckpointData dataRegtest = {
208  &mapCheckpointsRegtest,
209  1454124731,
210  0,
211  100};
212 
213 class CMainParams : public CChainParams
214 {
215 public:
217  {
218  strNetworkID = "main";
219 
220  genesis = CreateGenesisBlock(1454124731, 2402015, 0x1e0ffff0, 1, 250 * COIN);
222  assert(consensus.hashGenesisBlock == uint256S("0x0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818"));
223  assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
224 
227  consensus.powLimit = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
228  consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
229  consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
230  consensus.nBudgetCycleBlocks = 43200; // approx. 1 every 30 days
231  consensus.nBudgetFeeConfirmations = 6; // Number of confirmations for the finalization fee
235  consensus.nMaxMoneyOut = 21000000 * COIN;
236  consensus.nMNCollateralAmt = 10000 * COIN;
237  consensus.nMNBlockReward = 3 * COIN;
238  consensus.nNewMNBlockReward = 6 * COIN;
240  consensus.nProposalEstablishmentTime = 60 * 60 * 24; // must be at least a day old to make it into a budget
241  consensus.nStakeMinAge = 60 * 60;
243  consensus.nTargetTimespan = 40 * 60;
244  consensus.nTargetTimespanV2 = 30 * 60;
245  consensus.nTargetSpacing = 1 * 60;
248 
249  // spork keys
250  consensus.strSporkPubKey = "0410050aa740d280b134b40b40658781fc1116ba7700764e0ce27af3e1737586b3257d19232e0cb5084947f5107e44bcd577f126c9eb4a30ea2807b271d2145298";
251  consensus.strSporkPubKeyOld = "040F129DE6546FE405995329A887329BED4321325B1A73B0A257423C05C1FCFE9E40EF0678AEF59036A22C42E61DFD29DF7EFB09F56CC73CADF64E05741880E3E7";
252  consensus.nTime_EnforceNewSporkKey = 1608512400;
253  consensus.nTime_RejectOldSporkKey = 1614560400;
254 
255  // height-based activations
259 
260  // validation by-pass
261  consensus.nPivxBadBlockTime = 1471401614; // Skip nBit validation of Block 259201 per PR #915
262  consensus.nPivxBadBlockBits = 0x1c056dac; // Skip nBit validation of Block 259201 per PR #915
263 
264  // Zerocoin-related params
265  consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
266  "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
267  "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
268  "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
269  "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
270  "31438167899885040445364023527381951378636564391212010397122822120720357";
271  consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
272  consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
274  consensus.ZC_MinMintFee = 1 * CENT;
276  consensus.ZC_TimeStart = 1508214600; // October 17, 2017 4:30:00 AM
277  consensus.ZC_HeightStart = 863735;
278 
279  // Network upgrades
296  consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight = 4281680; // Estimate Feb 29th 12:00 UTC
299 
301  uint256S("0x5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64");
303  uint256S("0x37ea75fe1c9314171cff429a91b25b9f11331076d1c9de50ee4054d61877f8af");
305  uint256S("0x82629b7a9978f5c7ea3f70a12db92633a7d2e436711500db28b97efd48b1e527");
307  uint256S("0xe2448b76d88d37aba4194ffed1041b680d779919157ddf5cbf423373d7f8078e");
309  uint256S("0x0ef2556e40f3b9f6e02ce611b832e0bbfe7734a8ea751c7b555310ee49b61456");
311  uint256S("0x14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5");
312 
318  pchMessageStart[0] = 0x90;
319  pchMessageStart[1] = 0xc4;
320  pchMessageStart[2] = 0xfd;
321  pchMessageStart[3] = 0xe9;
322  nDefaultPort = 51472;
323 
324  // Note that of those with the service bits flag, most only support a subset of possible options
325  vSeeds.emplace_back("pivx.seed.fuzzbawls.pw", true); // Primary DNS Seeder from Fuzzbawls
326  vSeeds.emplace_back("pivx.seed2.fuzzbawls.pw", true); // Secondary DNS Seeder from Fuzzbawls
327  vSeeds.emplace_back("dnsseed.liquid369.wtf", true); // Primary DNS Seeder from Liquid369
328 
329  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 30);
330  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 13);
331  base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 63); // starting with 'S'
332  base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xa2}; // starts with EXM
333  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 212);
334  base58Prefixes[EXT_PUBLIC_KEY] = {0x02, 0x2D, 0x25, 0x33};
335  base58Prefixes[EXT_SECRET_KEY] = {0x02, 0x21, 0x31, 0x2B};
336  // BIP44 coin type is from https://github.com/satoshilabs/slips/blob/master/slip-0044.md
337  base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x77};
338 
339  vFixedSeeds = std::vector<uint8_t>(std::begin(chainparams_seed_main), std::end(chainparams_seed_main));
340 
341  // Reject non-standard transactions by default
342  fRequireStandard = true;
343 
344  // Sapling
348  bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-main";
349  bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviews";
350 
351  bech32HRPs[BLS_SECRET_KEY] = "bls-sk";
352  bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk";
353 
354  // long living quorum params
356  consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
357  consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
358 
360 
362 
363  // Tier two
364  nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
365  }
366 
368  {
369  return data;
370  }
371 
372 };
373 
378 {
379 public:
381  {
382  strNetworkID = "test";
383 
384  genesis = CreateGenesisBlock(1454124731, 2402015, 0x1e0ffff0, 1, 250 * COIN);
386  assert(consensus.hashGenesisBlock == uint256S("0x0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818"));
387  assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
388 
391  consensus.powLimit = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
392  consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
393  consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
394  consensus.nBudgetCycleBlocks = 144; // approx 10 cycles per day
395  consensus.nBudgetFeeConfirmations = 3; // (only 8-blocks window for finalization on testnet)
399  consensus.nMaxMoneyOut = 21000000 * COIN;
400  consensus.nMNCollateralAmt = 10000 * COIN;
401  consensus.nMNBlockReward = 3 * COIN;
402  consensus.nNewMNBlockReward = 6 * COIN;
404  consensus.nProposalEstablishmentTime = 60 * 5; // at least 5 min old to make it into a budget
405  consensus.nStakeMinAge = 60 * 60;
407  consensus.nTargetTimespan = 40 * 60;
408  consensus.nTargetTimespanV2 = 30 * 60;
409  consensus.nTargetSpacing = 1 * 60;
412 
413  // spork keys
414  consensus.strSporkPubKey = "04677c34726c491117265f4b1c83cef085684f36c8df5a97a3a42fc499316d0c4e63959c9eca0dba239d9aaaf72011afffeb3ef9f51b9017811dec686e412eb504";
415  consensus.strSporkPubKeyOld = "04E88BB455E2A04E65FCC41D88CD367E9CCE1F5A409BE94D8C2B4B35D223DED9C8E2F4E061349BA3A38839282508066B6DC4DB72DD432AC4067991E6BF20176127";
416  consensus.nTime_EnforceNewSporkKey = 1608512400;
417  consensus.nTime_RejectOldSporkKey = 1614560400;
418 
419  // height based activations
424 
425  // Zerocoin-related params
426  consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
427  "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
428  "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
429  "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
430  "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
431  "31438167899885040445364023527381951378636564391212010397122822120720357";
432  consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
433  consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
435  consensus.ZC_MinMintFee = 1 * CENT;
437  consensus.ZC_TimeStart = 1508214600; // October 17, 2017 4:30:00 AM
438 
439  // Network upgrades
456  consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight = 1624280; // Estimate Feb 23 Midnight UTC
459 
465  pchMessageStart[0] = 0xf5;
466  pchMessageStart[1] = 0xe6;
467  pchMessageStart[2] = 0xd5;
468  pchMessageStart[3] = 0xca;
469  nDefaultPort = 51474;
470 
471  // nodes with support for servicebits filtering should be at the top
472  vSeeds.emplace_back("pivx-testnet.seed.fuzzbawls.pw", true);
473  vSeeds.emplace_back("pivx-testnet.seed2.fuzzbawls.pw", true);
474 
475  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
476  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19); // Testnet pivx script addresses start with '8' or '9'
477  base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73); // starting with 'W'
478  base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1}; // EXT prefix for the address
479  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239); // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
480  // Testnet pivx BIP32 pubkeys start with 'DRKV'
481  base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
482  // Testnet pivx BIP32 prvkeys start with 'DRKP'
483  base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
484  // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
485  base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
486 
487  vFixedSeeds = std::vector<uint8_t>(std::begin(chainparams_seed_test), std::end(chainparams_seed_test));
488 
489  fRequireStandard = false;
490 
491  // Sapling
492  bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ptestsapling";
493  bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "pviewtestsapling";
494  bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
495  bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-test";
496  bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviewtestsapling";
497 
498  bech32HRPs[BLS_SECRET_KEY] = "bls-sk-test";
499  bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk-test";
500 
501  // long living quorum params
503  consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
504  consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
505 
507 
509 
510  // Tier two
511  nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
512  }
513 
515  {
516  return dataTestnet;
517  }
518 };
519 
524 {
525 public:
527  {
528  strNetworkID = "regtest";
529 
530  genesis = CreateGenesisBlock(1454124731, 1, 0x207fffff, 1, 250 * COIN);
532  assert(consensus.hashGenesisBlock == uint256S("0x7445589c4c8e52b105247b13373e5ee325856aa05d53f429e59ea46b7149ae3f"));
533  assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
534 
537  consensus.powLimit = uint256S("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
538  consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
539  consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
540  consensus.nBudgetCycleBlocks = 144; // approx 10 cycles per day
541  consensus.nBudgetFeeConfirmations = 3; // (only 8-blocks window for finalization on regtest)
545  consensus.nMaxMoneyOut = 43199500 * COIN;
546  consensus.nMNCollateralAmt = 100 * COIN;
547  consensus.nMNBlockReward = 3 * COIN;
548  consensus.nNewMNBlockReward = 6 * COIN;
550  consensus.nProposalEstablishmentTime = 60 * 5; // at least 5 min old to make it into a budget
553  consensus.nTargetTimespan = 40 * 60;
554  consensus.nTargetTimespanV2 = 30 * 60;
555  consensus.nTargetSpacing = 1 * 60;
558 
559  /* Spork Key for RegTest:
560  WIF private key: 932HEevBSujW2ud7RfB1YF91AFygbBRQj3de3LyaCRqNzKKgWXi
561  private key hex: bd4960dcbd9e7f2223f24e7164ecb6f1fe96fc3a416f5d3a830ba5720c84b8ca
562  Address: yCvUVd72w7xpimf981m114FSFbmAmne7j9
563  */
564  consensus.strSporkPubKey = "043969b1b0e6f327de37f297a015d37e2235eaaeeb3933deecd8162c075cee0207b13537618bde640879606001a8136091c62ec272dd0133424a178704e6e75bb7";
568 
569  // height based activations
571  consensus.height_last_ZC_AccumCheckpoint = 310; // no checkpoints on regtest
573 
574  // Zerocoin-related params
575  consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
576  "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
577  "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
578  "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
579  "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
580  "31438167899885040445364023527381951378636564391212010397122822120720357";
581  consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
582  consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
584  consensus.ZC_MinMintFee = 1 * CENT;
586  consensus.ZC_TimeStart = 0; // not implemented on regtest
588 
589  // Network upgrades
611 
617  pchMessageStart[0] = 0xa1;
618  pchMessageStart[1] = 0xcf;
619  pchMessageStart[2] = 0x7e;
620  pchMessageStart[3] = 0xac;
621  nDefaultPort = 51476;
622 
623  base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
624  base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19); // Testnet pivx script addresses start with '8' or '9'
625  base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73); // starting with 'W'
626  base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1}; // EXT prefix for the address
627  base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239); // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
628  // Testnet pivx BIP32 pubkeys start with 'DRKV'
629  base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
630  // Testnet pivx BIP32 prvkeys start with 'DRKP'
631  base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
632  // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
633  base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
634 
635  // Reject non-standard transactions by default
636  fRequireStandard = true;
637 
638  // Sapling
639  bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ptestsapling";
640  bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "pviewtestsapling";
641  bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
642  bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-test";
643  bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviewtestsapling";
644 
645  bech32HRPs[BLS_SECRET_KEY] = "bls-sk-test";
646  bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk-test";
647 
648  // long living quorum params
649  consensus.llmqs[Consensus::LLMQ_TEST] = llmq_test;
651 
653 
654  // Tier two
655  nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
656  }
657 
659  {
660  return dataRegtest;
661  }
662 };
663 
664 static std::unique_ptr<CChainParams> globalChainParams;
665 
667 {
668  assert(globalChainParams);
669  return *globalChainParams;
670 }
671 
672 std::unique_ptr<CChainParams> CreateChainParams(const std::string& chain)
673 {
674  if (chain == CBaseChainParams::MAIN)
675  return std::unique_ptr<CChainParams>(new CMainParams());
676  else if (chain == CBaseChainParams::TESTNET)
677  return std::unique_ptr<CChainParams>(new CTestNetParams());
678  else if (chain == CBaseChainParams::REGTEST)
679  return std::unique_ptr<CChainParams>(new CRegTestParams());
680  throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain));
681 }
682 
683 void SelectParams(const std::string& network)
684 {
685  SelectBaseParams(network);
686  globalChainParams = CreateChainParams(network);
687 }
688 
690 {
691  globalChainParams->UpdateNetworkUpgradeParameters(idx, nActivationHeight);
692 }
int64_t CAmount
Amount in PIV (Can be negative)
Definition: amount.h:13
void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
Allows modifying the network upgrade regtest parameters.
void SelectParams(const std::string &network)
Sets the params returned by Params() to those for the given chain name.
const CChainParams & Params()
Return the currently selected parameters.
std::unique_ptr< CChainParams > CreateChainParams(const std::string &chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
std::map< int, uint256 > MapCheckpoints
Definition: chainparams.h:26
void SelectBaseParams(const std::string &chain)
Sets the params returned by Params() to those for the given network.
static const std::string REGTEST
static const std::string TESTNET
static const std::string MAIN
Chain name strings.
uint32_t nNonce
Definition: block.h:32
uint32_t nBits
Definition: block.h:31
uint32_t nTime
Definition: block.h:30
int32_t nVersion
Definition: block.h:27
uint256 hashPrevBlock
Definition: block.h:28
uint256 hashMerkleRoot
Definition: block.h:29
uint256 GetHash() const
Definition: block.cpp:15
Definition: block.h:80
std::vector< CTransactionRef > vtx
Definition: block.h:83
CChainParams defines various tweakable parameters of a given instance of the PIVX system.
Definition: chainparams.h:43
CBlock genesis
Definition: chainparams.h:109
int nLLMQConnectionRetryTimeout
Definition: chainparams.h:120
std::vector< uint8_t > vFixedSeeds
Definition: chainparams.h:116
@ SAPLING_PAYMENT_ADDRESS
Definition: chainparams.h:60
@ SAPLING_EXTENDED_SPEND_KEY
Definition: chainparams.h:63
@ SAPLING_EXTENDED_FVK
Definition: chainparams.h:64
@ SAPLING_INCOMING_VIEWING_KEY
Definition: chainparams.h:62
@ SAPLING_FULL_VIEWING_KEY
Definition: chainparams.h:61
int nFulfilledRequestExpireTime
Definition: chainparams.h:121
std::string strNetworkID
Definition: chainparams.h:108
std::vector< unsigned char > base58Prefixes[MAX_BASE58_TYPES]
Definition: chainparams.h:114
std::vector< CDNSSeedData > vSeeds
Definition: chainparams.h:113
void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
Definition: chainparams.cpp:38
Consensus::Params consensus
Definition: chainparams.h:110
bool fRequireStandard
Definition: chainparams.h:117
std::string bech32HRPs[MAX_BECH32_TYPES]
Definition: chainparams.h:115
bool IsRegTestNet() const
Definition: chainparams.h:98
CMessageHeader::MessageStartChars pchMessageStart
Definition: chainparams.h:111
const CCheckpointData & Checkpoints() const
Regression test.
const CCheckpointData & Checkpoints() const
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:381
Testnet (v5)
const CCheckpointData & Checkpoints() const
void SetNull()
Definition: uint256.h:44
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:154
UpgradeIndex
Index into Params.vUpgrades and NetworkUpgradeInfo.
Definition: params.h:26
@ UPGRADE_TESTDUMMY
Definition: params.h:42
@ UPGRADE_V4_0
Definition: params.h:35
@ BASE_NETWORK
Definition: params.h:27
@ UPGRADE_V3_4
Definition: params.h:34
@ UPGRADE_V6_0
Definition: params.h:41
@ UPGRADE_V5_3
Definition: params.h:38
@ MAX_NETWORK_UPGRADES
Definition: params.h:44
@ UPGRADE_POS_V2
Definition: params.h:29
@ UPGRADE_POS
Definition: params.h:28
@ UPGRADE_V5_0
Definition: params.h:36
@ UPGRADE_V5_5
Definition: params.h:39
@ UPGRADE_BIP65
Definition: params.h:32
@ UPGRADE_ZC_V2
Definition: params.h:31
@ UPGRADE_V5_2
Definition: params.h:37
@ UPGRADE_V5_6
Definition: params.h:40
@ UPGRADE_ZC_PUBLIC
Definition: params.h:33
@ UPGRADE_ZC
Definition: params.h:30
@ LLMQ_400_85
Definition: params.h:95
@ LLMQ_50_60
Definition: params.h:93
@ LLMQ_TEST
Definition: params.h:98
@ LLMQ_400_60
Definition: params.h:94
@ OP_CHECKSIG
Definition: script.h:166
A mutable version of CTransaction.
Definition: transaction.h:409
std::vector< CTxOut > vout
Definition: transaction.h:411
std::vector< CTxIn > vin
Definition: transaction.h:410
static constexpr int ALWAYS_ACTIVE
Special value for nActivationHeight indicating that the upgrade is always active.
Definition: params.h:67
int nActivationHeight
Height of the first block for which the new consensus rules will be active.
Definition: params.h:56
static constexpr int NO_ACTIVATION_HEIGHT
Special value for nActivationHeight indicating that the upgrade will never activate.
Definition: params.h:74
Optional< uint256 > hashActivationBlock
The hash of the block at height nActivationHeight, if known.
Definition: params.h:86
uint256 posLimitV1
Definition: params.h:176
int64_t nTime_EnforceNewSporkKey
Definition: params.h:200
LLMQType llmqTypeChainLocks
Definition: params.h:281
int ZC_MinMintConfirmations
Definition: params.h:254
CAmount ZC_MinMintFee
Definition: params.h:255
CAmount nNewMNBlockReward
Definition: params.h:187
int ZC_MinStakeDepth
Definition: params.h:256
int64_t nTargetTimespanV2
Definition: params.h:192
uint256 posLimitV2
Definition: params.h:177
int nMNCollateralMinConf
Definition: params.h:185
CAmount nMaxMoneyOut
Definition: params.h:183
CAmount nMNCollateralAmt
Definition: params.h:184
int ZC_MaxSpendsPerTx
Definition: params.h:253
int64_t nPivxBadBlockTime
Definition: params.h:209
int64_t nTargetTimespan
Definition: params.h:191
int nTimeSlotLength
Definition: params.h:194
CAmount nMNBlockReward
Definition: params.h:186
std::string ZC_Modulus
Definition: params.h:251
int nFutureTimeDriftPoS
Definition: params.h:182
int64_t nProposalEstablishmentTime
Definition: params.h:188
int64_t nTargetSpacing
Definition: params.h:193
uint256 hashGenesisBlock
Definition: params.h:172
NetworkUpgrade vUpgrades[MAX_NETWORK_UPGRADES]
Definition: params.h:213
bool fPowNoRetargeting
Definition: params.h:174
int64_t nTime_RejectOldSporkKey
Definition: params.h:201
std::string strSporkPubKey
Definition: params.h:198
int ZC_HeightStart
Definition: params.h:258
std::string strSporkPubKeyOld
Definition: params.h:199
int ZC_MaxPublicSpendsPerTx
Definition: params.h:252
uint256 powLimit
Definition: params.h:175
int nCoinbaseMaturity
Definition: params.h:180
unsigned int nPivxBadBlockBits
Definition: params.h:210
int nMaxProposalPayments
Definition: params.h:195
int nBudgetFeeConfirmations
Definition: params.h:179
int height_last_ZC_WrappedSerials
Definition: params.h:206
int nStakeMinDepth
Definition: params.h:190
int height_last_ZC_AccumCheckpoint
Definition: params.h:205
int nBudgetCycleBlocks
Definition: params.h:178
int height_last_invalid_UTXO
Definition: params.h:204
int nFutureTimeDriftPoW
Definition: params.h:181
bool fPowAllowMinDifficultyBlocks
Definition: params.h:173
std::map< LLMQType, LLMQParams > llmqs
Definition: params.h:279
#define strprintf
Definition: tinyformat.h:1056
uint256 uint256S(const char *str)
Definition: uint256.h:157
std::vector< unsigned char > ParseHex(const char *psz)