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.
7 #include "crypto/equihash.h"
10 #include "utilstrencodings.h"
14 #include <boost/assign/list_of.hpp>
20 #include "chainparamsseeds.h"
26 * What makes a good checkpoint block?
27 * + Is surrounded by blocks with reasonable timestamps
28 * (no blocks before with a timestamp after, none after with
30 * + Contains no strange transactions
33 const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
35 class CMainParams : public CChainParams {
38 strNetworkID = "main";
39 strCurrencyUnits = "ZEC";
40 consensus.fCoinbaseMustBeProtected = true;
41 consensus.nSubsidySlowStartInterval = 20000;
42 consensus.nSubsidyHalvingInterval = 840000;
43 consensus.nMajorityEnforceBlockUpgrade = 750;
44 consensus.nMajorityRejectBlockOutdated = 950;
45 consensus.nMajorityWindow = 4000;
46 consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
47 consensus.nPowAveragingWindow = 17;
48 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
49 consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
50 consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
51 consensus.nPowTargetSpacing = 2.5 * 60;
52 consensus.fPowAllowMinDifficultyBlocks = false;
54 * The message start string should be awesome! ⓩ❤
56 pchMessageStart[0] = 0x24;
57 pchMessageStart[1] = 0xe9;
58 pchMessageStart[2] = 0x27;
59 pchMessageStart[3] = 0x64;
60 vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
63 nMaxTipAge = 24 * 60 * 60;
64 nPruneAfterHeight = 100000;
65 const size_t N = 200, K = 9;
66 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
71 * Build the genesis block. Note that the output of its generation
72 * transaction cannot be spent since it did not originally exist in the
73 * database (and is in any case of zero value).
75 * >>> from pyblake2 import blake2s
76 * >>> '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()
78 const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
79 CMutableTransaction txNew;
82 txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
83 txNew.vout[0].nValue = 0;
84 txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
85 genesis.vtx.push_back(txNew);
86 genesis.hashPrevBlock.SetNull();
87 genesis.hashMerkleRoot = genesis.BuildMerkleTree();
89 genesis.nTime = 1477641360;
90 genesis.nBits = 0x1f07ffff;
91 genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257");
92 genesis.nSolution = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157");
94 consensus.hashGenesisBlock = genesis.GetHash();
95 assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
96 assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
100 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.z.cash")); // Zcash
101 vSeeds.push_back(CDNSSeedData("str4d.xyz", "dnsseed.str4d.xyz")); // @str4d
102 vSeeds.push_back(CDNSSeedData("znodes.org", "dnsseed.znodes.org")); // @bitcartel
104 // guarantees the first 2 characters, when base58 encoded, are "t1"
105 base58Prefixes[PUBKEY_ADDRESS] = {0x1C,0xB8};
106 // guarantees the first 2 characters, when base58 encoded, are "t3"
107 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBD};
108 // the first character, when base58 encoded, is "5" or "K" or "L" (as in Bitcoin)
109 base58Prefixes[SECRET_KEY] = {0x80};
110 // do not rely on these BIP32 prefixes; they are not specified and may change
111 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x88,0xB2,0x1E};
112 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4};
113 // guarantees the first 2 characters, when base58 encoded, are "zc"
114 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A};
115 // guarantees the first 2 characters, when base58 encoded, are "SK"
116 base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36};
118 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
120 fMiningRequiresPeers = true;
121 fDefaultConsistencyChecks = false;
122 fRequireStandard = true;
123 fMineBlocksOnDemand = false;
124 fTestnetToBeDeprecatedFieldRPC = false;
126 checkpointData = (Checkpoints::CCheckpointData) {
127 boost::assign::map_list_of
128 (0, consensus.hashGenesisBlock)
129 (2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744"))
130 (15000, uint256S("0x00000000b6bc56656812a5b8dcad69d6ad4446dec23b5ec456c18641fb5381ba"))
131 (67500, uint256S("0x000000006b366d2c1649a6ebb4787ac2b39c422f451880bc922e3a6fbd723616")),
132 1487767578, // * UNIX timestamp of last checkpoint block
133 325430, // * total number of transactions between genesis and last checkpoint
134 // (the tx=... number in the SetBestChain debug.log lines)
135 2777 // * estimated number of transactions per day after checkpoint
136 // total number of tx / (checkpoint block height / (24 * 24))
139 // Founders reward script expects a vector of 2-of-3 multisig addresses
140 vFoundersRewardAddress = {
141 "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
142 "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
143 "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
144 "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
145 "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
146 "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
147 "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
148 "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
149 "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
150 "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
151 "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
152 "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
153 "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
154 "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
155 "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
156 "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
157 "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
158 "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
159 "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
160 "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
161 "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
162 "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
163 "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
164 "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
165 "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
166 "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
167 "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
168 "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
169 "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
170 "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
171 "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
172 "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
173 "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
174 "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
175 "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
176 "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
177 "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
178 "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
179 "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
180 "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
181 "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
182 "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
183 "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
184 "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
185 "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
186 "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
187 "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
188 "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
189 // "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
190 // "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
191 // "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
192 // "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
193 // "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
194 // "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
195 // "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
197 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
200 static CMainParams mainParams;
205 class CTestNetParams : public CMainParams {
208 strNetworkID = "test";
209 strCurrencyUnits = "TAZ";
210 consensus.nMajorityEnforceBlockUpgrade = 51;
211 consensus.nMajorityRejectBlockOutdated = 75;
212 consensus.nMajorityWindow = 400;
213 consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
214 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
215 consensus.fPowAllowMinDifficultyBlocks = true;
216 pchMessageStart[0] = 0xfa;
217 pchMessageStart[1] = 0x1a;
218 pchMessageStart[2] = 0xf9;
219 pchMessageStart[3] = 0xbf;
220 vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
221 nDefaultPort = 18233;
223 nPruneAfterHeight = 1000;
225 //! Modify the testnet genesis block so the timestamp is valid for a later start.
226 genesis.nTime = 1477648033;
227 genesis.nBits = 0x2007ffff;
228 genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000006");
229 genesis.nSolution = ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff");
230 consensus.hashGenesisBlock = genesis.GetHash();
231 assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
235 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
237 // guarantees the first 2 characters, when base58 encoded, are "tm"
238 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
239 // guarantees the first 2 characters, when base58 encoded, are "t2"
240 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
241 // the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
242 base58Prefixes[SECRET_KEY] = {0xEF};
243 // do not rely on these BIP32 prefixes; they are not specified and may change
244 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
245 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
246 // guarantees the first 2 characters, when base58 encoded, are "zt"
247 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
248 // guarantees the first 2 characters, when base58 encoded, are "ST"
249 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
251 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
253 fMiningRequiresPeers = true;
254 fDefaultConsistencyChecks = false;
255 fRequireStandard = true;
256 fMineBlocksOnDemand = false;
257 fTestnetToBeDeprecatedFieldRPC = true;
259 checkpointData = (Checkpoints::CCheckpointData) {
260 boost::assign::map_list_of
261 (0, consensus.hashGenesisBlock)
262 (38000, uint256S("0x001e9a2d2e2892b88e9998cf7b079b41d59dd085423a921fe8386cecc42287b8")),
263 1486897419, // * UNIX timestamp of last checkpoint block
264 47163, // * total number of transactions between genesis and last checkpoint
265 // (the tx=... number in the SetBestChain debug.log lines)
266 715 // total number of tx / (checkpoint block height / (24 * 24))
269 // Founders reward script expects a vector of 2-of-3 multisig addresses
270 vFoundersRewardAddress = {
271 "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
272 "t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
273 "t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
274 "t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
275 "t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
276 "t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
277 "t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
278 "t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
279 "t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
280 "t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
281 "t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
282 "t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt",
284 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
287 static CTestNetParams testNetParams;
292 class CRegTestParams : public CTestNetParams {
295 strNetworkID = "regtest";
296 strCurrencyUnits = "REG";
297 consensus.fCoinbaseMustBeProtected = false;
298 consensus.nSubsidySlowStartInterval = 0;
299 consensus.nSubsidyHalvingInterval = 150;
300 consensus.nMajorityEnforceBlockUpgrade = 750;
301 consensus.nMajorityRejectBlockOutdated = 950;
302 consensus.nMajorityWindow = 1000;
303 consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
304 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
305 consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
306 consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
307 pchMessageStart[0] = 0xaa;
308 pchMessageStart[1] = 0xe8;
309 pchMessageStart[2] = 0x3f;
310 pchMessageStart[3] = 0x5f;
312 nMaxTipAge = 24 * 60 * 60;
313 const size_t N = 48, K = 5;
314 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
317 genesis.nTime = 1296688602;
318 genesis.nBits = 0x200f0f0f;
319 genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009");
320 genesis.nSolution = ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3");
321 consensus.hashGenesisBlock = genesis.GetHash();
322 nDefaultPort = 18444;
323 assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
324 nPruneAfterHeight = 1000;
326 vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
327 vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
329 fMiningRequiresPeers = false;
330 fDefaultConsistencyChecks = true;
331 fRequireStandard = false;
332 fMineBlocksOnDemand = true;
333 fTestnetToBeDeprecatedFieldRPC = false;
335 checkpointData = (Checkpoints::CCheckpointData){
336 boost::assign::map_list_of
337 ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
343 // Founders reward script expects a vector of 2-of-3 multisig addresses
344 vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
345 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
348 static CRegTestParams regTestParams;
350 static CChainParams *pCurrentParams = 0;
352 const CChainParams &Params() {
353 assert(pCurrentParams);
354 return *pCurrentParams;
357 CChainParams &Params(CBaseChainParams::Network network) {
359 case CBaseChainParams::MAIN:
361 case CBaseChainParams::TESTNET:
362 return testNetParams;
363 case CBaseChainParams::REGTEST:
364 return regTestParams;
366 assert(false && "Unimplemented network");
371 void SelectParams(CBaseChainParams::Network network) {
372 SelectBaseParams(network);
373 pCurrentParams = &Params(network);
375 // Some python qa rpc tests need to enforce the coinbase consensus rule
376 if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
377 regTestParams.SetRegTestCoinbaseMustBeProtected();
381 bool SelectParamsFromCommandLine()
383 CBaseChainParams::Network network = NetworkIdFromCommandLine();
384 if (network == CBaseChainParams::MAX_NETWORK_TYPES)
387 SelectParams(network);
392 // Block height must be >0 and <=last founders reward block height
393 // Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
394 std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
395 int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
396 assert(nHeight > 0 && nHeight <= maxHeight);
398 size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
399 size_t i = nHeight / addressChangeInterval;
400 return vFoundersRewardAddress[i];
403 // Block height must be >0 and <=last founders reward block height
404 // The founders reward address is expected to be a multisig (P2SH) address
405 CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
406 assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
408 CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str());
409 assert(address.IsValid());
410 assert(address.IsScript());
411 CScriptID scriptID = get<CScriptID>(address.Get()); // Get() returns a boost variant
412 CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
416 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
417 assert(i >= 0 && i < vFoundersRewardAddress.size());
418 return vFoundersRewardAddress[i];