]> Git Repo - VerusCoin.git/blob - src/chainparams.cpp
Auto merge of #1758 - str4d:1728-install-and-dist-scripts, r=str4d
[VerusCoin.git] / src / chainparams.cpp
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.
5
6 #include "main.h"
7 #include "crypto/equihash.h"
8
9 #include "util.h"
10 #include "utilstrencodings.h"
11
12 #include <assert.h>
13
14 #include <boost/assign/list_of.hpp>
15
16 #include "base58.h"
17
18 using namespace std;
19
20 #include "chainparamsseeds.h"
21
22 /**
23  * Main network
24  */
25 /**
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
29  *    timestamp before)
30  * + Contains no strange transactions
31  */
32
33 const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
34
35 class CMainParams : public CChainParams {
36 public:
37     CMainParams() {
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;
53         /**
54          * The message start string should be awesome! ⓩ❤
55          */
56         pchMessageStart[0] = 0x24;
57         pchMessageStart[1] = 0xe9;
58         pchMessageStart[2] = 0x27;
59         pchMessageStart[3] = 0x64;
60         vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
61         nDefaultPort = 8233;
62         nMinerThreads = 0;
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));
67         nEquihashN = N;
68         nEquihashK = K;
69
70         /**
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).
74          *
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()
77          */
78         const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
79         CMutableTransaction txNew;
80         txNew.vin.resize(1);
81         txNew.vout.resize(1);
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();
88         genesis.nVersion = 4;
89         genesis.nTime    = 1477641360;
90         genesis.nBits    = 0x1f07ffff;
91         genesis.nNonce   = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257");
92         genesis.nSolution = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157");
93
94         consensus.hashGenesisBlock = genesis.GetHash();
95         assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
96         assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
97
98         vFixedSeeds.clear();
99         vSeeds.clear();
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
103
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};
117
118         vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
119
120         fRequireRPCPassword = true;
121         fMiningRequiresPeers = true;
122         fDefaultConsistencyChecks = false;
123         fRequireStandard = true;
124         fMineBlocksOnDemand = false;
125         fTestnetToBeDeprecatedFieldRPC = false;
126
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
135         };
136
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*/
194 };
195         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
196     }
197 };
198 static CMainParams mainParams;
199
200 /**
201  * Testnet (v3)
202  */
203 class CTestNetParams : public CMainParams {
204 public:
205     CTestNetParams() {
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;
220         nMinerThreads = 0;
221         nPruneAfterHeight = 1000;
222
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"));
230
231         vFixedSeeds.clear();
232         vSeeds.clear();
233         vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
234
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};
248
249         vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
250
251         fRequireRPCPassword = true;
252         fMiningRequiresPeers = true;
253         fDefaultConsistencyChecks = false;
254         fRequireStandard = true;
255         fMineBlocksOnDemand = false;
256         fTestnetToBeDeprecatedFieldRPC = true;
257
258         checkpointData = (Checkpoints::CCheckpointData) {
259             boost::assign::map_list_of
260             ( 0, consensus.hashGenesisBlock),
261             genesis.nTime,
262             0,
263             0
264         };
265
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",
280         };
281         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
282     }
283 };
284 static CTestNetParams testNetParams;
285
286 /**
287  * Regression test
288  */
289 class CRegTestParams : public CTestNetParams {
290 public:
291     CRegTestParams() {
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;
308         nMinerThreads = 1;
309         nMaxTipAge = 24 * 60 * 60;
310         const size_t N = 48, K = 5;
311         BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
312         nEquihashN = N;
313         nEquihashK = 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;
322
323         vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
324         vSeeds.clear();  //! Regtest mode doesn't have any DNS seeds.
325
326         fRequireRPCPassword = false;
327         fMiningRequiresPeers = false;
328         fDefaultConsistencyChecks = true;
329         fRequireStandard = false;
330         fMineBlocksOnDemand = true;
331         fTestnetToBeDeprecatedFieldRPC = false;
332
333         checkpointData = (Checkpoints::CCheckpointData){
334             boost::assign::map_list_of
335             ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
336             0,
337             0,
338             0
339         };
340
341         // Founders reward script expects a vector of 2-of-3 multisig addresses
342         vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
343         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
344     }
345 };
346 static CRegTestParams regTestParams;
347
348 static CChainParams *pCurrentParams = 0;
349
350 const CChainParams &Params() {
351     assert(pCurrentParams);
352     return *pCurrentParams;
353 }
354
355 CChainParams &Params(CBaseChainParams::Network network) {
356     switch (network) {
357         case CBaseChainParams::MAIN:
358             return mainParams;
359         case CBaseChainParams::TESTNET:
360             return testNetParams;
361         case CBaseChainParams::REGTEST:
362             return regTestParams;
363         default:
364             assert(false && "Unimplemented network");
365             return mainParams;
366     }
367 }
368
369 void SelectParams(CBaseChainParams::Network network) {
370     SelectBaseParams(network);
371     pCurrentParams = &Params(network);
372
373     // Some python qa rpc tests need to enforce the coinbase consensus rule
374     if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
375         regTestParams.SetRegTestCoinbaseMustBeProtected();
376     }
377 }
378
379 bool SelectParamsFromCommandLine()
380 {
381     CBaseChainParams::Network network = NetworkIdFromCommandLine();
382     if (network == CBaseChainParams::MAX_NETWORK_TYPES)
383         return false;
384
385     SelectParams(network);
386     return true;
387 }
388
389
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);
395
396     size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
397     size_t i = nHeight / addressChangeInterval;
398     return vFoundersRewardAddress[i];
399 }
400
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());
405
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;
411     return script;
412 }
413
414 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
415     assert(i >= 0 && i < vFoundersRewardAddress.size());
416     return vFoundersRewardAddress[i];
417 }
This page took 0.05396 seconds and 4 git commands to generate.