]> Git Repo - VerusCoin.git/blame - src/chainparams.cpp
Allow changing network upgrade parameters on regtest
[VerusCoin.git] / src / chainparams.cpp
CommitLineData
0e4b3175 1// Copyright (c) 2010 Satoshi Nakamoto
f914f1a7 2// Copyright (c) 2009-2014 The Bitcoin Core developers
f2e03ffa 3// Distributed under the MIT software license, see the accompanying
0e4b3175
MH
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
c6a7e897
DH
6#include "main.h"
7#include "crypto/equihash.h"
51ed9ec9 8
0e4b3175 9#include "util.h"
85c579e3 10#include "utilstrencodings.h"
0e4b3175 11
187115c0
PK
12#include <assert.h>
13
8388289e
PW
14#include <boost/assign/list_of.hpp>
15
db0f9315
S
16#include "base58.h"
17
a60120e9
WL
18#include "chainparamsseeds.h"
19
a97308c5 20static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, const uint256& nNonce, const std::vector<unsigned char>& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
90b6ee6c
JT
21{
22 CMutableTransaction txNew;
23 txNew.nVersion = 1;
24 txNew.vin.resize(1);
25 txNew.vout.resize(1);
91690d6e 26 txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
90b6ee6c
JT
27 txNew.vout[0].nValue = genesisReward;
28 txNew.vout[0].scriptPubKey = genesisOutputScript;
29
30 CBlock genesis;
31 genesis.nTime = nTime;
32 genesis.nBits = nBits;
33 genesis.nNonce = nNonce;
34 genesis.nSolution = nSolution;
35 genesis.nVersion = nVersion;
36 genesis.vtx.push_back(txNew);
37 genesis.hashPrevBlock.SetNull();
38 genesis.hashMerkleRoot = genesis.BuildMerkleTree();
39 return genesis;
40}
41
42/**
43 * Build the genesis block. Note that the output of its generation
44 * transaction cannot be spent since it did not originally exist in the
45 * database (and is in any case of zero value).
46 *
47 * >>> from pyblake2 import blake2s
48 * >>> 'Zcash' + blake2s(b'The Economist 2016-10-29 Known unknown: Another crypto-currency is born. BTC#436254 0000000000000000044f321997f336d2908cf8c8d6893e88dbf067e2d949487d ETH#2521903 483039a6b6bd8bd05f0584f9a078d075e454925eb71c1f13eaff59b405a721bb DJIA close on 27 Oct 2016: 18,169.68').hexdigest()
49 *
50 * CBlock(hash=00040fe8, ver=4, hashPrevBlock=00000000000000, hashMerkleRoot=c4eaa5, nTime=1477641360, nBits=1f07ffff, nNonce=4695, vtx=1)
51 * CTransaction(hash=c4eaa5, ver=1, vin.size=1, vout.size=1, nLockTime=0)
52 * CTxIn(COutPoint(000000, -1), coinbase 04ffff071f0104455a6361736830623963346565663862376363343137656535303031653335303039383462366665613335363833613763616331343161303433633432303634383335643334)
53 * CTxOut(nValue=0.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
54 * vMerkleTree: c4eaa5
55 */
a97308c5 56static CBlock CreateGenesisBlock(uint32_t nTime, const uint256& nNonce, const std::vector<unsigned char>& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
90b6ee6c
JT
57{
58 const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
a97308c5 59 const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
90b6ee6c
JT
60 return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nSolution, nBits, nVersion, genesisReward);
61}
62
f2e03ffa
MF
63/**
64 * Main network
65 */
f2e03ffa
MF
66/**
67 * What makes a good checkpoint block?
68 * + Is surrounded by blocks with reasonable timestamps
69 * (no blocks before with a timestamp after, none after with
70 * timestamp before)
71 * + Contains no strange transactions
72 */
e11712df 73
3e24a533
JG
74const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
75
0e4b3175
MH
76class CMainParams : public CChainParams {
77public:
78 CMainParams() {
f5ae6c98 79 strNetworkID = "main";
d793f94b 80 strCurrencyUnits = "ZEC";
a180d0a6 81 consensus.fCoinbaseMustBeProtected = true;
45e3deea
JG
82 consensus.nSubsidySlowStartInterval = 20000;
83 consensus.nSubsidyHalvingInterval = 840000;
bd006110
JT
84 consensus.nMajorityEnforceBlockUpgrade = 750;
85 consensus.nMajorityRejectBlockOutdated = 950;
45e3deea 86 consensus.nMajorityWindow = 4000;
30ed3791 87 consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
f2c48e15 88 consensus.nPowAveragingWindow = 17;
3e24a533 89 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
8f3ec042
JG
90 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
91 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
45e3deea 92 consensus.nPowTargetSpacing = 2.5 * 60;
780f526b
JG
93 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
94 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
95
5c5f70f0 96 /**
1feaefac 97 * The message start string should be awesome! ⓩ❤
f2e03ffa 98 */
1feaefac
ZC
99 pchMessageStart[0] = 0x24;
100 pchMessageStart[1] = 0xe9;
101 pchMessageStart[2] = 0x27;
102 pchMessageStart[3] = 0x64;
174a68b3 103 vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
3985a40d 104 nDefaultPort = 8233;
33d6825c 105 nMaxTipAge = 24 * 60 * 60;
f9ec3f0f 106 nPruneAfterHeight = 100000;
c6a7e897
DH
107 const size_t N = 200, K = 9;
108 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
109 nEquihashN = N;
110 nEquihashK = K;
0e4b3175 111
a97308c5
DK
112 genesis = CreateGenesisBlock(
113 1477641360,
114 uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"),
115 ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"),
116 0x1f07ffff, 4, 0);
bd006110 117 consensus.hashGenesisBlock = genesis.GetHash();
30ed3791
JG
118 assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
119 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
0e4b3175 120
57466ea6
JG
121 vFixedSeeds.clear();
122 vSeeds.clear();
3483696b
DH
123 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.z.cash")); // Zcash
124 vSeeds.push_back(CDNSSeedData("str4d.xyz", "dnsseed.str4d.xyz")); // @str4d
125 vSeeds.push_back(CDNSSeedData("znodes.org", "dnsseed.znodes.org")); // @bitcartel
0e4b3175 126
702721c1
DH
127 // guarantees the first 2 characters, when base58 encoded, are "t1"
128 base58Prefixes[PUBKEY_ADDRESS] = {0x1C,0xB8};
129 // guarantees the first 2 characters, when base58 encoded, are "t3"
130 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBD};
131 // the first character, when base58 encoded, is "5" or "K" or "L" (as in Bitcoin)
132 base58Prefixes[SECRET_KEY] = {0x80};
133 // do not rely on these BIP32 prefixes; they are not specified and may change
134 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x88,0xB2,0x1E};
135 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4};
136 // guarantees the first 2 characters, when base58 encoded, are "zc"
137 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A};
49cf707d
JG
138 // guarantees the first 4 characters, when base58 encoded, are "ZiVK"
139 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAB,0xD3};
702721c1
DH
140 // guarantees the first 2 characters, when base58 encoded, are "SK"
141 base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36};
0e4b3175 142
739d6155 143 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
0e4b3175 144
c8c52de3 145 fMiningRequiresPeers = true;
3fcfbc8a 146 fDefaultConsistencyChecks = false;
c8c52de3 147 fRequireStandard = true;
c8c52de3 148 fMineBlocksOnDemand = false;
cc972107 149 fTestnetToBeDeprecatedFieldRPC = false;
e11712df 150
47b71cec 151 checkpointData = (CCheckpointData) {
69968230 152 boost::assign::map_list_of
73363c3d 153 (0, consensus.hashGenesisBlock)
2f1238bc 154 (2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744"))
b897de53
S
155 (15000, uint256S("0x00000000b6bc56656812a5b8dcad69d6ad4446dec23b5ec456c18641fb5381ba"))
156 (67500, uint256S("0x000000006b366d2c1649a6ebb4787ac2b39c422f451880bc922e3a6fbd723616")),
157 1487767578, // * UNIX timestamp of last checkpoint block
158 325430, // * total number of transactions between genesis and last checkpoint
2f1238bc 159 // (the tx=... number in the SetBestChain debug.log lines)
b897de53 160 2777 // * estimated number of transactions per day after checkpoint
2f1238bc 161 // total number of tx / (checkpoint block height / (24 * 24))
69968230 162 };
db0f9315
S
163
164 // Founders reward script expects a vector of 2-of-3 multisig addresses
165 vFoundersRewardAddress = {
9f15b823
JG
166 "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
167 "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
168 "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
169 "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
170 "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
171 "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
172 "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
173 "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
174 "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
175 "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
176 "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
177 "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
178 "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
179 "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
180 "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
181 "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
182 "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
183 "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
184 "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
185 "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
186 "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
187 "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
188 "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
189 "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
190 "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
191 "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
192 "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
193 "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
194 "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
195 "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
196 "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
197 "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
198 "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
199 "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
200 "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
201 "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
202 "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
203 "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
204 "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
205 "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
206 "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
207 "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
208 "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
209 "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
210 "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
211 "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
212 "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
213 "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
214// "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
215// "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
216// "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
217// "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
218// "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
219// "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
220// "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
221};
22dadb35 222 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
e11712df 223 }
0e4b3175
MH
224};
225static CMainParams mainParams;
226
f2e03ffa
MF
227/**
228 * Testnet (v3)
229 */
54ab3b31 230class CTestNetParams : public CChainParams {
0e4b3175
MH
231public:
232 CTestNetParams() {
f5ae6c98 233 strNetworkID = "test";
d793f94b 234 strCurrencyUnits = "TAZ";
54ab3b31
JT
235 consensus.fCoinbaseMustBeProtected = true;
236 consensus.nSubsidySlowStartInterval = 20000;
237 consensus.nSubsidyHalvingInterval = 840000;
bd006110
JT
238 consensus.nMajorityEnforceBlockUpgrade = 51;
239 consensus.nMajorityRejectBlockOutdated = 75;
45e3deea 240 consensus.nMajorityWindow = 400;
2360dd64 241 consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
54ab3b31 242 consensus.nPowAveragingWindow = 17;
3e24a533 243 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
54ab3b31
JT
244 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
245 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
246 consensus.nPowTargetSpacing = 2.5 * 60;
780f526b
JG
247 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
248 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
249
c5eba181
DH
250 pchMessageStart[0] = 0xfa;
251 pchMessageStart[1] = 0x1a;
1feaefac
ZC
252 pchMessageStart[2] = 0xf9;
253 pchMessageStart[3] = 0xbf;
174a68b3 254 vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
3985a40d 255 nDefaultPort = 18233;
54ab3b31 256 nMaxTipAge = 24 * 60 * 60;
f9ec3f0f 257 nPruneAfterHeight = 1000;
54ab3b31
JT
258 const size_t N = 200, K = 9;
259 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
260 nEquihashN = N;
261 nEquihashK = K;
0e4b3175 262
54ab3b31
JT
263 genesis = CreateGenesisBlock(
264 1477648033,
265 uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"),
266 ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"),
a97308c5 267 0x2007ffff, 4, 0);
bd006110 268 consensus.hashGenesisBlock = genesis.GetHash();
30ed3791 269 assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
a97308c5 270 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
0e4b3175
MH
271
272 vFixedSeeds.clear();
273 vSeeds.clear();
9fc324a1 274 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
0e4b3175 275
702721c1
DH
276 // guarantees the first 2 characters, when base58 encoded, are "tm"
277 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
278 // guarantees the first 2 characters, when base58 encoded, are "t2"
279 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
280 // the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
281 base58Prefixes[SECRET_KEY] = {0xEF};
282 // do not rely on these BIP32 prefixes; they are not specified and may change
283 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
284 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
285 // guarantees the first 2 characters, when base58 encoded, are "zt"
286 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
49cf707d
JG
287 // guarantees the first 4 characters, when base58 encoded, are "ZiVt"
288 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
702721c1
DH
289 // guarantees the first 2 characters, when base58 encoded, are "ST"
290 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
21913a9a 291
739d6155 292 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
a60120e9 293
c8c52de3 294 fMiningRequiresPeers = true;
3fcfbc8a 295 fDefaultConsistencyChecks = false;
77175766 296 fRequireStandard = true;
c8c52de3 297 fMineBlocksOnDemand = false;
cc972107 298 fTestnetToBeDeprecatedFieldRPC = true;
69968230 299
47b71cec 300 checkpointData = (CCheckpointData) {
69968230 301 boost::assign::map_list_of
5a888f72
S
302 (0, consensus.hashGenesisBlock)
303 (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")),
304 1486897419, // * UNIX timestamp of last checkpoint block
305 47163, // * total number of transactions between genesis and last checkpoint
306 // (the tx=... number in the SetBestChain debug.log lines)
307 715 // total number of tx / (checkpoint block height / (24 * 24))
69968230
CF
308 };
309
db0f9315
S
310 // Founders reward script expects a vector of 2-of-3 multisig addresses
311 vFoundersRewardAddress = {
10031802 312 "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
4340ec97
S
313 "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
314 "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
315 "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
316 "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
317 "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
318 "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
319 "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
320 "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
321 "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
322 "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
323 "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt",
324 };
22dadb35 325 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
e11712df 326 }
0e4b3175
MH
327};
328static CTestNetParams testNetParams;
329
f2e03ffa
MF
330/**
331 * Regression test
332 */
54ab3b31 333class CRegTestParams : public CChainParams {
0e4b3175
MH
334public:
335 CRegTestParams() {
f5ae6c98 336 strNetworkID = "regtest";
d793f94b 337 strCurrencyUnits = "REG";
a180d0a6 338 consensus.fCoinbaseMustBeProtected = false;
7a1f5518 339 consensus.nSubsidySlowStartInterval = 0;
bd006110
JT
340 consensus.nSubsidyHalvingInterval = 150;
341 consensus.nMajorityEnforceBlockUpgrade = 750;
342 consensus.nMajorityRejectBlockOutdated = 950;
343 consensus.nMajorityWindow = 1000;
3e24a533 344 consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
54ab3b31 345 consensus.nPowAveragingWindow = 17;
3e24a533 346 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
f2c48e15
JG
347 consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
348 consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
54ab3b31 349 consensus.nPowTargetSpacing = 2.5 * 60;
780f526b
JG
350 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
351 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
a97308c5 352
62fdd8d0
SB
353 pchMessageStart[0] = 0xaa;
354 pchMessageStart[1] = 0xe8;
355 pchMessageStart[2] = 0x3f;
356 pchMessageStart[3] = 0x5f;
a97308c5 357 nDefaultPort = 18344;
33d6825c 358 nMaxTipAge = 24 * 60 * 60;
a97308c5 359 nPruneAfterHeight = 1000;
c6a7e897
DH
360 const size_t N = 48, K = 5;
361 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
362 nEquihashN = N;
363 nEquihashK = K;
a97308c5 364
54ab3b31
JT
365 genesis = CreateGenesisBlock(
366 1296688602,
367 uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"),
368 ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"),
a97308c5 369 0x200f0f0f, 4, 0);
bd006110 370 consensus.hashGenesisBlock = genesis.GetHash();
30ed3791 371 assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
a97308c5 372 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
0e4b3175 373
f2e03ffa
MF
374 vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
375 vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
0e4b3175 376
c8c52de3 377 fMiningRequiresPeers = false;
3fcfbc8a 378 fDefaultConsistencyChecks = true;
c8c52de3 379 fRequireStandard = false;
c8c52de3 380 fMineBlocksOnDemand = true;
cc972107 381 fTestnetToBeDeprecatedFieldRPC = false;
69968230 382
47b71cec 383 checkpointData = (CCheckpointData){
69968230
CF
384 boost::assign::map_list_of
385 ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
386 0,
387 0,
388 0
389 };
54ab3b31
JT
390 // These prefixes are the same as the testnet prefixes
391 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
392 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
393 base58Prefixes[SECRET_KEY] = {0xEF};
394 // do not rely on these BIP32 prefixes; they are not specified and may change
395 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
396 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
397 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
40ebf08f 398 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
54ab3b31 399 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
db0f9315
S
400
401 // Founders reward script expects a vector of 2-of-3 multisig addresses
1fc7e92e 402 vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
22dadb35 403 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
e11712df 404 }
b174b7e3
JG
405
406 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
407 {
408 assert(idx > Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES);
409 consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
410 }
0e4b3175
MH
411};
412static CRegTestParams regTestParams;
413
84ce18ca 414static CChainParams *pCurrentParams = 0;
0e4b3175
MH
415
416const CChainParams &Params() {
84ce18ca 417 assert(pCurrentParams);
0e4b3175
MH
418 return *pCurrentParams;
419}
420
e84843c0 421CChainParams &Params(CBaseChainParams::Network network) {
0e4b3175 422 switch (network) {
84ce18ca 423 case CBaseChainParams::MAIN:
e84843c0 424 return mainParams;
84ce18ca 425 case CBaseChainParams::TESTNET:
e84843c0 426 return testNetParams;
84ce18ca 427 case CBaseChainParams::REGTEST:
e84843c0 428 return regTestParams;
0e4b3175
MH
429 default:
430 assert(false && "Unimplemented network");
e84843c0 431 return mainParams;
0e4b3175
MH
432 }
433}
434
e84843c0
RN
435void SelectParams(CBaseChainParams::Network network) {
436 SelectBaseParams(network);
437 pCurrentParams = &Params(network);
2b1cda3b
S
438
439 // Some python qa rpc tests need to enforce the coinbase consensus rule
440 if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
441 regTestParams.SetRegTestCoinbaseMustBeProtected();
442 }
e84843c0
RN
443}
444
ca3ce0fa 445bool SelectParamsFromCommandLine()
3fdb9e8c 446{
b796cb08 447 CBaseChainParams::Network network = NetworkIdFromCommandLine();
3fdb9e8c 448 if (network == CBaseChainParams::MAX_NETWORK_TYPES)
0e4b3175 449 return false;
0e4b3175 450
3fdb9e8c 451 SelectParams(network);
0e4b3175
MH
452 return true;
453}
db0f9315
S
454
455
456// Block height must be >0 and <=last founders reward block height
457// Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
241867b1 458std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
db0f9315 459 int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
241867b1 460 assert(nHeight > 0 && nHeight <= maxHeight);
db0f9315 461
3b30d836
S
462 size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
463 size_t i = nHeight / addressChangeInterval;
db0f9315
S
464 return vFoundersRewardAddress[i];
465}
466
467// Block height must be >0 and <=last founders reward block height
468// The founders reward address is expected to be a multisig (P2SH) address
241867b1 469CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
db0f9315
S
470 assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
471
3b30d836 472 CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str());
db0f9315
S
473 assert(address.IsValid());
474 assert(address.IsScript());
ff145dfe 475 CScriptID scriptID = boost::get<CScriptID>(address.Get()); // Get() returns a boost variant
db0f9315
S
476 CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
477 return script;
478}
3b30d836
S
479
480std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
241867b1 481 assert(i >= 0 && i < vFoundersRewardAddress.size());
3b30d836
S
482 return vFoundersRewardAddress[i];
483}
b174b7e3
JG
484
485void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
486{
487 regTestParams.UpdateNetworkUpgradeParameters(idx, nActivationHeight);
488}
This page took 0.245469 seconds and 4 git commands to generate.