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("0x00000000000000000000000000000000000000000000000000c12875ded911cf");
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 (410100, uint256S("0x0000000002c565958f783a24a4ac17cde898ff525e75ed9baf66861b0b9fcada"))
185 (497000, uint256S("0x0000000000abd333f0acca6ffdf78a167699686d6a7d25c33fca5f295061ffff")),
186 1552501838, // * UNIX timestamp of last checkpoint block
187 4463933, // * total number of transactions between genesis and last checkpoint
188 // (the tx=... number in the SetBestChain debug.log lines)
189 5173 // * estimated number of transactions per day after checkpoint
190 // total number of tx / (checkpoint block height / (24 * 24))
193 // Founders reward script expects a vector of 2-of-3 multisig addresses
194 vFoundersRewardAddress = {
195 "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
196 "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
197 "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
198 "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
199 "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
200 "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
201 "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
202 "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
203 "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
204 "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
205 "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
206 "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
207 "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
208 "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
209 "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
210 "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
211 "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
212 "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
213 "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
214 "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
215 "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
216 "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
217 "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
218 "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
219 "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
220 "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
221 "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
222 "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
223 "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
224 "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
225 "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
226 "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
227 "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
228 "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
229 "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
230 "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
231 "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
232 "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
233 "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
234 "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
235 "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
236 "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
237 "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
238 "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
239 "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
240 "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
241 "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
242 "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
243 // "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
244 // "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
245 // "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
246 // "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
247 // "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
248 // "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
249 // "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
251 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
254 static CMainParams mainParams;
259 class CTestNetParams : public CChainParams {
262 strNetworkID = "test";
263 strCurrencyUnits = "TAZ";
265 consensus.fCoinbaseMustBeProtected = true;
266 consensus.nSubsidySlowStartInterval = 20000;
267 consensus.nSubsidyHalvingInterval = 840000;
268 consensus.nMajorityEnforceBlockUpgrade = 51;
269 consensus.nMajorityRejectBlockOutdated = 75;
270 consensus.nMajorityWindow = 400;
271 consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
272 consensus.nPowAveragingWindow = 17;
273 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
274 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
275 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
276 consensus.nPowTargetSpacing = 2.5 * 60;
277 consensus.nPowAllowMinDifficultyBlocksAfterHeight = 299187;
278 consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
279 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
280 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
281 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
282 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
283 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
284 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
285 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = 207500;
286 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170007;
287 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = 280000;
289 // The best chain should have at least this much work.
290 consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000001d0c4d9cd");
292 pchMessageStart[0] = 0xfa;
293 pchMessageStart[1] = 0x1a;
294 pchMessageStart[2] = 0xf9;
295 pchMessageStart[3] = 0xbf;
296 vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
297 nDefaultPort = 18233;
298 nPruneAfterHeight = 1000;
299 const size_t N = 200, K = 9;
300 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
304 genesis = CreateGenesisBlock(
306 uint256S("0x0000000000000000000000000000000000000000000000000000000000000006"),
307 ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff"),
309 consensus.hashGenesisBlock = genesis.GetHash();
310 assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
311 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
315 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
317 // guarantees the first 2 characters, when base58 encoded, are "tm"
318 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
319 // guarantees the first 2 characters, when base58 encoded, are "t2"
320 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
321 // the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
322 base58Prefixes[SECRET_KEY] = {0xEF};
323 // do not rely on these BIP32 prefixes; they are not specified and may change
324 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
325 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
326 // guarantees the first 2 characters, when base58 encoded, are "zt"
327 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
328 // guarantees the first 4 characters, when base58 encoded, are "ZiVt"
329 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
330 // guarantees the first 2 characters, when base58 encoded, are "ST"
331 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
333 bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "ztestsapling";
334 bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewtestsapling";
335 bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivktestsapling";
336 bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-test";
338 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
340 fMiningRequiresPeers = true;
341 fDefaultConsistencyChecks = false;
342 fRequireStandard = true;
343 fMineBlocksOnDemand = false;
344 fTestnetToBeDeprecatedFieldRPC = true;
347 checkpointData = (CCheckpointData) {
348 boost::assign::map_list_of
349 (0, consensus.hashGenesisBlock)
350 (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")),
351 1486897419, // * UNIX timestamp of last checkpoint block
352 47163, // * total number of transactions between genesis and last checkpoint
353 // (the tx=... number in the SetBestChain debug.log lines)
354 715 // total number of tx / (checkpoint block height / (24 * 24))
357 // Hardcoded fallback value for the Sprout shielded value pool balance
358 // for nodes that have not reindexed since the introduction of monitoring
360 nSproutValuePoolCheckpointHeight = 440329;
361 nSproutValuePoolCheckpointBalance = 40000029096803;
362 fZIP209Enabled = true;
363 hashSproutValuePoolCheckpointBlock = uint256S("000a95d08ba5dcbabe881fc6471d11807bcca7df5f1795c99f3ec4580db4279b");
365 // Founders reward script expects a vector of 2-of-3 multisig addresses
366 vFoundersRewardAddress = {
367 "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
368 "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
369 "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
370 "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
371 "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
372 "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
373 "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
374 "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
375 "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
376 "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
377 "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
378 "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt",
380 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
383 static CTestNetParams testNetParams;
388 class CRegTestParams : public CChainParams {
391 strNetworkID = "regtest";
392 strCurrencyUnits = "REG";
394 consensus.fCoinbaseMustBeProtected = false;
395 consensus.nSubsidySlowStartInterval = 0;
396 consensus.nSubsidyHalvingInterval = 150;
397 consensus.nMajorityEnforceBlockUpgrade = 750;
398 consensus.nMajorityRejectBlockOutdated = 950;
399 consensus.nMajorityWindow = 1000;
400 consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
401 consensus.nPowAveragingWindow = 17;
402 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
403 consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
404 consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
405 consensus.nPowTargetSpacing = 2.5 * 60;
406 consensus.nPowAllowMinDifficultyBlocksAfterHeight = 0;
407 consensus.vUpgrades[Consensus::BASE_SPROUT].nProtocolVersion = 170002;
408 consensus.vUpgrades[Consensus::BASE_SPROUT].nActivationHeight =
409 Consensus::NetworkUpgrade::ALWAYS_ACTIVE;
410 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nProtocolVersion = 170002;
411 consensus.vUpgrades[Consensus::UPGRADE_TESTDUMMY].nActivationHeight =
412 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
413 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nProtocolVersion = 170003;
414 consensus.vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight =
415 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
416 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nProtocolVersion = 170006;
417 consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight =
418 Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT;
420 // The best chain should have at least this much work.
421 consensus.nMinimumChainWork = uint256S("0x00");
423 pchMessageStart[0] = 0xaa;
424 pchMessageStart[1] = 0xe8;
425 pchMessageStart[2] = 0x3f;
426 pchMessageStart[3] = 0x5f;
427 nDefaultPort = 18344;
428 nPruneAfterHeight = 1000;
429 const size_t N = 48, K = 5;
430 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
434 genesis = CreateGenesisBlock(
436 uint256S("0x0000000000000000000000000000000000000000000000000000000000000009"),
437 ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3"),
439 consensus.hashGenesisBlock = genesis.GetHash();
440 assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
441 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
443 vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
444 vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
446 fMiningRequiresPeers = false;
447 fDefaultConsistencyChecks = true;
448 fRequireStandard = false;
449 fMineBlocksOnDemand = true;
450 fTestnetToBeDeprecatedFieldRPC = false;
452 checkpointData = (CCheckpointData){
453 boost::assign::map_list_of
454 ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
459 // These prefixes are the same as the testnet prefixes
460 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
461 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
462 base58Prefixes[SECRET_KEY] = {0xEF};
463 // do not rely on these BIP32 prefixes; they are not specified and may change
464 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
465 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
466 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
467 base58Prefixes[ZCVIEWING_KEY] = {0xA8,0xAC,0x0C};
468 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
470 bech32HRPs[SAPLING_PAYMENT_ADDRESS] = "zregtestsapling";
471 bech32HRPs[SAPLING_FULL_VIEWING_KEY] = "zviewregtestsapling";
472 bech32HRPs[SAPLING_INCOMING_VIEWING_KEY] = "zivkregtestsapling";
473 bech32HRPs[SAPLING_EXTENDED_SPEND_KEY] = "secret-extended-key-regtest";
475 // Founders reward script expects a vector of 2-of-3 multisig addresses
476 vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
477 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
480 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
482 assert(idx > Consensus::BASE_SPROUT && idx < Consensus::MAX_NETWORK_UPGRADES);
483 consensus.vUpgrades[idx].nActivationHeight = nActivationHeight;
486 static CRegTestParams regTestParams;
488 static CChainParams *pCurrentParams = 0;
490 const CChainParams &Params() {
491 assert(pCurrentParams);
492 return *pCurrentParams;
495 CChainParams &Params(CBaseChainParams::Network network) {
497 case CBaseChainParams::MAIN:
499 case CBaseChainParams::TESTNET:
500 return testNetParams;
501 case CBaseChainParams::REGTEST:
502 return regTestParams;
504 assert(false && "Unimplemented network");
509 void SelectParams(CBaseChainParams::Network network) {
510 SelectBaseParams(network);
511 pCurrentParams = &Params(network);
513 // Some python qa rpc tests need to enforce the coinbase consensus rule
514 if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
515 regTestParams.SetRegTestCoinbaseMustBeProtected();
519 bool SelectParamsFromCommandLine()
521 CBaseChainParams::Network network = NetworkIdFromCommandLine();
522 if (network == CBaseChainParams::MAX_NETWORK_TYPES)
525 SelectParams(network);
530 // Block height must be >0 and <=last founders reward block height
531 // Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
532 std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
533 int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
534 assert(nHeight > 0 && nHeight <= maxHeight);
536 size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
537 size_t i = nHeight / addressChangeInterval;
538 return vFoundersRewardAddress[i];
541 // Block height must be >0 and <=last founders reward block height
542 // The founders reward address is expected to be a multisig (P2SH) address
543 CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
544 assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
546 CTxDestination address = DecodeDestination(GetFoundersRewardAddressAtHeight(nHeight).c_str());
547 assert(IsValidDestination(address));
548 assert(boost::get<CScriptID>(&address) != nullptr);
549 CScriptID scriptID = boost::get<CScriptID>(address); // address is a boost variant
550 CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
554 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
555 assert(i >= 0 && i < vFoundersRewardAddress.size());
556 return vFoundersRewardAddress[i];
559 void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivationHeight)
561 regTestParams.UpdateNetworkUpgradeParameters(idx, nActivationHeight);