1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
8 #include "crypto/equihash.h"
11 #include "utilstrencodings.h"
15 #include <boost/assign/list_of.hpp>
17 #include "chainparamsseeds.h"
19 static 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)
21 // To create a genesis block for a new chain which is Overwintered:
22 // txNew.nVersion = OVERWINTER_TX_VERSION
23 // txNew.fOverwintered = true
24 // txNew.nVersionGroupId = OVERWINTER_VERSION_GROUP_ID
25 // txNew.nExpiryHeight = <default value>
26 CMutableTransaction txNew;
30 txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
31 txNew.vout[0].nValue = genesisReward;
32 txNew.vout[0].scriptPubKey = genesisOutputScript;
35 genesis.nTime = nTime;
36 genesis.nBits = nBits;
37 genesis.nNonce = nNonce;
38 genesis.nSolution = nSolution;
39 genesis.nVersion = nVersion;
40 genesis.vtx.push_back(txNew);
41 genesis.hashPrevBlock.SetNull();
42 genesis.hashMerkleRoot = genesis.BuildMerkleTree();
47 * Build the genesis block. Note that the output of its generation
48 * transaction cannot be spent since it did not originally exist in the
49 * database (and is in any case of zero value).
51 * >>> from pyblake2 import blake2s
52 * >>> '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()
54 * CBlock(hash=00040fe8, ver=4, hashPrevBlock=00000000000000, hashMerkleRoot=c4eaa5, nTime=1477641360, nBits=1f07ffff, nNonce=4695, vtx=1)
55 * CTransaction(hash=c4eaa5, ver=1, vin.size=1, vout.size=1, nLockTime=0)
56 * CTxIn(COutPoint(000000, -1), coinbase 04ffff071f0104455a6361736830623963346565663862376363343137656535303031653335303039383462366665613335363833613763616331343161303433633432303634383335643334)
57 * CTxOut(nValue=0.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B)
60 static CBlock CreateGenesisBlock(uint32_t nTime, const uint256& nNonce, const std::vector<unsigned char>& nSolution, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
62 const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
63 const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
64 return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nSolution, nBits, nVersion, genesisReward);
71 * What makes a good checkpoint block?
72 * + Is surrounded by blocks with reasonable timestamps
73 * (no blocks before with a timestamp after, none after with
75 * + Contains no strange transactions
78 const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
80 class CMainParams : public CChainParams {
83 strNetworkID = "main";
84 strCurrencyUnits = "ZEC";
85 bip44CoinType = 133; // As registered in https://github.com/satoshilabs/slips/blob/master/slip-0044.md
86 consensus.fCoinbaseMustBeProtected = true;
87 consensus.nSubsidySlowStartInterval = 20000;
88 consensus.nSubsidyHalvingInterval = 840000;
89 consensus.nMajorityEnforceBlockUpgrade = 750;
90 consensus.nMajorityRejectBlockOutdated = 950;
91 consensus.nMajorityWindow = 4000;
92 consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
93 consensus.nPowAveragingWindow = 17;
94 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
95 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
96 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
97 consensus.nPowTargetSpacing = 2.5 * 60;
98 consensus.nPowAllowMinDifficultyBlocksAfterHeight = boost::none;
99 consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
100 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
101 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
102 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
103 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
104 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
105 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170005;
106 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 347500;
107 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170007;
108 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 419200;
110 // The best chain should have at least this much work.
111 consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000281b32ff3198a1");
114 * The message start string should be awesome! ⓩ❤
116 pchMessageStart[0] = 0x24;
117 pchMessageStart[1] = 0xe9;
118 pchMessageStart[2] = 0x27;
119 pchMessageStart[3] = 0x64;
120 vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
122 nPruneAfterHeight = 100000;
123 const size_t N = 200, K = 9;
124 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
128 genesis = CreateGenesisBlock(
130 uint256S("0x0000000000000000000000000000000000000000000000000000000000001257"),
131 ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157"),
133 consensus.hashGenesisBlock = genesis.GetHash();
134 assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
135 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
139 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.z.cash")); // Zcash
140 vSeeds.push_back(CDNSSeedData("str4d.xyz", "dnsseed.str4d.xyz")); // @str4d
141 vSeeds.push_back(CDNSSeedData("znodes.org", "dnsseed.znodes.org")); // @bitcartel
143 // guarantees the first 2 characters, when base58 encoded, are "t1"
144 base58Prefixes[PUBKEY_ADDRESS] = {0x1C,0xB8};
145 // guarantees the first 2 characters, when base58 encoded, are "t3"
146 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBD};
147 // the first character, when base58 encoded, is "5" or "K" or "L" (as in Bitcoin)
148 base58Prefixes[SECRET_KEY] = {0x80};
149 // do not rely on these BIP32 prefixes; they are not specified and may change
150 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x88,0xB2,0x1E};
151 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4};
152 // guarantees the first 2 characters, when base58 encoded, are "zc"
153 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A};
154 // guarantees the first 4 characters, when base58 encoded, are "ZiVK"
155 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAB,0xD3};
156 // guarantees the first 2 characters, when base58 encoded, are "SK"
157 base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36};
159 bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "zs";
160 bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviews";
161 bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivks";
162 bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-main";
164 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
166 fMiningRequiresPeers = true;
167 fDefaultConsistencyChecks = false;
168 fRequireStandard = true;
169 fMineBlocksOnDemand = false;
170 fTestnetToBeDeprecatedFieldRPC = false;
172 checkpointData = (CCheckpointData) {
173 boost::assign::map_list_of
174 (0, consensus.hashGenesisBlock)
175 (2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744"))
176 (15000, uint256S("0x00000000b6bc56656812a5b8dcad69d6ad4446dec23b5ec456c18641fb5381ba"))
177 (67500, uint256S("0x000000006b366d2c1649a6ebb4787ac2b39c422f451880bc922e3a6fbd723616"))
178 (100000, uint256S("0x000000001c5c82cd6baccfc0879e3830fd50d5ede17fa2c37a9a253c610eb285"))
179 (133337, uint256S("0x0000000002776ccfaf06cc19857accf3e20c01965282f916b8a886e3e4a05be9"))
180 (180000, uint256S("0x000000001205b742eac4a1b3959635bdf8aeada078d6a996df89740f7b54351d"))
181 (222222, uint256S("0x000000000cafb9e56445a6cabc8057b57ee6fcc709e7adbfa195e5c7fac61343"))
182 (270000, uint256S("0x00000000025c1cfa0258e33ab050aaa9338a3d4aaa3eb41defefc887779a9729"))
183 (304600, uint256S("0x00000000028324e022a45014c4a4dc51e95d41e6bceb6ad554c5b65d5cea3ea5")),
184 1523506583, // * UNIX timestamp of last checkpoint block
185 2824682, // * total number of transactions between genesis and last checkpoint
186 // (the tx=... number in the SetBestChain debug.log lines)
187 5341 // * estimated number of transactions per day after checkpoint
188 // total number of tx / (checkpoint block height / (24 * 24))
191 // Founders reward script expects a vector of 2-of-3 multisig addresses
192 vFoundersRewardAddress = {
193 "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
194 "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
195 "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
196 "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
197 "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
198 "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
199 "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
200 "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
201 "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
202 "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
203 "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
204 "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
205 "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
206 "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
207 "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
208 "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
209 "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
210 "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
211 "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
212 "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
213 "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
214 "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
215 "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
216 "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
217 "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
218 "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
219 "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
220 "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
221 "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
222 "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
223 "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
224 "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
225 "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
226 "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
227 "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
228 "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
229 "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
230 "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
231 "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
232 "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
233 "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
234 "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
235 "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
236 "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
237 "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
238 "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
239 "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
240 "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
241 // "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
242 // "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
243 // "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
244 // "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
245 // "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
246 // "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
247 // "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
249 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
252 static CMainParams mainParams;
257 class CTestNetParams : public CChainParams {
260 strNetworkID = "test";
261 strCurrencyUnits = "TAZ";
263 consensus.fCoinbaseMustBeProtected = true;
264 consensus.nSubsidySlowStartInterval = 20000;
265 consensus.nSubsidyHalvingInterval = 840000;
266 consensus.nMajorityEnforceBlockUpgrade = 51;
267 consensus.nMajorityRejectBlockOutdated = 75;
268 consensus.nMajorityWindow = 400;
269 consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
270 consensus.nPowAveragingWindow = 17;
271 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
272 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
273 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
274 consensus.nPowTargetSpacing = 2.5 * 60;
275 consensus.nPowAllowMinDifficultyBlocksAfterHeight = 299187;
276 consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
277 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
278 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
279 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
280 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
281 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
282 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
283 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 207500;
284 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170007;
285 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 280000;
287 // The best chain should have at least this much work.
288 consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000001d0c4d9cd");
290 pchMessageStart[0] = 0xfa;
291 pchMessageStart[1] = 0x1a;
292 pchMessageStart[2] = 0xf9;
293 pchMessageStart[3] = 0xbf;
294 vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
295 nDefaultPort = 18233;
296 nPruneAfterHeight = 1000;
297 const size_t N = 200, K = 9;
298 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
302 genesis = CreateGenesisBlock(
304 uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"),
305 ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"),
307 consensus.hashGenesisBlock = genesis.GetHash();
308 assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
309 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
313 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
315 // guarantees the first 2 characters, when base58 encoded, are "tm"
316 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
317 // guarantees the first 2 characters, when base58 encoded, are "t2"
318 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
319 // the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
320 base58Prefixes[SECRET_KEY] = {0xEF};
321 // do not rely on these BIP32 prefixes; they are not specified and may change
322 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
323 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
324 // guarantees the first 2 characters, when base58 encoded, are "zt"
325 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
326 // guarantees the first 4 characters, when base58 encoded, are "ZiVt"
327 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
328 // guarantees the first 2 characters, when base58 encoded, are "ST"
329 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
331 bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ztestsapling";
332 bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewtestsapling";
333 bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivktestsapling";
334 bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-test";
336 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
338 fMiningRequiresPeers = true;
339 fDefaultConsistencyChecks = false;
340 fRequireStandard = true;
341 fMineBlocksOnDemand = false;
342 fTestnetToBeDeprecatedFieldRPC = true;
345 checkpointData = (CCheckpointData) {
346 boost::assign::map_list_of
347 (0, consensus.hashGenesisBlock)
348 (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")),
349 1486897419, // * UNIX timestamp of last checkpoint block
350 47163, // * total number of transactions between genesis and last checkpoint
351 // (the tx=... number in the SetBestChain debug.log lines)
352 715 // total number of tx / (checkpoint block height / (24 * 24))
355 // Founders reward script expects a vector of 2-of-3 multisig addresses
356 vFoundersRewardAddress = {
357 "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
358 "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
359 "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
360 "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
361 "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
362 "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
363 "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
364 "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
365 "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
366 "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
367 "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
368 "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt",
370 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
373 static CTestNetParams testNetParams;
378 class CRegTestParams : public CChainParams {
381 strNetworkID = "regtest";
382 strCurrencyUnits = "REG";
384 consensus.fCoinbaseMustBeProtected = false;
385 consensus.nSubsidySlowStartInterval = 0;
386 consensus.nSubsidyHalvingInterval = 150;
387 consensus.nMajorityEnforceBlockUpgrade = 750;
388 consensus.nMajorityRejectBlockOutdated = 950;
389 consensus.nMajorityWindow = 1000;
390 consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
391 consensus.nPowAveragingWindow = 17;
392 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
393 consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
394 consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
395 consensus.nPowTargetSpacing = 2.5 * 60;
396 consensus.nPowAllowMinDifficultyBlocksAfterHeight = 0;
397 consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
398 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
399 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
400 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
401 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
402 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
403 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
404 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight =
405 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
406 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170006;
407 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight =
408 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
410 // The best chain should have at least this much work.
411 consensus.nMinimumChainWork = uint256S("0x00");
413 pchMessageStart[0] = 0xaa;
414 pchMessageStart[1] = 0xe8;
415 pchMessageStart[2] = 0x3f;
416 pchMessageStart[3] = 0x5f;
417 nDefaultPort = 18344;
418 nPruneAfterHeight = 1000;
419 const size_t N = 48, K = 5;
420 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
424 genesis = CreateGenesisBlock(
426 uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"),
427 ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"),
429 consensus.hashGenesisBlock = genesis.GetHash();
430 assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
431 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
433 vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
434 vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
436 fMiningRequiresPeers = false;
437 fDefaultConsistencyChecks = true;
438 fRequireStandard = false;
439 fMineBlocksOnDemand = true;
440 fTestnetToBeDeprecatedFieldRPC = false;
442 checkpointData = (CCheckpointData){
443 boost::assign::map_list_of
444 ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
449 // These prefixes are the same as the testnet prefixes
450 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
451 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
452 base58Prefixes[SECRET_KEY] = {0xEF};
453 // do not rely on these BIP32 prefixes; they are not specified and may change
454 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
455 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
456 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
457 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
458 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
460 bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "zregtestsapling";
461 bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewregtestsapling";
462 bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivkregtestsapling";
463 bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-regtest";
465 // Founders reward script expects a vector of 2-of-3 multisig addresses
466 vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
467 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
470 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
472 assert(idx > Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES);
473 consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
476 static CRegTestParams regTestParams;
478 static CChainParams *pCurrentParams = 0;
480 const CChainParams &Params() {
481 assert(pCurrentParams);
482 return *pCurrentParams;
485 CChainParams &Params(CBaseChainParams::Network network) {
487 case CBaseChainParams::MAIN:
489 case CBaseChainParams::TESTNET:
490 return testNetParams;
491 case CBaseChainParams::REGTEST:
492 return regTestParams;
494 assert(false && "Unimplemented network");
499 void SelectParams(CBaseChainParams::Network network) {
500 SelectBaseParams(network);
501 pCurrentParams = &Params(network);
503 // Some python qa rpc tests need to enforce the coinbase consensus rule
504 if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
505 regTestParams.SetRegTestCoinbaseMustBeProtected();
509 bool SelectParamsFromCommandLine()
511 CBaseChainParams::Network network = NetworkIdFromCommandLine();
512 if (network == CBaseChainParams::MAX_NETWORK_TYPES)
515 SelectParams(network);
520 // Block height must be >0 and <=last founders reward block height
521 // Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
522 std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
523 int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
524 assert(nHeight > 0 && nHeight <= maxHeight);
526 size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
527 size_t i = nHeight / addressChangeInterval;
528 return vFoundersRewardAddress[i];
531 // Block height must be >0 and <=last founders reward block height
532 // The founders reward address is expected to be a multisig (P2SH) address
533 CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
534 assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
536 CTxDestination address = DecodeDestination(GetFoundersRewardAddressAtHeight(nHeight).c_str());
537 assert(IsValidDestination(address));
538 assert(boost::get<CScriptID>(&address) != nullptr);
539 CScriptID scriptID = boost::get<CScriptID>(address); // address is a boost variant
540 CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
544 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
545 assert(i >= 0 && i < vFoundersRewardAddress.size());
546 return vFoundersRewardAddress[i];
549 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
551 regTestParams.UpdateNetworkUpgradeParameters(idx, nActivationHeight);