]> Git Repo - VerusCoin.git/blob - src/chainparams.cpp
Implement accurate memory accounting for mempool
[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         fMiningRequiresPeers = true;
121         fDefaultConsistencyChecks = false;
122         fRequireStandard = true;
123         fMineBlocksOnDemand = false;
124         fTestnetToBeDeprecatedFieldRPC = false;
125
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))
137         };
138
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*/
196 };
197         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
198     }
199 };
200 static CMainParams mainParams;
201
202 /**
203  * Testnet (v3)
204  */
205 class CTestNetParams : public CMainParams {
206 public:
207     CTestNetParams() {
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;
222         nMinerThreads = 0;
223         nPruneAfterHeight = 1000;
224
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"));
232
233         vFixedSeeds.clear();
234         vSeeds.clear();
235         vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
236
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};
250
251         vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
252
253         fMiningRequiresPeers = true;
254         fDefaultConsistencyChecks = false;
255         fRequireStandard = true;
256         fMineBlocksOnDemand = false;
257         fTestnetToBeDeprecatedFieldRPC = true;
258
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))
267         };
268
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", 
283             };
284         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
285     }
286 };
287 static CTestNetParams testNetParams;
288
289 /**
290  * Regression test
291  */
292 class CRegTestParams : public CTestNetParams {
293 public:
294     CRegTestParams() {
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;
311         nMinerThreads = 1;
312         nMaxTipAge = 24 * 60 * 60;
313         const size_t N = 48, K = 5;
314         BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
315         nEquihashN = N;
316         nEquihashK = 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;
325
326         vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
327         vSeeds.clear();  //! Regtest mode doesn't have any DNS seeds.
328
329         fMiningRequiresPeers = false;
330         fDefaultConsistencyChecks = true;
331         fRequireStandard = false;
332         fMineBlocksOnDemand = true;
333         fTestnetToBeDeprecatedFieldRPC = false;
334
335         checkpointData = (Checkpoints::CCheckpointData){
336             boost::assign::map_list_of
337             ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
338             0,
339             0,
340             0
341         };
342
343         // Founders reward script expects a vector of 2-of-3 multisig addresses
344         vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
345         assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
346     }
347 };
348 static CRegTestParams regTestParams;
349
350 static CChainParams *pCurrentParams = 0;
351
352 const CChainParams &Params() {
353     assert(pCurrentParams);
354     return *pCurrentParams;
355 }
356
357 CChainParams &Params(CBaseChainParams::Network network) {
358     switch (network) {
359         case CBaseChainParams::MAIN:
360             return mainParams;
361         case CBaseChainParams::TESTNET:
362             return testNetParams;
363         case CBaseChainParams::REGTEST:
364             return regTestParams;
365         default:
366             assert(false && "Unimplemented network");
367             return mainParams;
368     }
369 }
370
371 void SelectParams(CBaseChainParams::Network network) {
372     SelectBaseParams(network);
373     pCurrentParams = &Params(network);
374
375     // Some python qa rpc tests need to enforce the coinbase consensus rule
376     if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
377         regTestParams.SetRegTestCoinbaseMustBeProtected();
378     }
379 }
380
381 bool SelectParamsFromCommandLine()
382 {
383     CBaseChainParams::Network network = NetworkIdFromCommandLine();
384     if (network == CBaseChainParams::MAX_NETWORK_TYPES)
385         return false;
386
387     SelectParams(network);
388     return true;
389 }
390
391
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);
397
398     size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
399     size_t i = nHeight / addressChangeInterval;
400     return vFoundersRewardAddress[i];
401 }
402
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());
407
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;
413     return script;
414 }
415
416 std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
417     assert(i >= 0 && i < vFoundersRewardAddress.size());
418     return vFoundersRewardAddress[i];
419 }
This page took 0.048917 seconds and 4 git commands to generate.