Line data Source code
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 1017 : 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 1017 : CMutableTransaction txNew;
20 1017 : txNew.nVersion = 1;
21 1017 : txNew.vin.resize(1);
22 1017 : txNew.vout.resize(1);
23 2034 : txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
24 1017 : txNew.vout[0].nValue = genesisReward;
25 1017 : txNew.vout[0].scriptPubKey = genesisOutputScript;
26 :
27 1017 : CBlock genesis;
28 2034 : genesis.vtx.push_back(std::make_shared<const CTransaction>(std::move(txNew)));
29 1017 : genesis.hashPrevBlock.SetNull();
30 1017 : genesis.nVersion = nVersion;
31 1017 : genesis.nTime = nTime;
32 1017 : genesis.nBits = nBits;
33 1017 : genesis.nNonce = nNonce;
34 1017 : genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
35 1017 : return genesis;
36 : }
37 :
38 434 : void CChainParams::UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
39 : {
40 434 : assert(IsRegTestNet()); // only available for regtest
41 434 : assert(idx > Consensus::BASE_NETWORK && idx < Consensus::MAX_NETWORK_UPGRADES);
42 434 : consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
43 434 : }
44 :
45 : /**
46 : * Build the genesis block. Note that the output of the genesis coinbase cannot
47 : * be spent as it did not originally exist in the database.
48 : *
49 : * CBlock(hash=00000ffd590b14, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=e0028e, nTime=1390095618, nBits=1e0ffff0, nNonce=28917698, vtx=1)
50 : * CTransaction(hash=e0028e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
51 : * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d01044c5957697265642030392f4a616e2f3230313420546865204772616e64204578706572696d656e7420476f6573204c6976653a204f76657273746f636b2e636f6d204973204e6f7720416363657074696e6720426974636f696e73)
52 : * CTxOut(nValue=50.00000000, scriptPubKey=0xA9037BAC7050C479B121CF)
53 : * vMerkleTree: e0028e
54 : */
55 1017 : static CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
56 : {
57 1017 : const char* pszTimestamp = "U.S. News & World Report Jan 28 2016 With His Absence, Trump Dominates Another Debate";
58 2034 : const CScript genesisOutputScript = CScript() << ParseHex("04c10e83b2703ccf322f7dbd62dd5855ac7c10bd055814ce121ba32607d573b8810c02c0582aed05b4deb9c4b77b26d92428c61256cd42774babea0a073b2ed0c9") << OP_CHECKSIG;
59 2034 : return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
60 : }
61 :
62 : // this one is for testing only
63 : static Consensus::LLMQParams llmq_test = {
64 : .type = Consensus::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 : // Small quorum for networks with a masternode count in the tens. Sized well below
85 : // the fleet so that membership actually rotates between DKGs instead of every
86 : // masternode landing in every quorum.
87 : static Consensus::LLMQParams llmq20_60 = {
88 : .type = Consensus::LLMQ_20_60,
89 : .name = "llmq_20_60",
90 : .size = 20,
91 : .minSize = 16,
92 : .threshold = 12,
93 :
94 : .dkgInterval = 60, // one DKG per hour
95 : .dkgPhaseBlocks = 6,
96 : .dkgMiningWindowStart = 30, // dkgPhaseBlocks * 5 = after finalization
97 : .dkgMiningWindowEnd = 40,
98 : .dkgBadVotesThreshold = 16,
99 :
100 : .signingActiveQuorumCount = 24, // a full day worth of LLMQs
101 :
102 : .keepOldConnections = 25,
103 : .recoveryMembers = 10,
104 :
105 : .cacheDkgInterval = 600,
106 : };
107 :
108 : static Consensus::LLMQParams llmq50_60 = {
109 : .type = Consensus::LLMQ_50_60,
110 : .name = "llmq_50_60",
111 : .size = 50,
112 : .minSize = 40,
113 : .threshold = 30,
114 :
115 : .dkgInterval = 60, // one DKG per hour
116 : .dkgPhaseBlocks = 6,
117 : .dkgMiningWindowStart = 30, // dkgPhaseBlocks * 5 = after finalization
118 : .dkgMiningWindowEnd = 40,
119 : .dkgBadVotesThreshold = 40,
120 :
121 : .signingActiveQuorumCount = 24, // a full day worth of LLMQs
122 :
123 : .keepOldConnections = 25,
124 : .recoveryMembers = 25,
125 :
126 : .cacheDkgInterval = 600,
127 : };
128 :
129 : static Consensus::LLMQParams llmq400_60 = {
130 : .type = Consensus::LLMQ_400_60,
131 : .name = "llmq_400_60",
132 : .size = 400,
133 : .minSize = 300,
134 : .threshold = 240,
135 :
136 : .dkgInterval = 60 * 12, // one DKG every 12 hours
137 : .dkgPhaseBlocks = 10,
138 : .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
139 : .dkgMiningWindowEnd = 70,
140 : .dkgBadVotesThreshold = 300,
141 :
142 : .signingActiveQuorumCount = 4, // two days worth of LLMQs
143 :
144 : .keepOldConnections = 5,
145 : .recoveryMembers = 100,
146 :
147 : .cacheDkgInterval = 60 * 12 * 10, // dkgInterval * 10
148 : };
149 :
150 : // Used for deployment and min-proto-version signaling, so it needs a higher threshold
151 : static Consensus::LLMQParams llmq400_85 = {
152 : .type = Consensus::LLMQ_400_85,
153 : .name = "llmq_400_85",
154 : .size = 400,
155 : .minSize = 350,
156 : .threshold = 340,
157 :
158 : .dkgInterval = 60 * 24, // one DKG every 24 hours
159 : .dkgPhaseBlocks = 10,
160 : .dkgMiningWindowStart = 50, // dkgPhaseBlocks * 5 = after finalization
161 : .dkgMiningWindowEnd = 70, // give it a larger mining window to make sure it is mined
162 : .dkgBadVotesThreshold = 300,
163 :
164 : .signingActiveQuorumCount = 4, // four days worth of LLMQs
165 :
166 : .keepOldConnections = 5,
167 : .recoveryMembers = 100,
168 :
169 : .cacheDkgInterval = 60 * 24 * 10, // dkgInterval * 10
170 : };
171 :
172 : /**
173 : * Main network
174 : */
175 : /**
176 : * What makes a good checkpoint block?
177 : * + Is surrounded by blocks with reasonable timestamps
178 : * (no blocks before with a timestamp after, none after with
179 : * timestamp before)
180 : * + Contains no strange transactions
181 : */
182 : static MapCheckpoints mapCheckpoints = {
183 : { 259201, uint256S("1c9121bf9329a6234bfd1ea2d91515f19cd96990725265253f4b164283ade5dd")},
184 : { 424998, uint256S("f31e381eedb0ed3ed65fcc98cc71f36012bee32e8efd017c4f9fb0620fd35f6b")},
185 : { 616764, uint256S("29dd0bd1c59484f290896687b4ffb6a49afa5c498caf61967c69a541f8191557")}, //!< First block to use new modifierV1
186 : { 623933, uint256S("c7aafa648a0f1450157dc93bd4d7448913a85b7448f803b4ab970d91fc2a7da7")},
187 : { 791150, uint256S("8e76f462e4e82d1bd21cb72e1ce1567d4ddda2390f26074ffd1f5d9c270e5e50")},
188 : { 795000, uint256S("4423cceeb9fd574137a18733416275a70fdf95283cc79ad976ca399aa424a443")},
189 : { 863787, uint256S("5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64")},
190 : { 863795, uint256S("2ad866818c4866e0d555181daccc628056216c0db431f88a825e84ed4f469067")},
191 : { 863805, uint256S("a755bd9a22b63c70d3db474f4b2b61a1f86c835b290a081bb3ec1ba2103eb4cb")},
192 : { 867733, uint256S("03b26296bf693de5782c76843d2fb649cb66d4b05550c6a79c047ff7e1c3ae15")},
193 : { 879650, uint256S("227e1d2b738b6cd83c46d1d64617934ec899d77cee34336a56e61b71acd10bb2")},
194 : { 895400, uint256S("7796a0274a608fac12d400198174e50beda992c1d522e52e5b95b884bc1beac6")}, //!< Block that serial# range is enforced
195 : { 895991, uint256S("d53013ed7ea5c325b9696c95e07667d6858f8ff7ee13fecfa90827bf3c9ae316")}, //!< Network split here
196 : { 908000, uint256S("202708f8c289b676fceb832a079ff6b308a28608339acbf7584de533619d014d")},
197 : {1142400, uint256S("98aff9d605bf123247f98b1e3a02567eb5799d208d78ec30fb89737b1c1f79c5")},
198 : {1679090, uint256S("f747ce055ba1b12e1f2e842bd480bc647210799359cb2e553ab292065e3419d6")}, //!< First block with a "wrapped" serial spend
199 : {1686229, uint256S("bb42bf1e886a7c23474634c90893dd3d68a6ccbfea4ac92a98da5cad0c6a6cb7")}, //!< Last block in the "wrapped" serial attack range
200 : {1778954, uint256S("0d3241268264a2908d6babf00d9cd1ffb83d93d7bb4e428820127fe227c2029c")}, //!< Network split here
201 : {1788528, uint256S("ea9243ff8fc079fdd7a04f11fac415de4d98e1bb0dc38db6f79f8f8bbfdbe496")}, //!< Network split here
202 : {2153200, uint256S("14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5")}, //!< First v7 block
203 : {2356049, uint256S("62e80d8e193bca84655fb78893b20f54a79f2d71124c4ea37b7ef51a0d5451c4")}, //!< Network split here
204 : {2365700, uint256S("b5d0beead57735539abc2db2b0b08cd65db3e5928efd3c3bf3182d5bf013f36c")}, //!< PIVX v4.1.1 enforced
205 : {2678402, uint256S("580a26ff0a45177a7a6f387f009c5b26140ea48b4790a857d9a796f8b3c25899")}, //!< Network split here
206 : {3014000, uint256S("78ad99b7225f73c42238bd7ca841ff700542b92bba75a0ef2ed351caa560f87f")}, //!< PIVX v5.3.0 enforced
207 : {3024000, uint256S("be4bc75afcfb9136924810f7483b2695089a366cc4ee27fd6dc3ecd5396e1f0f")}, //!< Superblock
208 : {3715200, uint256S("a676b9a598c393c82b949c37dd35013aeda55f5d18ab062349db6a8235972aaa")}, //!< Superblock for 5.5.0 mainnet rewards changeover
209 : };
210 :
211 : static const CCheckpointData data = {
212 : &mapCheckpoints,
213 : 1591401645, // * UNIX timestamp of last checkpoint block
214 : 5607713, // * total number of transactions between genesis and last checkpoint
215 : // (the tx=... number in the UpdateTip debug.log lines)
216 : 3000 // * estimated number of transactions per day after checkpoint
217 : };
218 :
219 : static MapCheckpoints mapCheckpointsTestnet = {
220 : {0, uint256S("0x00000f254358fe046377c224341c794b7faf942a6311a7ece773d3c378239c54")},
221 : };
222 :
223 : static const CCheckpointData dataTestnet = {
224 : &mapCheckpointsTestnet,
225 : 1777507200, // * UNIX timestamp of testnet6 genesis block (April 30, 2026)
226 : 0, // * total number of transactions between genesis and last checkpoint (fresh start)
227 : 250}; // * estimated number of transactions per day after checkpoint
228 :
229 : static MapCheckpoints mapCheckpointsRegtest = {{0, uint256S("0x001")}};
230 : static const CCheckpointData dataRegtest = {
231 : &mapCheckpointsRegtest,
232 : 1454124731,
233 : 0,
234 : 100};
235 :
236 : class CMainParams : public CChainParams
237 : {
238 : public:
239 532 : CMainParams()
240 532 : {
241 532 : strNetworkID = "main";
242 :
243 532 : genesis = CreateGenesisBlock(1454124731, 2402015, 0x1e0ffff0, 1, 250 * COIN);
244 532 : consensus.hashGenesisBlock = genesis.GetHash();
245 1064 : assert(consensus.hashGenesisBlock == uint256S("0x0000041e482b9b9691d98eefb48473405c0b8ec31b76df3797c74a78680ef818"));
246 1064 : assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
247 :
248 532 : consensus.fPowAllowMinDifficultyBlocks = false;
249 532 : consensus.fPowNoRetargeting = false;
250 532 : consensus.powLimit = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
251 532 : consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
252 532 : consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
253 532 : consensus.nBudgetCycleBlocks = 43200; // approx. 1 every 30 days
254 532 : consensus.nBudgetFeeConfirmations = 6; // Number of confirmations for the finalization fee
255 532 : consensus.nCoinbaseMaturity = 100;
256 532 : consensus.nFutureTimeDriftPoW = 7200;
257 532 : consensus.nFutureTimeDriftPoS = 180;
258 532 : consensus.nMaxMoneyOut = 21000000 * COIN;
259 532 : consensus.nMNCollateralAmt = 10000 * COIN;
260 532 : consensus.nMNBlockReward = 3 * COIN;
261 532 : consensus.nNewMNBlockReward = 6 * COIN;
262 532 : consensus.nMNCollateralMinConf = 15;
263 532 : consensus.nProposalEstablishmentTime = 60 * 60 * 24; // must be at least a day old to make it into a budget
264 532 : consensus.nStakeMinAge = 60 * 60;
265 532 : consensus.nStakeMinDepth = 600;
266 532 : consensus.nTargetTimespan = 40 * 60;
267 532 : consensus.nTargetTimespanV2 = 30 * 60;
268 532 : consensus.nTargetSpacing = 1 * 60;
269 532 : consensus.nTimeSlotLength = 15;
270 532 : consensus.nMaxProposalPayments = 6;
271 :
272 : // spork keys
273 532 : consensus.strSporkPubKey = "0410050aa740d280b134b40b40658781fc1116ba7700764e0ce27af3e1737586b3257d19232e0cb5084947f5107e44bcd577f126c9eb4a30ea2807b271d2145298";
274 532 : consensus.strSporkPubKeyOld = "040F129DE6546FE405995329A887329BED4321325B1A73B0A257423C05C1FCFE9E40EF0678AEF59036A22C42E61DFD29DF7EFB09F56CC73CADF64E05741880E3E7";
275 532 : consensus.nTime_EnforceNewSporkKey = 1608512400; //!> December 21, 2020 01:00:00 AM GMT
276 532 : consensus.nTime_RejectOldSporkKey = 1614560400; //!> March 1, 2021 01:00:00 AM GMT
277 :
278 : // height-based activations
279 532 : consensus.height_last_invalid_UTXO = 894538;
280 532 : consensus.height_last_ZC_AccumCheckpoint = 1686240;
281 532 : consensus.height_last_ZC_WrappedSerials = 1686229;
282 :
283 : // validation by-pass
284 532 : consensus.nPivxBadBlockTime = 1471401614; // Skip nBit validation of Block 259201 per PR #915
285 532 : consensus.nPivxBadBlockBits = 0x1c056dac; // Skip nBit validation of Block 259201 per PR #915
286 :
287 : // Zerocoin-related params
288 532 : consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
289 : "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
290 : "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
291 : "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
292 : "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
293 532 : "31438167899885040445364023527381951378636564391212010397122822120720357";
294 532 : consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
295 532 : consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
296 532 : consensus.ZC_MinMintConfirmations = 20;
297 532 : consensus.ZC_MinMintFee = 1 * CENT;
298 532 : consensus.ZC_MinStakeDepth = 200;
299 532 : consensus.ZC_TimeStart = 1508214600; // October 17, 2017 4:30:00 AM
300 532 : consensus.ZC_HeightStart = 863735;
301 :
302 : // Network upgrades
303 532 : consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
304 : Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
305 532 : consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
306 : Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
307 532 : consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight = 259201;
308 532 : consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight = 615800;
309 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight = 863787;
310 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight = 1153160;
311 532 : consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight = 1808634;
312 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight = 1880000;
313 532 : consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight = 1967000;
314 532 : consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight = 2153200;
315 532 : consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight = 2700500;
316 532 : consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight = 2927000;
317 532 : consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight = 3014000;
318 532 : consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 3715200;
319 532 : consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight = 4281680; // Estimate Feb 29th 12:00 UTC
320 532 : consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight =
321 : Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
322 :
323 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC].hashActivationBlock =
324 532 : uint256S("0x5b2482eca24caf2a46bb22e0545db7b7037282733faa3a42ec20542509999a64");
325 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].hashActivationBlock =
326 532 : uint256S("0x37ea75fe1c9314171cff429a91b25b9f11331076d1c9de50ee4054d61877f8af");
327 532 : consensus.vUpgrades[Consensus::UPGRADE_BIP65].hashActivationBlock =
328 532 : uint256S("0x82629b7a9978f5c7ea3f70a12db92633a7d2e436711500db28b97efd48b1e527");
329 532 : consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].hashActivationBlock =
330 532 : uint256S("0xe2448b76d88d37aba4194ffed1041b680d779919157ddf5cbf423373d7f8078e");
331 532 : consensus.vUpgrades[Consensus::UPGRADE_V3_4].hashActivationBlock =
332 532 : uint256S("0x0ef2556e40f3b9f6e02ce611b832e0bbfe7734a8ea751c7b555310ee49b61456");
333 532 : consensus.vUpgrades[Consensus::UPGRADE_V4_0].hashActivationBlock =
334 532 : uint256S("0x14e477e597d24549cac5e59d97d32155e6ec2861c1003b42d0566f9bf39b65d5");
335 :
336 : /**
337 : * The message start string is designed to be unlikely to occur in normal data.
338 : * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
339 : * a large 4-byte int at any alignment.
340 : */
341 532 : pchMessageStart[0] = 0x90;
342 532 : pchMessageStart[1] = 0xc4;
343 532 : pchMessageStart[2] = 0xfd;
344 532 : pchMessageStart[3] = 0xe9;
345 532 : nDefaultPort = 51472;
346 :
347 : // Note that of those with the service bits flag, most only support a subset of possible options
348 532 : vSeeds.emplace_back("pivx.seed.fuzzbawls.pw", true); // Primary DNS Seeder from Fuzzbawls
349 532 : vSeeds.emplace_back("pivx.seed2.fuzzbawls.pw", true); // Secondary DNS Seeder from Fuzzbawls
350 532 : vSeeds.emplace_back("dnsseed.liquid369.wtf", true); // Primary DNS Seeder from Liquid369
351 :
352 532 : base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 30);
353 532 : base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 13);
354 532 : base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 63); // starting with 'S'
355 532 : base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xa2}; // starts with EXM
356 532 : base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 212);
357 532 : base58Prefixes[EXT_PUBLIC_KEY] = {0x02, 0x2D, 0x25, 0x33};
358 532 : base58Prefixes[EXT_SECRET_KEY] = {0x02, 0x21, 0x31, 0x2B};
359 : // BIP44 coin type is from https://github.com/satoshilabs/slips/blob/master/slip-0044.md
360 532 : base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x77};
361 :
362 532 : vFixedSeeds = std::vector<uint8_t>(std::begin(chainparams_seed_main), std::end(chainparams_seed_main));
363 :
364 : // Reject non-standard transactions by default
365 532 : fRequireStandard = true;
366 :
367 : // Sapling
368 532 : bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ps";
369 532 : bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "pviews";
370 532 : bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivks";
371 532 : bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-main";
372 532 : bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviews";
373 :
374 532 : bech32HRPs[BLS_SECRET_KEY] = "bls-sk";
375 532 : bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk";
376 :
377 : // long living quorum params
378 532 : consensus.llmqs[Consensus::LLMQ_50_60] = llmq50_60;
379 532 : consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
380 532 : consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
381 :
382 532 : nLLMQConnectionRetryTimeout = 60;
383 :
384 532 : consensus.llmqTypeChainLocks = Consensus::LLMQ_400_60;
385 :
386 : // Tier two
387 532 : nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
388 532 : }
389 :
390 2317 : const CCheckpointData& Checkpoints() const
391 : {
392 2317 : return data;
393 : }
394 :
395 : };
396 :
397 : /**
398 : * Testnet (v6)
399 : */
400 : class CTestNetParams : public CChainParams
401 : {
402 : public:
403 52 : CTestNetParams()
404 52 : {
405 52 : strNetworkID = "test";
406 :
407 : // Testnet6 genesis - April 30, 2026.
408 52 : genesis = CreateGenesisBlock(1777507200, 498658, 0x1e0ffff0, 1, 250 * COIN);
409 52 : consensus.hashGenesisBlock = genesis.GetHash();
410 104 : assert(consensus.hashGenesisBlock == uint256S("0x00000f254358fe046377c224341c794b7faf942a6311a7ece773d3c378239c54"));
411 104 : assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
412 :
413 52 : consensus.fPowAllowMinDifficultyBlocks = true;
414 52 : consensus.fPowNoRetargeting = false;
415 52 : consensus.powLimit = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
416 52 : consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
417 52 : consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
418 52 : consensus.nBudgetCycleBlocks = 144; // approx 10 cycles per day
419 52 : consensus.nBudgetFeeConfirmations = 3; // (only 8-blocks window for finalization on testnet)
420 52 : consensus.nCoinbaseMaturity = 15;
421 52 : consensus.nFutureTimeDriftPoW = 7200;
422 52 : consensus.nFutureTimeDriftPoS = 180;
423 52 : consensus.nMaxMoneyOut = 21000000 * COIN;
424 52 : consensus.nMNCollateralAmt = 10000 * COIN;
425 52 : consensus.nMNBlockReward = 3 * COIN;
426 52 : consensus.nNewMNBlockReward = 6 * COIN;
427 52 : consensus.nMNCollateralMinConf = 15;
428 52 : consensus.nProposalEstablishmentTime = 60 * 5; // at least 5 min old to make it into a budget
429 52 : consensus.nStakeMinAge = 60 * 60;
430 52 : consensus.nStakeMinDepth = 100;
431 52 : consensus.nTargetTimespan = 40 * 60;
432 52 : consensus.nTargetTimespanV2 = 30 * 60;
433 52 : consensus.nTargetSpacing = 1 * 60;
434 52 : consensus.nTimeSlotLength = 15;
435 52 : consensus.nMaxProposalPayments = 20;
436 :
437 : // spork keys
438 52 : consensus.strSporkPubKey = "04b6f3a15c8c465ac1c799e04fe79e351db3c7815aa33d70656f0bc5e3688da22bc13886ead5d2ad2307a93590ee04ad176e95c336ab179a21faf064255d79cb39";
439 52 : consensus.strSporkPubKeyOld = "04E88BB455E2A04E65FCC41D88CD367E9CCE1F5A409BE94D8C2B4B35D223DED9C8E2F4E061349BA3A38839282508066B6DC4DB72DD432AC4067991E6BF20176127";
440 52 : consensus.nTime_EnforceNewSporkKey = 1608512400; //!> December 21, 2020 01:00:00 AM GMT
441 52 : consensus.nTime_RejectOldSporkKey = 1614560400; //!> March 1, 2021 01:00:00 AM GMT
442 :
443 : // height based activations
444 52 : consensus.height_last_invalid_UTXO = -1;
445 52 : consensus.height_last_ZC_AccumCheckpoint = -1;
446 52 : consensus.height_last_ZC_WrappedSerials = -1;
447 52 : consensus.ZC_HeightStart = 0;
448 :
449 : // Zerocoin-related params
450 52 : consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
451 : "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
452 : "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
453 : "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
454 : "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
455 52 : "31438167899885040445364023527381951378636564391212010397122822120720357";
456 52 : consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
457 52 : consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
458 52 : consensus.ZC_MinMintConfirmations = 20;
459 52 : consensus.ZC_MinMintFee = 1 * CENT;
460 52 : consensus.ZC_MinStakeDepth = 200;
461 52 : consensus.ZC_TimeStart = 1508214600; // October 17, 2017 4:30:00 AM
462 :
463 : // Network upgrades
464 52 : consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
465 : Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
466 52 : consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
467 : Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
468 52 : consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight = 201;
469 52 : consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight = 225;
470 52 : consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight = 250;
471 52 : consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight = 275;
472 52 : consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight = 300;
473 52 : consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight = 350;
474 52 : consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight = 400;
475 52 : consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight = 450;
476 52 : consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight = 500;
477 52 : consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight = 550;
478 52 : consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight = 600;
479 52 : consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 650;
480 52 : consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight = 700;
481 52 : consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight = 5000;
482 :
483 : /**
484 : * The message start string is designed to be unlikely to occur in normal data.
485 : * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
486 : * a large 4-byte int at any alignment.
487 : */
488 52 : pchMessageStart[0] = 0xf6;
489 52 : pchMessageStart[1] = 0xe7;
490 52 : pchMessageStart[2] = 0xd6;
491 52 : pchMessageStart[3] = 0xcb;
492 52 : nDefaultPort = 51474;
493 :
494 : // nodes with support for servicebits filtering should be at the top
495 52 : vSeeds.emplace_back("pivx-testnet.seed.fuzzbawls.pw", true);
496 52 : vSeeds.emplace_back("pivx-testnet.seed2.fuzzbawls.pw", true);
497 :
498 52 : base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
499 52 : base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19); // Testnet pivx script addresses start with '8' or '9'
500 52 : base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73); // starting with 'W'
501 52 : base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1}; // EXT prefix for the address
502 52 : base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239); // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
503 : // Testnet pivx BIP32 pubkeys start with 'DRKV'
504 52 : base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
505 : // Testnet pivx BIP32 prvkeys start with 'DRKP'
506 52 : base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
507 : // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
508 52 : base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
509 :
510 52 : vFixedSeeds.clear(); // Testnet6 - no fixed seeds yet
511 :
512 52 : fRequireStandard = false;
513 :
514 : // Sapling
515 52 : bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ptestsapling";
516 52 : bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "pviewtestsapling";
517 52 : bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
518 52 : bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-test";
519 52 : bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviewtestsapling";
520 :
521 52 : bech32HRPs[BLS_SECRET_KEY] = "bls-sk-test";
522 52 : bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk-test";
523 :
524 : // long living quorum params
525 52 : consensus.llmqs[Consensus::LLMQ_20_60] = llmq20_60;
526 52 : consensus.llmqs[Consensus::LLMQ_50_60] = llmq50_60;
527 52 : consensus.llmqs[Consensus::LLMQ_400_60] = llmq400_60;
528 52 : consensus.llmqs[Consensus::LLMQ_400_85] = llmq400_85;
529 :
530 52 : nLLMQConnectionRetryTimeout = 60;
531 :
532 52 : consensus.llmqTypeChainLocks = Consensus::LLMQ_20_60;
533 :
534 : // Tier two
535 52 : nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
536 52 : }
537 :
538 4 : const CCheckpointData& Checkpoints() const
539 : {
540 4 : return dataTestnet;
541 : }
542 : };
543 :
544 : /**
545 : * Regression test
546 : */
547 : class CRegTestParams : public CChainParams
548 : {
549 : public:
550 433 : CRegTestParams()
551 433 : {
552 433 : strNetworkID = "regtest";
553 :
554 433 : genesis = CreateGenesisBlock(1454124731, 1, 0x207fffff, 1, 250 * COIN);
555 433 : consensus.hashGenesisBlock = genesis.GetHash();
556 866 : assert(consensus.hashGenesisBlock == uint256S("0x7445589c4c8e52b105247b13373e5ee325856aa05d53f429e59ea46b7149ae3f"));
557 866 : assert(genesis.hashMerkleRoot == uint256S("0x1b2ef6e2f28be914103a277377ae7729dcd125dfeb8bf97bd5964ba72b6dc39b"));
558 :
559 433 : consensus.fPowAllowMinDifficultyBlocks = true;
560 433 : consensus.fPowNoRetargeting = true;
561 433 : consensus.powLimit = uint256S("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
562 433 : consensus.posLimitV1 = uint256S("0x000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
563 433 : consensus.posLimitV2 = uint256S("0x00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
564 433 : consensus.nBudgetCycleBlocks = 144; // approx 10 cycles per day
565 433 : consensus.nBudgetFeeConfirmations = 3; // (only 8-blocks window for finalization on regtest)
566 433 : consensus.nCoinbaseMaturity = 100;
567 433 : consensus.nFutureTimeDriftPoW = 7200;
568 433 : consensus.nFutureTimeDriftPoS = 180;
569 433 : consensus.nMaxMoneyOut = 43199500 * COIN;
570 433 : consensus.nMNCollateralAmt = 100 * COIN;
571 433 : consensus.nMNBlockReward = 3 * COIN;
572 433 : consensus.nNewMNBlockReward = 6 * COIN;
573 433 : consensus.nMNCollateralMinConf = 1;
574 433 : consensus.nProposalEstablishmentTime = 60 * 5; // at least 5 min old to make it into a budget
575 433 : consensus.nStakeMinAge = 0;
576 433 : consensus.nStakeMinDepth = 20;
577 433 : consensus.nTargetTimespan = 40 * 60;
578 433 : consensus.nTargetTimespanV2 = 30 * 60;
579 433 : consensus.nTargetSpacing = 1 * 60;
580 433 : consensus.nTimeSlotLength = 15;
581 433 : consensus.nMaxProposalPayments = 20;
582 :
583 : /* Spork Key for RegTest:
584 : WIF private key: 932HEevBSujW2ud7RfB1YF91AFygbBRQj3de3LyaCRqNzKKgWXi
585 : private key hex: bd4960dcbd9e7f2223f24e7164ecb6f1fe96fc3a416f5d3a830ba5720c84b8ca
586 : Address: yCvUVd72w7xpimf981m114FSFbmAmne7j9
587 : */
588 433 : consensus.strSporkPubKey = "043969b1b0e6f327de37f297a015d37e2235eaaeeb3933deecd8162c075cee0207b13537618bde640879606001a8136091c62ec272dd0133424a178704e6e75bb7";
589 433 : consensus.strSporkPubKeyOld = "";
590 433 : consensus.nTime_EnforceNewSporkKey = 0;
591 433 : consensus.nTime_RejectOldSporkKey = 0;
592 :
593 : // height based activations
594 433 : consensus.height_last_invalid_UTXO = -1;
595 433 : consensus.height_last_ZC_AccumCheckpoint = 310; // no checkpoints on regtest
596 433 : consensus.height_last_ZC_WrappedSerials = -1;
597 :
598 : // Zerocoin-related params
599 433 : consensus.ZC_Modulus = "25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784"
600 : "4069182906412495150821892985591491761845028084891200728449926873928072877767359714183472702618963750149718246911"
601 : "6507761337985909570009733045974880842840179742910064245869181719511874612151517265463228221686998754918242243363"
602 : "7259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133"
603 : "8441436038339044149526344321901146575444541784240209246165157233507787077498171257724679629263863563732899121548"
604 433 : "31438167899885040445364023527381951378636564391212010397122822120720357";
605 433 : consensus.ZC_MaxPublicSpendsPerTx = 637; // Assume about 220 bytes each input
606 433 : consensus.ZC_MaxSpendsPerTx = 7; // Assume about 20kb each input
607 433 : consensus.ZC_MinMintConfirmations = 10;
608 433 : consensus.ZC_MinMintFee = 1 * CENT;
609 433 : consensus.ZC_MinStakeDepth = 10;
610 433 : consensus.ZC_TimeStart = 0; // not implemented on regtest
611 433 : consensus.ZC_HeightStart = 0;
612 :
613 : // Network upgrades
614 433 : consensus.vUpgrades[Consensus::BASE_NETWORK].nActivationHeight =
615 : Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
616 433 : consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
617 : Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
618 433 : consensus.vUpgrades[Consensus::UPGRADE_POS].nActivationHeight = 251;
619 433 : consensus.vUpgrades[Consensus::UPGRADE_POS_V2].nActivationHeight = 251;
620 433 : consensus.vUpgrades[Consensus::UPGRADE_ZC].nActivationHeight = 300;
621 433 : consensus.vUpgrades[Consensus::UPGRADE_ZC_V2].nActivationHeight = 300;
622 433 : consensus.vUpgrades[Consensus::UPGRADE_BIP65].nActivationHeight =
623 : Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
624 433 : consensus.vUpgrades[Consensus::UPGRADE_ZC_PUBLIC].nActivationHeight = 400;
625 433 : consensus.vUpgrades[Consensus::UPGRADE_V3_4].nActivationHeight = 251;
626 433 : consensus.vUpgrades[Consensus::UPGRADE_V4_0].nActivationHeight =
627 : Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
628 433 : consensus.vUpgrades[Consensus::UPGRADE_V5_0].nActivationHeight = 300;
629 433 : consensus.vUpgrades[Consensus::UPGRADE_V5_2].nActivationHeight = 300;
630 433 : consensus.vUpgrades[Consensus::UPGRADE_V5_3].nActivationHeight = 251;
631 433 : consensus.vUpgrades[Consensus::UPGRADE_V5_5].nActivationHeight = 576;
632 433 : consensus.vUpgrades[Consensus::UPGRADE_V5_6].nActivationHeight = 1000;
633 433 : consensus.vUpgrades[Consensus::UPGRADE_V6_0].nActivationHeight =
634 : Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
635 :
636 : /**
637 : * The message start string is designed to be unlikely to occur in normal data.
638 : * The characters are rarely used upper ASCII, not valid as UTF-8, and produce
639 : * a large 4-byte int at any alignment.
640 : */
641 433 : pchMessageStart[0] = 0xa1;
642 433 : pchMessageStart[1] = 0xcf;
643 433 : pchMessageStart[2] = 0x7e;
644 433 : pchMessageStart[3] = 0xac;
645 433 : nDefaultPort = 51476;
646 :
647 433 : base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1, 139); // Testnet pivx addresses start with 'x' or 'y'
648 433 : base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1, 19); // Testnet pivx script addresses start with '8' or '9'
649 433 : base58Prefixes[STAKING_ADDRESS] = std::vector<unsigned char>(1, 73); // starting with 'W'
650 433 : base58Prefixes[EXCHANGE_ADDRESS] = {0x01, 0xb9, 0xb1}; // EXT prefix for the address
651 433 : base58Prefixes[SECRET_KEY] = std::vector<unsigned char>(1, 239); // Testnet private keys start with '9' or 'c' (Bitcoin defaults)
652 : // Testnet pivx BIP32 pubkeys start with 'DRKV'
653 433 : base58Prefixes[EXT_PUBLIC_KEY] = {0x3a, 0x80, 0x61, 0xa0};
654 : // Testnet pivx BIP32 prvkeys start with 'DRKP'
655 433 : base58Prefixes[EXT_SECRET_KEY] = {0x3a, 0x80, 0x58, 0x37};
656 : // Testnet pivx BIP44 coin type is '1' (All coin's testnet default)
657 433 : base58Prefixes[EXT_COIN_TYPE] = {0x80, 0x00, 0x00, 0x01};
658 :
659 : // Reject non-standard transactions by default
660 433 : fRequireStandard = true;
661 :
662 : // Sapling
663 433 : bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ptestsapling";
664 433 : bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "pviewtestsapling";
665 433 : bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "pivktestsapling";
666 433 : bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "p-secret-spending-key-test";
667 433 : bech32HRPs[SAPLING_EXTENDED_FVK] = "pxviewtestsapling";
668 :
669 433 : bech32HRPs[BLS_SECRET_KEY] = "bls-sk-test";
670 433 : bech32HRPs[BLS_PUBLIC_KEY] = "bls-pk-test";
671 :
672 : // long living quorum params
673 433 : consensus.llmqs[Consensus::LLMQ_TEST] = llmq_test;
674 433 : nLLMQConnectionRetryTimeout = 10;
675 :
676 433 : consensus.llmqTypeChainLocks = Consensus::LLMQ_TEST;
677 :
678 : // Tier two
679 433 : nFulfilledRequestExpireTime = 60 * 60; // fulfilled requests expire in 1 hour
680 433 : }
681 :
682 350700 : const CCheckpointData& Checkpoints() const
683 : {
684 350700 : return dataRegtest;
685 : }
686 : };
687 :
688 : static std::unique_ptr<CChainParams> globalChainParams;
689 :
690 16833780 : const CChainParams &Params()
691 : {
692 16833780 : assert(globalChainParams);
693 16833780 : return *globalChainParams;
694 : }
695 :
696 1017 : std::unique_ptr<CChainParams> CreateChainParams(const std::string& chain)
697 : {
698 1017 : if (chain == CBaseChainParams::MAIN)
699 532 : return std::unique_ptr<CChainParams>(new CMainParams());
700 485 : else if (chain == CBaseChainParams::TESTNET)
701 52 : return std::unique_ptr<CChainParams>(new CTestNetParams());
702 433 : else if (chain == CBaseChainParams::REGTEST)
703 1450 : return std::unique_ptr<CChainParams>(new CRegTestParams());
704 0 : throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain));
705 : }
706 :
707 942 : void SelectParams(const std::string& network)
708 : {
709 942 : SelectBaseParams(network);
710 1391 : globalChainParams = CreateChainParams(network);
711 942 : }
712 :
713 434 : void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
714 : {
715 434 : globalChainParams->UpdateNetworkUpgradeParameters(idx, nActivationHeight);
716 434 : }
|