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 fRequireRPCPassword = true;
121 fMiningRequiresPeers = true;
122 fDefaultConsistencyChecks = false;
123 fRequireStandard = true;
124 fMineBlocksOnDemand = false;
125 fTestnetToBeDeprecatedFieldRPC = false;
127 checkpointData = (Checkpoints::CCheckpointData) {
128 boost::assign::map_list_of
129 (0, consensus.hashGenesisBlock)
130 (2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744")),
131 1477973071, // * UNIX timestamp of last checkpoint block
132 22063, // * total number of transactions between genesis and last checkpoint
133 // (the tx=... number in the SetBestChain debug.log lines)
134 5083 // * estimated number of transactions per day after checkpoint
137 // Founders reward script expects a vector of 2-of-3 multisig addresses
138 vFoundersRewardAddress = {
139 "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
140 "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
141 "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
142 "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
143 "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
144 "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
145 "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
146 "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
147 "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
148 "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
149 "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
150 "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
151 "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
152 "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
153 "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
154 "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
155 "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
156 "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
157 "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
158 "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
159 "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
160 "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
161 "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
162 "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
163 "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
164 "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
165 "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
166 "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
167 "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
168 "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
169 "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
170 "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
171 "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
172 "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
173 "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
174 "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
175 "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
176 "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
177 "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
178 "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
179 "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
180 "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
181 "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
182 "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
183 "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
184 "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
185 "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
186 "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
187 // "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
188 // "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
189 // "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
190 // "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
191 // "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
192 // "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
193 // "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
195 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
198 static CMainParams mainParams;
203 class CTestNetParams : public CMainParams {
206 strNetworkID = "test";
207 strCurrencyUnits = "TAZ";
208 consensus.nMajorityEnforceBlockUpgrade = 51;
209 consensus.nMajorityRejectBlockOutdated = 75;
210 consensus.nMajorityWindow = 400;
211 consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
212 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
213 consensus.fPowAllowMinDifficultyBlocks = true;
214 pchMessageStart[0] = 0xfa;
215 pchMessageStart[1] = 0x1a;
216 pchMessageStart[2] = 0xf9;
217 pchMessageStart[3] = 0xbf;
218 vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
219 nDefaultPort = 18233;
221 nPruneAfterHeight = 1000;
223 //! Modify the testnet genesis block so the timestamp is valid for a later start.
224 genesis.nTime = 1477648033;
225 genesis.nBits = 0x2007ffff;
226 genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000006");
227 genesis.nSolution = ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff");
228 consensus.hashGenesisBlock = genesis.GetHash();
229 assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
233 vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
235 // guarantees the first 2 characters, when base58 encoded, are "tm"
236 base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
237 // guarantees the first 2 characters, when base58 encoded, are "t2"
238 base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
239 // the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
240 base58Prefixes[SECRET_KEY] = {0xEF};
241 // do not rely on these BIP32 prefixes; they are not specified and may change
242 base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
243 base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
244 // guarantees the first 2 characters, when base58 encoded, are "zt"
245 base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
246 // guarantees the first 2 characters, when base58 encoded, are "ST"
247 base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
249 vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
251 fRequireRPCPassword = true;
252 fMiningRequiresPeers = true;
253 fDefaultConsistencyChecks = false;
254 fRequireStandard = true;
255 fMineBlocksOnDemand = false;
256 fTestnetToBeDeprecatedFieldRPC = true;
258 checkpointData = (Checkpoints::CCheckpointData) {
259 boost::assign::map_list_of
260 ( 0, consensus.hashGenesisBlock),
266 // Founders reward script expects a vector of 2-of-3 multisig addresses
267 vFoundersRewardAddress = {
268 "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t27ktmq1kbeCWiQ5TZ7w5npSzcdbBmTB7v6",
269 "t2GcBttAKD2WTHka8HyGc2dfvVTKYZUfHmJ", "t2Q3vxWaD9LrdqUE8Xd9Ddjpr9pUQ2aGotK", "t2TTfWDsYu998fHWzVP9Gns4fgxXXRi1Wzu", "t2KS6R4MMWdSBMjLCiw2iMyhWGRQPmyRqDn",
270 "t2Q2ELrgotWv3Eec6LEtMMiiQ8dtW38u8Tj", "t2AEgJA88vTWAKqxJDFUEJWyHUtQAZi5G1D", "t2HCSdmpq1TQKksuwPQevwAzPTgfJ2rkMbG", "t2HQCPFAUQaUdJWHPhg5pPBxit7inaJzubE",
271 "t2Fzqvq8Y9e6Mn3JNPb982aYsLmq4b5HmhH", "t2HEz7YZQqDUgC5h4y2WSD3mWneqJNVRjjJ", "t2GCR1SCk687Eeo5NEZ23MLsms7JjVWBgfG", "t2KyiPR9Lztq2w1w747X6W4nkUMAGL8M9KN",
272 "t2UxymadyxSyVihmbq7S1yxw5dCBqJ1S4jT", "t2AVeMy7fdmTcJhckqiKRG8B7F1vccEhSqU", "t26m7LwihQzD2sH7ZVhYpPJM5j7kzwbfKW9", "t2DgwUNTe7NxuyPU6fxsB5xJXap3E4yWXrN",
273 "t2U6funcXA11fC9SZehyvUL3rk3Vhuh7fzS", "t284JhyS8LGM72Tx1porSqwrcq3CejthP1p", "t29egu8QcpzKeLoPLqWS6QVMnUUPQdF6eNm", "t29LqD9p9D3B26euBwFi6mfcWu8HPA38VNs",
274 "t28GsAMCxAyLy85XaasddDzaYFTtfewr86y", "t2GV44QyaikQPLUfm6oTfZnw71LLjnR7gDG", "t2U2QzNLQ1jtAu4L6xxVnRXLBsQpQvGRR2g", "t2QKGr5PNan7nrwDgseyHMN9NFeeuUjCh8b",
275 "t2AfS8u6HwBeJpKpbuxztvRjupKQDXqnrwa", "t2CTRQUViQd3CWMhnKhFnUHqDLUyTxmWhJs", "t2CbM9EqszNURqh1UXZBXYhwp1R4GwEhWRE", "t2LM7uYiAsKDU42GNSnMwDxbZ8s1DowQzYH",
276 "t2AgvT35LHR378AE3ouz6xKMhkTLHLJC6nD", "t285EAQXUVyi4NMddJv2QqTrnv45GRMbP8e", "t2EpMRCD5b8f2DCQ37npNULcpZhkjC8muqA", "t2BCmWXrRPiCeQTpizSWKKRPM5X6PS7umDY",
277 "t2DN7X6wDFn5hYKBiBmn3Z98st419yaTVTH", "t2QJj8HeCwQ6mHwqekxxDLZntYpZTHNU62t", "t2QdHBR1Yciqn4j8gpS8DcQZZtYetKvfNj3", "t2E5cpLA1ey5VNxFNcuopeQMq2rH2NHiPdu",
278 "t2EVRGtzjFAyz8CF8ndvLuiJu7qZUfDa93H", "t2KoQDk3BSFadBkuaWdLwchFuQamzw9RE4L", "t2FnR3yhTmuiejEJeu6qpidWTghRd1HpjLt", "t2BAuBAAospDc9d1u5nNGEi6x4NRJBD2PQ2",
279 "t2RtKrLCGcyPkm4a4APg1YY9Wu2m4R2PgrB", "t28aUbSteZzBq2pFgj1K1XNZRZP5mMMyakV", "t2Urdy1ERfkvsFuy6Z4BkhvYGzWdmivfAFR", "t2ADinR4JrvCMd4Q1XGALPajzFrirqvhED6",
281 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
284 static CTestNetParams testNetParams;
289 class CRegTestParams : public CTestNetParams {
292 strNetworkID = "regtest";
293 strCurrencyUnits = "REG";
294 consensus.fCoinbaseMustBeProtected = false;
295 consensus.nSubsidySlowStartInterval = 0;
296 consensus.nSubsidyHalvingInterval = 150;
297 consensus.nMajorityEnforceBlockUpgrade = 750;
298 consensus.nMajorityRejectBlockOutdated = 950;
299 consensus.nMajorityWindow = 1000;
300 consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
301 assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
302 consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
303 consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
304 pchMessageStart[0] = 0xaa;
305 pchMessageStart[1] = 0xe8;
306 pchMessageStart[2] = 0x3f;
307 pchMessageStart[3] = 0x5f;
309 nMaxTipAge = 24 * 60 * 60;
310 const size_t N = 48, K = 5;
311 BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
314 genesis.nTime = 1296688602;
315 genesis.nBits = 0x200f0f0f;
316 genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009");
317 genesis.nSolution = ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3");
318 consensus.hashGenesisBlock = genesis.GetHash();
319 nDefaultPort = 18444;
320 assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
321 nPruneAfterHeight = 1000;
323 vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
324 vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
326 fRequireRPCPassword = false;
327 fMiningRequiresPeers = false;
328 fDefaultConsistencyChecks = true;
329 fRequireStandard = false;
330 fMineBlocksOnDemand = true;
331 fTestnetToBeDeprecatedFieldRPC = false;
333 checkpointData = (Checkpoints::CCheckpointData){
334 boost::assign::map_list_of
335 ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
341 // Founders reward script expects a vector of 2-of-3 multisig addresses
342 vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
343 assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
346 static CRegTestParams regTestParams;
348 static CChainParams *pCurrentParams = 0;
350 const CChainParams &Params() {
351 assert(pCurrentParams);
352 return *pCurrentParams;
355 CChainParams &Params(CBaseChainParams::Network network) {
357 case CBaseChainParams::MAIN:
359 case CBaseChainParams::TESTNET:
360 return testNetParams;
361 case CBaseChainParams::REGTEST:
362 return regTestParams;
364 assert(false && "Unimplemented network");
369 void SelectParams(CBaseChainParams::Network network) {
370 SelectBaseParams(network);
371 pCurrentParams = &Params(network);
373 // Some python qa rpc tests need to enforce the coinbase consensus rule
374 if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
375 regTestParams.SetRegTestCoinbaseMustBeProtected();
379 bool SelectParamsFromCommandLine()
381 CBaseChainParams::Network network = NetworkIdFromCommandLine();
382 if (network == CBaseChainParams::MAX_NETWORK_TYPES)
385 SelectParams(network);
390 // Block height must be >0 and <=last founders reward block height
391 // Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
392 std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
393 int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
394 assert(nHeight > 0 && nHeight <= maxHeight);
396 size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
397 size_t i = nHeight / addressChangeInterval;
398 return vFoundersRewardAddress[i];
401 // Block height must be >0 and <=last founders reward block height
402 // The founders reward address is expected to be a multisig (P2SH) address
403 CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
404 assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
406 CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str());
407 assert(address.IsValid());
408 assert(address.IsScript());
409 CScriptID scriptID = get<CScriptID>(address.Get()); // Get() returns a boost variant
410 CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
414 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
415 assert(i >= 0 && i < vFoundersRewardAddress.size());
416 return vFoundersRewardAddress[i];