2013-05-07 06:16:25 -07:00
|
|
|
// Copyright (c) 2010 Satoshi Nakamoto
|
2014-12-16 17:47:57 -08:00
|
|
|
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
2014-10-25 02:24:16 -07:00
|
|
|
// Distributed under the MIT software license, see the accompanying
|
2013-05-07 06:16:25 -07:00
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
2016-08-23 22:13:06 -07:00
|
|
|
#include "main.h"
|
|
|
|
#include "crypto/equihash.h"
|
2013-04-12 22:13:08 -07:00
|
|
|
|
2013-05-07 06:16:25 -07:00
|
|
|
#include "util.h"
|
2014-09-24 20:32:36 -07:00
|
|
|
#include "utilstrencodings.h"
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-08-28 13:56:53 -07:00
|
|
|
#include <assert.h>
|
|
|
|
|
2013-06-22 17:33:47 -07:00
|
|
|
#include <boost/assign/list_of.hpp>
|
|
|
|
|
2016-09-21 12:02:36 -07:00
|
|
|
#include "base58.h"
|
|
|
|
|
2014-06-16 07:30:38 -07:00
|
|
|
using namespace std;
|
2013-06-22 17:33:47 -07:00
|
|
|
|
2014-07-24 04:52:57 -07:00
|
|
|
#include "chainparamsseeds.h"
|
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
/**
|
|
|
|
* Main network
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* What makes a good checkpoint block?
|
|
|
|
* + Is surrounded by blocks with reasonable timestamps
|
|
|
|
* (no blocks before with a timestamp after, none after with
|
|
|
|
* timestamp before)
|
|
|
|
* + Contains no strange transactions
|
|
|
|
*/
|
2014-08-31 12:32:23 -07:00
|
|
|
|
2016-09-06 13:17:43 -07:00
|
|
|
const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
|
|
|
|
|
2013-05-07 06:16:25 -07:00
|
|
|
class CMainParams : public CChainParams {
|
|
|
|
public:
|
|
|
|
CMainParams() {
|
2014-06-11 03:23:49 -07:00
|
|
|
strNetworkID = "main";
|
2016-10-30 14:36:36 -07:00
|
|
|
strCurrencyUnits = "ZEC";
|
2016-06-14 14:16:34 -07:00
|
|
|
consensus.fCoinbaseMustBeProtected = true;
|
2016-06-03 00:09:39 -07:00
|
|
|
consensus.nSubsidySlowStartInterval = 20000;
|
|
|
|
consensus.nSubsidyHalvingInterval = 840000;
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
|
|
|
consensus.nMajorityRejectBlockOutdated = 950;
|
2016-06-03 00:09:39 -07:00
|
|
|
consensus.nMajorityWindow = 4000;
|
2016-10-28 02:55:43 -07:00
|
|
|
consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
2016-06-07 17:30:32 -07:00
|
|
|
consensus.nPowAveragingWindow = 17;
|
2016-09-06 13:17:43 -07:00
|
|
|
assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
|
2016-09-05 18:13:23 -07:00
|
|
|
consensus.nPowMaxAdjustDown = 32; // 32% adjustment down
|
|
|
|
consensus.nPowMaxAdjustUp = 16; // 16% adjustment up
|
2016-06-03 00:09:39 -07:00
|
|
|
consensus.nPowTargetSpacing = 2.5 * 60;
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.fPowAllowMinDifficultyBlocks = false;
|
2016-10-22 18:06:39 -07:00
|
|
|
/**
|
2016-10-28 07:32:25 -07:00
|
|
|
* The message start string should be awesome! ⓩ❤
|
2014-10-25 02:24:16 -07:00
|
|
|
*/
|
2016-10-28 07:32:25 -07:00
|
|
|
pchMessageStart[0] = 0x24;
|
|
|
|
pchMessageStart[1] = 0xe9;
|
|
|
|
pchMessageStart[2] = 0x27;
|
|
|
|
pchMessageStart[3] = 0x64;
|
2016-07-14 22:38:41 -07:00
|
|
|
vAlertPubKey = ParseHex("04b7ecf0baa90495ceb4e4090f6b2fd37eec1e9c85fac68a487f3ce11589692e4a317479316ee814e066638e1db54e37a10689b70286e6315b1087b6615d179264");
|
2016-06-15 19:14:27 -07:00
|
|
|
nDefaultPort = 8233;
|
2014-03-07 22:47:56 -08:00
|
|
|
nMinerThreads = 0;
|
2015-04-09 04:50:18 -07:00
|
|
|
nMaxTipAge = 24 * 60 * 60;
|
Add block pruning functionality
This adds a -prune=N option to bitcoind, which if set to N>0 will enable block
file pruning. When pruning is enabled, block and undo files will be deleted to
try to keep total space used by those files to below the prune target (N, in
MB) specified by the user, subject to some constraints:
- The last 288 blocks on the main chain are always kept (MIN_BLOCKS_TO_KEEP),
- N must be at least 550MB (chosen as a value for the target that could
reasonably be met, with some assumptions about block sizes, orphan rates,
etc; see comment in main.h),
- No blocks are pruned until chainActive is at least 100,000 blocks long (on
mainnet; defined separately for mainnet, testnet, and regtest in chainparams
as nPruneAfterHeight).
This unsets NODE_NETWORK if pruning is enabled.
Also included is an RPC test for pruning (pruning.py).
Thanks to @rdponticelli for earlier work on this feature; this is based in
part off that work.
2015-02-23 11:27:44 -08:00
|
|
|
nPruneAfterHeight = 100000;
|
2016-08-23 22:13:06 -07:00
|
|
|
const size_t N = 200, K = 9;
|
|
|
|
BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
|
|
|
|
nEquihashN = N;
|
|
|
|
nEquihashK = K;
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
/**
|
2015-04-28 07:47:17 -07:00
|
|
|
* Build the genesis block. Note that the output of its generation
|
|
|
|
* transaction cannot be spent since it did not originally exist in the
|
2016-10-22 05:28:05 -07:00
|
|
|
* database (and is in any case of zero value).
|
2016-10-28 02:55:43 -07:00
|
|
|
*
|
|
|
|
* >>> from pyblake2 import blake2s
|
|
|
|
* >>> '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()
|
2014-10-25 02:24:16 -07:00
|
|
|
*/
|
2016-10-28 02:55:43 -07:00
|
|
|
const char* pszTimestamp = "Zcash0b9c4eef8b7cc417ee5001e3500984b6fea35683a7cac141a043c42064835d34";
|
2014-06-07 04:53:27 -07:00
|
|
|
CMutableTransaction txNew;
|
2013-05-07 06:16:25 -07:00
|
|
|
txNew.vin.resize(1);
|
|
|
|
txNew.vout.resize(1);
|
2016-10-28 02:55:43 -07:00
|
|
|
txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
|
2016-10-21 19:19:06 -07:00
|
|
|
txNew.vout[0].nValue = 0;
|
2013-05-07 06:16:25 -07:00
|
|
|
txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
|
|
|
genesis.vtx.push_back(txNew);
|
2014-12-15 00:11:16 -08:00
|
|
|
genesis.hashPrevBlock.SetNull();
|
2013-05-07 06:16:25 -07:00
|
|
|
genesis.hashMerkleRoot = genesis.BuildMerkleTree();
|
2016-10-21 19:19:06 -07:00
|
|
|
genesis.nVersion = 4;
|
2016-10-28 02:55:43 -07:00
|
|
|
genesis.nTime = 1477641360;
|
|
|
|
genesis.nBits = 0x1f07ffff;
|
|
|
|
genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000001257");
|
|
|
|
genesis.nSolution = ParseHex("000a889f00854b8665cd555f4656f68179d31ccadc1b1f7fb0952726313b16941da348284d67add4686121d4e3d930160c1348d8191c25f12b267a6a9c131b5031cbf8af1f79c9d513076a216ec87ed045fa966e01214ed83ca02dc1797270a454720d3206ac7d931a0a680c5c5e099057592570ca9bdf6058343958b31901fce1a15a4f38fd347750912e14004c73dfe588b903b6c03166582eeaf30529b14072a7b3079e3a684601b9b3024054201f7440b0ee9eb1a7120ff43f713735494aa27b1f8bab60d7f398bca14f6abb2adbf29b04099121438a7974b078a11635b594e9170f1086140b4173822dd697894483e1c6b4e8b8dcd5cb12ca4903bc61e108871d4d915a9093c18ac9b02b6716ce1013ca2c1174e319c1a570215bc9ab5f7564765f7be20524dc3fdf8aa356fd94d445e05ab165ad8bb4a0db096c097618c81098f91443c719416d39837af6de85015dca0de89462b1d8386758b2cf8a99e00953b308032ae44c35e05eb71842922eb69797f68813b59caf266cb6c213569ae3280505421a7e3a0a37fdf8e2ea354fc5422816655394a9454bac542a9298f176e211020d63dee6852c40de02267e2fc9d5e1ff2ad9309506f02a1a71a0501b16d0d36f70cdfd8de78116c0c506ee0b8ddfdeb561acadf31746b5a9dd32c21930884397fb1682164cb565cc14e089d66635a32618f7eb05fe05082b8a3fae620571660a6b89886eac53dec109d7cbb6930ca698a168f301a950be152da1be2b9e07516995e20baceebecb5579d7cdbc16d09f3a50cb3c7dffe33f26686d4ff3f8946ee6475e98cf7b3cf9062b6966e838f865ff3de5fb064a37a21da7bb8dfd2501a29e184f207caaba364f36f2329a77515dcb710e29ffbf73e2bbd773fab1f9a6b005567affff605c132e4e4dd69f36bd201005458cfbd2c658701eb2a700251cefd886b1e674ae816d3f719bac64be649c172ba27a4fd55947d95d53ba4cbc73de97b8af5ed4840b659370c556e7376457f51e5ebb66018849923db82c1c9a819f173cccdb8f3324b239609a300018d0fb094adf5bd7cbb3834c69e6d0b3798065c525b20f040e965e1a161af78ff7561cd874f5f1b75aa0bc77f720589e1b810f831eac5073e6dd46d00a2793f70f7427f0f798f2f53a67e615e65d356e66fe40609a958a05edb4c175bcc383ea0530e67ddbe479a898943c6e3074c6fcc252d6014de3a3d292b03f0d88d312fe221be7be7e3c59d07fa0f2f4029e364f1f355c5d01fa53770d0cd76d82bf7e60f6903bc1beb772e6fde4a70be51d9c7e03c8d6d8dfb361a234ba47c470fe630820bbd920715621b9fbedb49fcee165ead0875e6c2b1af16f50b5d6140cc981122fcbcf7c5a4e3772b3661b628e08380abc545957e59f634705b1bbde2f0b4e055a5ec5676d859be77e20962b645e051a880fddb0180b4555789e1f9344a436a84dc5579e2553f1e5fb0a599c137be36cabbed0319831fea3fddf94ddc7971e4bcf02cdc93294a9aab3e3b13e3b058235b4f4ec06ba4ceaa49d675b4ba80716f3bc6976b1fbf9c8bf1f3e3a4dc1cd83ef9cf816667fb94f1e923ff63fef072e6a19321e4812f96cb0ffa864da50ad74deb76917a336f31dce03ed5f0303aad5e6a83634f9fcc371096f8288b8f02ddded5ff1bb9d49331e4a84dbe1543164438fde9ad71dab024779dcdde0b6602b5ae0a6265c14b94edd83b37403f4b78fcd2ed555b596402c28ee81d87a909c4e8722b30c71ecdd861b05f61f8b1231795c76adba2fdefa451b283a5d527955b9f3de1b9828e7b2e74123dd47062ddcc09b05e7fa13cb2212a6fdbc65d7e852cec463ec6fd929f5b8483cf3052113b13dac91b69f49d1b7d1aec01c4a68e41ce157");
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
2016-10-28 02:55:43 -07:00
|
|
|
assert(consensus.hashGenesisBlock == uint256S("0x00040fe8ec8471911baa1db1266ea15dd06b4a8a5c453883c000b031973dce08"));
|
|
|
|
assert(genesis.hashMerkleRoot == uint256S("0xc4eaa58879081de3c24a7b117ed2b28300e7ec4c4c1dff1d3f1268b7857a4ddb"));
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2016-08-31 22:00:20 -07:00
|
|
|
vFixedSeeds.clear();
|
|
|
|
vSeeds.clear();
|
2016-10-26 15:08:30 -07:00
|
|
|
vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.z.cash")); // Zcash
|
|
|
|
vSeeds.push_back(CDNSSeedData("str4d.xyz", "dnsseed.str4d.xyz")); // @str4d
|
|
|
|
vSeeds.push_back(CDNSSeedData("znodes.org", "dnsseed.znodes.org")); // @bitcartel
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2016-10-03 11:58:16 -07:00
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "t1"
|
|
|
|
base58Prefixes[PUBKEY_ADDRESS] = {0x1C,0xB8};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "t3"
|
|
|
|
base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBD};
|
|
|
|
// the first character, when base58 encoded, is "5" or "K" or "L" (as in Bitcoin)
|
|
|
|
base58Prefixes[SECRET_KEY] = {0x80};
|
|
|
|
// do not rely on these BIP32 prefixes; they are not specified and may change
|
|
|
|
base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x88,0xB2,0x1E};
|
|
|
|
base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "zc"
|
|
|
|
base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "SK"
|
|
|
|
base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36};
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2015-01-23 20:40:50 -08:00
|
|
|
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-06-04 03:51:29 -07:00
|
|
|
fRequireRPCPassword = true;
|
|
|
|
fMiningRequiresPeers = true;
|
2015-03-13 09:25:34 -07:00
|
|
|
fDefaultConsistencyChecks = false;
|
2014-06-04 03:51:29 -07:00
|
|
|
fRequireStandard = true;
|
|
|
|
fMineBlocksOnDemand = false;
|
2014-08-31 13:32:52 -07:00
|
|
|
fTestnetToBeDeprecatedFieldRPC = false;
|
2014-08-31 12:32:23 -07:00
|
|
|
|
2015-04-23 15:30:55 -07:00
|
|
|
checkpointData = (Checkpoints::CCheckpointData) {
|
|
|
|
boost::assign::map_list_of
|
2016-11-01 08:16:51 -07:00
|
|
|
(0, consensus.hashGenesisBlock)
|
2016-11-16 16:17:46 -08:00
|
|
|
(2500, uint256S("0x00000006dc968f600be11a86cbfbf7feb61c7577f45caced2e82b6d261d19744"))
|
|
|
|
(15000, uint256S("0x00000000b6bc56656812a5b8dcad69d6ad4446dec23b5ec456c18641fb5381ba")),
|
|
|
|
1479851027, // * UNIX timestamp of last checkpoint block
|
|
|
|
110415, // * total number of transactions between genesis and last checkpoint
|
|
|
|
// (the tx=... number in the SetBestChain debug.log lines)
|
|
|
|
4240 // * estimated number of transactions per day after checkpoint
|
|
|
|
// total number of tx / (checkpoint block height / (24 * 24))
|
2015-04-23 15:30:55 -07:00
|
|
|
};
|
2016-09-21 12:02:36 -07:00
|
|
|
|
|
|
|
// Founders reward script expects a vector of 2-of-3 multisig addresses
|
|
|
|
vFoundersRewardAddress = {
|
2016-10-26 20:31:16 -07:00
|
|
|
"t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", /* main-index: 0*/
|
|
|
|
"t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", /* main-index: 1*/
|
|
|
|
"t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", /* main-index: 2*/
|
|
|
|
"t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", /* main-index: 3*/
|
|
|
|
"t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", /* main-index: 4*/
|
|
|
|
"t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", /* main-index: 5*/
|
|
|
|
"t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", /* main-index: 6*/
|
|
|
|
"t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", /* main-index: 7*/
|
|
|
|
"t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", /* main-index: 8*/
|
|
|
|
"t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", /* main-index: 9*/
|
|
|
|
"t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", /* main-index: 10*/
|
|
|
|
"t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", /* main-index: 11*/
|
|
|
|
"t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", /* main-index: 12*/
|
|
|
|
"t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", /* main-index: 13*/
|
|
|
|
"t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", /* main-index: 14*/
|
|
|
|
"t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", /* main-index: 15*/
|
|
|
|
"t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", /* main-index: 16*/
|
|
|
|
"t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", /* main-index: 17*/
|
|
|
|
"t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", /* main-index: 18*/
|
|
|
|
"t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", /* main-index: 19*/
|
|
|
|
"t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", /* main-index: 20*/
|
|
|
|
"t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", /* main-index: 21*/
|
|
|
|
"t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", /* main-index: 22*/
|
|
|
|
"t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", /* main-index: 23*/
|
|
|
|
"t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", /* main-index: 24*/
|
|
|
|
"t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", /* main-index: 25*/
|
|
|
|
"t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", /* main-index: 26*/
|
|
|
|
"t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", /* main-index: 27*/
|
|
|
|
"t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", /* main-index: 28*/
|
|
|
|
"t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", /* main-index: 29*/
|
|
|
|
"t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", /* main-index: 30*/
|
|
|
|
"t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", /* main-index: 31*/
|
|
|
|
"t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", /* main-index: 32*/
|
|
|
|
"t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", /* main-index: 33*/
|
|
|
|
"t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", /* main-index: 34*/
|
|
|
|
"t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", /* main-index: 35*/
|
|
|
|
"t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", /* main-index: 36*/
|
|
|
|
"t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", /* main-index: 37*/
|
|
|
|
"t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", /* main-index: 38*/
|
|
|
|
"t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", /* main-index: 39*/
|
|
|
|
"t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", /* main-index: 40*/
|
|
|
|
"t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", /* main-index: 41*/
|
|
|
|
"t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", /* main-index: 42*/
|
|
|
|
"t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", /* main-index: 43*/
|
|
|
|
"t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", /* main-index: 44*/
|
|
|
|
"t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", /* main-index: 45*/
|
|
|
|
"t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", /* main-index: 46*/
|
|
|
|
"t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", /* main-index: 47*/
|
|
|
|
// "t3PZ9PPcLzgL57XRSG5ND4WNBC9UTFb8DXv", /* main-index: 48*/
|
|
|
|
// "t3L1WgcyQ95vtpSgjHfgANHyVYvffJZ9iGb", /* main-index: 49*/
|
|
|
|
// "t3JtoXqsv3FuS7SznYCd5pZJGU9di15mdd7", /* main-index: 50*/
|
|
|
|
// "t3hLJHrHs3ytDgExxr1mD8DYSrk1TowGV25", /* main-index: 51*/
|
|
|
|
// "t3fmYHU2DnVaQgPhDs6TMFVmyC3qbWEWgXN", /* main-index: 52*/
|
|
|
|
// "t3T4WmAp6nrLkJ24iPpGeCe1fSWTPv47ASG", /* main-index: 53*/
|
|
|
|
// "t3fP6GrDM4QVwdjFhmCxGNbe7jXXXSDQ5dv", /* main-index: 54*/
|
|
|
|
};
|
2016-09-29 10:24:15 -07:00
|
|
|
assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
|
2014-08-31 12:32:23 -07:00
|
|
|
}
|
2013-05-07 06:16:25 -07:00
|
|
|
};
|
|
|
|
static CMainParams mainParams;
|
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
/**
|
|
|
|
* Testnet (v3)
|
|
|
|
*/
|
2013-05-07 06:16:25 -07:00
|
|
|
class CTestNetParams : public CMainParams {
|
|
|
|
public:
|
|
|
|
CTestNetParams() {
|
2014-06-11 03:23:49 -07:00
|
|
|
strNetworkID = "test";
|
2016-10-30 14:36:36 -07:00
|
|
|
strCurrencyUnits = "TAZ";
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.nMajorityEnforceBlockUpgrade = 51;
|
|
|
|
consensus.nMajorityRejectBlockOutdated = 75;
|
2016-06-03 00:09:39 -07:00
|
|
|
consensus.nMajorityWindow = 400;
|
2016-10-26 21:03:37 -07:00
|
|
|
consensus.powLimit = uint256S("07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
2016-09-06 13:17:43 -07:00
|
|
|
assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.fPowAllowMinDifficultyBlocks = true;
|
2016-10-27 05:47:22 -07:00
|
|
|
pchMessageStart[0] = 0xfa;
|
|
|
|
pchMessageStart[1] = 0x1a;
|
2016-10-28 07:32:25 -07:00
|
|
|
pchMessageStart[2] = 0xf9;
|
|
|
|
pchMessageStart[3] = 0xbf;
|
2016-07-14 22:38:41 -07:00
|
|
|
vAlertPubKey = ParseHex("044e7a1553392325c871c5ace5d6ad73501c66f4c185d6b0453cf45dec5a1322e705c672ac1a27ef7cdaf588c10effdf50ed5f95f85f2f54a5f6159fca394ed0c6");
|
2016-06-15 19:14:27 -07:00
|
|
|
nDefaultPort = 18233;
|
2014-03-22 10:29:34 -07:00
|
|
|
nMinerThreads = 0;
|
Add block pruning functionality
This adds a -prune=N option to bitcoind, which if set to N>0 will enable block
file pruning. When pruning is enabled, block and undo files will be deleted to
try to keep total space used by those files to below the prune target (N, in
MB) specified by the user, subject to some constraints:
- The last 288 blocks on the main chain are always kept (MIN_BLOCKS_TO_KEEP),
- N must be at least 550MB (chosen as a value for the target that could
reasonably be met, with some assumptions about block sizes, orphan rates,
etc; see comment in main.h),
- No blocks are pruned until chainActive is at least 100,000 blocks long (on
mainnet; defined separately for mainnet, testnet, and regtest in chainparams
as nPruneAfterHeight).
This unsets NODE_NETWORK if pruning is enabled.
Also included is an RPC test for pruning (pruning.py).
Thanks to @rdponticelli for earlier work on this feature; this is based in
part off that work.
2015-02-23 11:27:44 -08:00
|
|
|
nPruneAfterHeight = 1000;
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
//! Modify the testnet genesis block so the timestamp is valid for a later start.
|
2016-10-28 02:55:43 -07:00
|
|
|
genesis.nTime = 1477648033;
|
2016-10-26 21:03:37 -07:00
|
|
|
genesis.nBits = 0x2007ffff;
|
2016-10-28 02:55:43 -07:00
|
|
|
genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000006");
|
|
|
|
genesis.nSolution = ParseHex("00a6a51259c3f6732481e2d035197218b7a69504461d04335503cd69759b2d02bd2b53a9653f42cb33c608511c953673fa9da76170958115fe92157ad3bb5720d927f18e09459bf5c6072973e143e20f9bdf0584058c96b7c2234c7565f100d5eea083ba5d3dbaff9f0681799a113e7beff4a611d2b49590563109962baa149b628aae869af791f2f70bb041bd7ebfa658570917f6654a142b05e7ec0289a4f46470be7be5f693b90173eaaa6e84907170f32602204f1f4e1c04b1830116ffd0c54f0b1caa9a5698357bd8aa1f5ac8fc93b405265d824ba0e49f69dab5446653927298e6b7bdc61ee86ff31c07bde86331b4e500d42e4e50417e285502684b7966184505b885b42819a88469d1e9cf55072d7f3510f85580db689302eab377e4e11b14a91fdd0df7627efc048934f0aff8e7eb77eb17b3a95de13678004f2512293891d8baf8dde0ef69be520a58bbd6038ce899c9594cf3e30b8c3d9c7ecc832d4c19a6212747b50724e6f70f6451f78fd27b58ce43ca33b1641304a916186cfbe7dbca224f55d08530ba851e4df22baf7ab7078e9cbea46c0798b35a750f54103b0cdd08c81a6505c4932f6bfbd492a9fced31d54e98b6370d4c96600552fcf5b37780ed18c8787d03200963600db297a8f05dfa551321d17b9917edadcda51e274830749d133ad226f8bb6b94f13b4f77e67b35b71f52112ce9ba5da706ad9573584a2570a4ff25d29ab9761a06bdcf2c33638bf9baf2054825037881c14adf3816ba0cbd0fca689aad3ce16f2fe362c98f48134a9221765d939f0b49677d1c2447e56b46859f1810e2cf23e82a53e0d44f34dae932581b3b7f49eaec59af872cf9de757a964f7b33d143a36c270189508fcafe19398e4d2966948164d40556b05b7ff532f66f5d1edc41334ef742f78221dfe0c7ae2275bb3f24c89ae35f00afeea4e6ed187b866b209dc6e83b660593fce7c40e143beb07ac86c56f39e895385924667efe3a3f031938753c7764a2dbeb0a643fd359c46e614873fd0424e435fa7fac083b9a41a9d6bf7e284eee537ea7c50dd239f359941a43dc982745184bf3ee31a8dc850316aa9c6b66d6985acee814373be3458550659e1a06287c3b3b76a185c5cb93e38c1eebcf34ff072894b6430aed8d34122dafd925c46a515cca79b0269c92b301890ca6b0dc8b679cdac0f23318c105de73d7a46d16d2dad988d49c22e9963c117960bdc70ef0db6b091cf09445a516176b7f6d58ec29539166cc8a38bbff387acefffab2ea5faad0e8bb70625716ef0edf61940733c25993ea3de9f0be23d36e7cb8da10505f9dc426cd0e6e5b173ab4fff8c37e1f1fb56d1ea372013d075e0934c6919393cfc21395eea20718fad03542a4162a9ded66c814ad8320b2d7c2da3ecaf206da34c502db2096d1c46699a91dd1c432f019ad434e2c1ce507f91104f66f491fed37b225b8e0b2888c37276cfa0468fc13b8d593fd9a2675f0f5b20b8a15f8fa7558176a530d6865738ddb25d3426dab905221681cf9da0e0200eea5b2eba3ad3a5237d2a391f9074bf1779a2005cee43eec2b058511532635e0fea61664f531ac2b356f40db5c5d275a4cf5c82d468976455af4e3362cc8f71aa95e71d394aff3ead6f7101279f95bcd8a0fedce1d21cb3c9f6dd3b182fce0db5d6712981b651f29178a24119968b14783cafa713bc5f2a65205a42e4ce9dc7ba462bdb1f3e4553afc15f5f39998fdb53e7e231e3e520a46943734a007c2daa1eda9f495791657eefcac5c32833936e568d06187857ed04d7b97167ae207c5c5ae54e528c36016a984235e9c5b2f0718d7b3aa93c7822ccc772580b6599671b3c02ece8a21399abd33cfd3028790133167d0a97e7de53dc8ff");
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
2016-10-28 02:55:43 -07:00
|
|
|
assert(consensus.hashGenesisBlock == uint256S("0x05a60a92d99d85997cce3b87616c089f6124d7342af37106edc76126334a2c38"));
|
2013-05-07 06:16:25 -07:00
|
|
|
|
|
|
|
vFixedSeeds.clear();
|
|
|
|
vSeeds.clear();
|
2016-09-26 14:34:26 -07:00
|
|
|
vSeeds.push_back(CDNSSeedData("z.cash", "dnsseed.testnet.z.cash")); // Zcash
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2016-10-03 11:58:16 -07:00
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "tm"
|
|
|
|
base58Prefixes[PUBKEY_ADDRESS] = {0x1D,0x25};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "t2"
|
|
|
|
base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBA};
|
|
|
|
// the first character, when base58 encoded, is "9" or "c" (as in Bitcoin)
|
|
|
|
base58Prefixes[SECRET_KEY] = {0xEF};
|
|
|
|
// do not rely on these BIP32 prefixes; they are not specified and may change
|
|
|
|
base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x35,0x87,0xCF};
|
|
|
|
base58Prefixes[EXT_SECRET_KEY] = {0x04,0x35,0x83,0x94};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "zt"
|
|
|
|
base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0xB6};
|
|
|
|
// guarantees the first 2 characters, when base58 encoded, are "ST"
|
|
|
|
base58Prefixes[ZCSPENDING_KEY] = {0xAC,0x08};
|
2014-03-22 12:09:12 -07:00
|
|
|
|
2015-01-23 20:40:50 -08:00
|
|
|
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
|
2014-07-24 04:52:57 -07:00
|
|
|
|
2014-06-04 03:51:29 -07:00
|
|
|
fRequireRPCPassword = true;
|
|
|
|
fMiningRequiresPeers = true;
|
2015-03-13 09:25:34 -07:00
|
|
|
fDefaultConsistencyChecks = false;
|
2016-10-21 21:59:07 -07:00
|
|
|
fRequireStandard = true;
|
2014-06-04 03:51:29 -07:00
|
|
|
fMineBlocksOnDemand = false;
|
2014-08-31 13:32:52 -07:00
|
|
|
fTestnetToBeDeprecatedFieldRPC = true;
|
2015-04-23 15:30:55 -07:00
|
|
|
|
|
|
|
checkpointData = (Checkpoints::CCheckpointData) {
|
|
|
|
boost::assign::map_list_of
|
2016-01-13 10:28:24 -08:00
|
|
|
( 0, consensus.hashGenesisBlock),
|
|
|
|
genesis.nTime,
|
|
|
|
0,
|
|
|
|
0
|
2015-04-23 15:30:55 -07:00
|
|
|
};
|
|
|
|
|
2016-09-21 12:02:36 -07:00
|
|
|
// Founders reward script expects a vector of 2-of-3 multisig addresses
|
|
|
|
vFoundersRewardAddress = {
|
2016-12-15 23:54:17 -08:00
|
|
|
"t2Mcc7khmWtviJKZLn9XyqPcs2zfQDn5K4X", "t2M29JPXXM8p97jFHexpVRuKBZxjLcXseey", "t26eA72uzJbHroLGgbWq9ZxCPu4keAFMP54", "t2ENg7hHVqqs9JwU5cgjvSbxnT2a9USNfhy",
|
|
|
|
"t2BkYdVCHzvTJJUTx4yZB8qeegD8QsPx8bo", "t2J8q1xH1EuigJ52MfExyyjYtN3VgvshKDf", "t2Crq9mydTm37kZokC68HzT6yez3t2FBnFj", "t2EaMPUiQ1kthqcP5UEkF42CAFKJqXCkXC9",
|
|
|
|
"t2F9dtQc63JDDyrhnfpzvVYTJcr57MkqA12", "t2LPirmnfYSZc481GgZBa6xUGcoovfytBnC", "t26xfxoSw2UV9Pe5o3C8V4YybQD4SESfxtp", "t2D3k4fNdErd66YxtvXEdft9xuLoKD7CcVo",
|
|
|
|
"t2DWYBkxKNivdmsMiivNJzutaQGqmoRjRnL", "t2C3kFF9iQRxfc4B9zgbWo4dQLLqzqjpuGQ", "t2MnT5tzu9HSKcppRyUNwoTp8MUueuSGNaB", "t2AREsWdoW1F8EQYsScsjkgqobmgrkKeUkK",
|
|
|
|
"t2Vf4wKcJ3ZFtLj4jezUUKkwYR92BLHn5UT", "t2K3fdViH6R5tRuXLphKyoYXyZhyWGghDNY", "t2VEn3KiKyHSGyzd3nDw6ESWtaCQHwuv9WC", "t2F8XouqdNMq6zzEvxQXHV1TjwZRHwRg8gC",
|
|
|
|
"t2BS7Mrbaef3fA4xrmkvDisFVXVrRBnZ6Qj", "t2FuSwoLCdBVPwdZuYoHrEzxAb9qy4qjbnL", "t2SX3U8NtrT6gz5Db1AtQCSGjrpptr8JC6h", "t2V51gZNSoJ5kRL74bf9YTtbZuv8Fcqx2FH",
|
|
|
|
"t2FyTsLjjdm4jeVwir4xzj7FAkUidbr1b4R", "t2EYbGLekmpqHyn8UBF6kqpahrYm7D6N1Le", "t2NQTrStZHtJECNFT3dUBLYA9AErxPCmkka", "t2GSWZZJzoesYxfPTWXkFn5UaxjiYxGBU2a",
|
|
|
|
"t2RpffkzyLRevGM3w9aWdqMX6bd8uuAK3vn", "t2JzjoQqnuXtTGSN7k7yk5keURBGvYofh1d", "t2AEefc72ieTnsXKmgK2bZNckiwvZe3oPNL", "t2NNs3ZGZFsNj2wvmVd8BSwSfvETgiLrD8J",
|
|
|
|
"t2ECCQPVcxUCSSQopdNquguEPE14HsVfcUn", "t2JabDUkG8TaqVKYfqDJ3rqkVdHKp6hwXvG", "t2FGzW5Zdc8Cy98ZKmRygsVGi6oKcmYir9n", "t2DUD8a21FtEFn42oVLp5NGbogY13uyjy9t",
|
|
|
|
"t2UjVSd3zheHPgAkuX8WQW2CiC9xHQ8EvWp", "t2TBUAhELyHUn8i6SXYsXz5Lmy7kDzA1uT5", "t2Tz3uCyhP6eizUWDc3bGH7XUC9GQsEyQNc", "t2NysJSZtLwMLWEJ6MH3BsxRh6h27mNcsSy",
|
|
|
|
"t2KXJVVyyrjVxxSeazbY9ksGyft4qsXUNm9", "t2J9YYtH31cveiLZzjaE4AcuwVho6qjTNzp", "t2QgvW4sP9zaGpPMH1GRzy7cpydmuRfB4AZ", "t2NDTJP9MosKpyFPHJmfjc5pGCvAU58XGa4",
|
|
|
|
"t29pHDBWq7qN4EjwSEHg8wEqYe9pkmVrtRP", "t2Ez9KM8VJLuArcxuEkNRAkhNvidKkzXcjJ", "t2D5y7J5fpXajLbGrMBQkFg2mFN8fo3n8cX", "t2UV2wr1PTaUiybpkV3FdSdGxUJeZdZztyt",
|
|
|
|
};
|
2016-09-29 10:24:15 -07:00
|
|
|
assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
|
2014-08-31 12:32:23 -07:00
|
|
|
}
|
2013-05-07 06:16:25 -07:00
|
|
|
};
|
|
|
|
static CTestNetParams testNetParams;
|
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
/**
|
|
|
|
* Regression test
|
|
|
|
*/
|
2013-05-07 06:16:25 -07:00
|
|
|
class CRegTestParams : public CTestNetParams {
|
|
|
|
public:
|
|
|
|
CRegTestParams() {
|
2014-06-11 03:23:49 -07:00
|
|
|
strNetworkID = "regtest";
|
2016-10-30 14:36:36 -07:00
|
|
|
strCurrencyUnits = "REG";
|
2016-06-14 14:16:34 -07:00
|
|
|
consensus.fCoinbaseMustBeProtected = false;
|
2016-05-10 04:11:32 -07:00
|
|
|
consensus.nSubsidySlowStartInterval = 0;
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.nSubsidyHalvingInterval = 150;
|
|
|
|
consensus.nMajorityEnforceBlockUpgrade = 750;
|
|
|
|
consensus.nMajorityRejectBlockOutdated = 950;
|
|
|
|
consensus.nMajorityWindow = 1000;
|
2016-09-06 13:17:43 -07:00
|
|
|
consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f");
|
|
|
|
assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow);
|
2016-06-07 17:30:32 -07:00
|
|
|
consensus.nPowMaxAdjustDown = 0; // Turn off adjustment down
|
|
|
|
consensus.nPowMaxAdjustUp = 0; // Turn off adjustment up
|
2016-04-11 11:43:32 -07:00
|
|
|
pchMessageStart[0] = 0xaa;
|
|
|
|
pchMessageStart[1] = 0xe8;
|
|
|
|
pchMessageStart[2] = 0x3f;
|
|
|
|
pchMessageStart[3] = 0x5f;
|
2014-03-07 22:47:56 -08:00
|
|
|
nMinerThreads = 1;
|
2015-04-09 04:50:18 -07:00
|
|
|
nMaxTipAge = 24 * 60 * 60;
|
2016-08-23 22:13:06 -07:00
|
|
|
const size_t N = 48, K = 5;
|
|
|
|
BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K));
|
|
|
|
nEquihashN = N;
|
|
|
|
nEquihashK = K;
|
2013-05-07 06:16:25 -07:00
|
|
|
genesis.nTime = 1296688602;
|
2016-09-06 13:18:46 -07:00
|
|
|
genesis.nBits = 0x200f0f0f;
|
2016-10-21 19:19:06 -07:00
|
|
|
genesis.nNonce = uint256S("0x0000000000000000000000000000000000000000000000000000000000000009");
|
2016-10-28 02:55:43 -07:00
|
|
|
genesis.nSolution = ParseHex("01936b7db1eb4ac39f151b8704642d0a8bda13ec547d54cd5e43ba142fc6d8877cab07b3");
|
2015-02-11 02:58:11 -08:00
|
|
|
consensus.hashGenesisBlock = genesis.GetHash();
|
2013-05-07 06:16:25 -07:00
|
|
|
nDefaultPort = 18444;
|
2016-10-28 02:55:43 -07:00
|
|
|
assert(consensus.hashGenesisBlock == uint256S("0x029f11d80ef9765602235e1bc9727e3eb6ba20839319f761fee920d63401e327"));
|
Add block pruning functionality
This adds a -prune=N option to bitcoind, which if set to N>0 will enable block
file pruning. When pruning is enabled, block and undo files will be deleted to
try to keep total space used by those files to below the prune target (N, in
MB) specified by the user, subject to some constraints:
- The last 288 blocks on the main chain are always kept (MIN_BLOCKS_TO_KEEP),
- N must be at least 550MB (chosen as a value for the target that could
reasonably be met, with some assumptions about block sizes, orphan rates,
etc; see comment in main.h),
- No blocks are pruned until chainActive is at least 100,000 blocks long (on
mainnet; defined separately for mainnet, testnet, and regtest in chainparams
as nPruneAfterHeight).
This unsets NODE_NETWORK if pruning is enabled.
Also included is an RPC test for pruning (pruning.py).
Thanks to @rdponticelli for earlier work on this feature; this is based in
part off that work.
2015-02-23 11:27:44 -08:00
|
|
|
nPruneAfterHeight = 1000;
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-10-25 02:24:16 -07:00
|
|
|
vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
|
|
|
|
vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
|
2013-05-07 06:16:25 -07:00
|
|
|
|
2014-06-04 03:51:29 -07:00
|
|
|
fRequireRPCPassword = false;
|
|
|
|
fMiningRequiresPeers = false;
|
2015-03-13 09:25:34 -07:00
|
|
|
fDefaultConsistencyChecks = true;
|
2014-06-04 03:51:29 -07:00
|
|
|
fRequireStandard = false;
|
|
|
|
fMineBlocksOnDemand = true;
|
2014-08-31 13:32:52 -07:00
|
|
|
fTestnetToBeDeprecatedFieldRPC = false;
|
2015-04-23 15:30:55 -07:00
|
|
|
|
|
|
|
checkpointData = (Checkpoints::CCheckpointData){
|
|
|
|
boost::assign::map_list_of
|
|
|
|
( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
0
|
|
|
|
};
|
2016-09-21 12:02:36 -07:00
|
|
|
|
|
|
|
// Founders reward script expects a vector of 2-of-3 multisig addresses
|
2016-10-03 23:59:59 -07:00
|
|
|
vFoundersRewardAddress = { "t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg" };
|
2016-09-29 10:24:15 -07:00
|
|
|
assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight());
|
2014-08-31 12:32:23 -07:00
|
|
|
}
|
2013-05-07 06:16:25 -07:00
|
|
|
};
|
|
|
|
static CRegTestParams regTestParams;
|
|
|
|
|
2014-06-19 06:10:04 -07:00
|
|
|
static CChainParams *pCurrentParams = 0;
|
2013-05-07 06:16:25 -07:00
|
|
|
|
|
|
|
const CChainParams &Params() {
|
2014-06-19 06:10:04 -07:00
|
|
|
assert(pCurrentParams);
|
2013-05-07 06:16:25 -07:00
|
|
|
return *pCurrentParams;
|
|
|
|
}
|
|
|
|
|
2014-08-02 11:54:57 -07:00
|
|
|
CChainParams &Params(CBaseChainParams::Network network) {
|
2013-05-07 06:16:25 -07:00
|
|
|
switch (network) {
|
2014-06-19 06:10:04 -07:00
|
|
|
case CBaseChainParams::MAIN:
|
2014-08-02 11:54:57 -07:00
|
|
|
return mainParams;
|
2014-06-19 06:10:04 -07:00
|
|
|
case CBaseChainParams::TESTNET:
|
2014-08-02 11:54:57 -07:00
|
|
|
return testNetParams;
|
2014-06-19 06:10:04 -07:00
|
|
|
case CBaseChainParams::REGTEST:
|
2014-08-02 11:54:57 -07:00
|
|
|
return regTestParams;
|
2013-05-07 06:16:25 -07:00
|
|
|
default:
|
|
|
|
assert(false && "Unimplemented network");
|
2014-08-02 11:54:57 -07:00
|
|
|
return mainParams;
|
2013-05-07 06:16:25 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-02 11:54:57 -07:00
|
|
|
void SelectParams(CBaseChainParams::Network network) {
|
|
|
|
SelectBaseParams(network);
|
|
|
|
pCurrentParams = &Params(network);
|
2016-09-22 11:30:32 -07:00
|
|
|
|
|
|
|
// Some python qa rpc tests need to enforce the coinbase consensus rule
|
|
|
|
if (network == CBaseChainParams::REGTEST && mapArgs.count("-regtestprotectcoinbase")) {
|
|
|
|
regTestParams.SetRegTestCoinbaseMustBeProtected();
|
|
|
|
}
|
2014-08-02 11:54:57 -07:00
|
|
|
}
|
|
|
|
|
2014-10-16 13:49:33 -07:00
|
|
|
bool SelectParamsFromCommandLine()
|
2014-08-31 15:41:28 -07:00
|
|
|
{
|
2014-10-09 10:15:38 -07:00
|
|
|
CBaseChainParams::Network network = NetworkIdFromCommandLine();
|
2014-08-31 15:41:28 -07:00
|
|
|
if (network == CBaseChainParams::MAX_NETWORK_TYPES)
|
2013-05-07 06:16:25 -07:00
|
|
|
return false;
|
|
|
|
|
2014-08-31 15:41:28 -07:00
|
|
|
SelectParams(network);
|
2013-05-07 06:16:25 -07:00
|
|
|
return true;
|
|
|
|
}
|
2016-09-21 12:02:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
// Block height must be >0 and <=last founders reward block height
|
|
|
|
// Index variable i ranges from 0 - (vFoundersRewardAddress.size()-1)
|
2016-09-23 14:16:38 -07:00
|
|
|
std::string CChainParams::GetFoundersRewardAddressAtHeight(int nHeight) const {
|
2016-09-21 12:02:36 -07:00
|
|
|
int maxHeight = consensus.GetLastFoundersRewardBlockHeight();
|
2016-09-23 14:16:38 -07:00
|
|
|
assert(nHeight > 0 && nHeight <= maxHeight);
|
2016-09-21 12:02:36 -07:00
|
|
|
|
2016-09-22 16:38:44 -07:00
|
|
|
size_t addressChangeInterval = (maxHeight + vFoundersRewardAddress.size()) / vFoundersRewardAddress.size();
|
|
|
|
size_t i = nHeight / addressChangeInterval;
|
2016-09-21 12:02:36 -07:00
|
|
|
return vFoundersRewardAddress[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Block height must be >0 and <=last founders reward block height
|
|
|
|
// The founders reward address is expected to be a multisig (P2SH) address
|
2016-09-23 14:16:38 -07:00
|
|
|
CScript CChainParams::GetFoundersRewardScriptAtHeight(int nHeight) const {
|
2016-09-21 12:02:36 -07:00
|
|
|
assert(nHeight > 0 && nHeight <= consensus.GetLastFoundersRewardBlockHeight());
|
|
|
|
|
2016-09-22 16:38:44 -07:00
|
|
|
CBitcoinAddress address(GetFoundersRewardAddressAtHeight(nHeight).c_str());
|
2016-09-21 12:02:36 -07:00
|
|
|
assert(address.IsValid());
|
|
|
|
assert(address.IsScript());
|
|
|
|
CScriptID scriptID = get<CScriptID>(address.Get()); // Get() returns a boost variant
|
|
|
|
CScript script = CScript() << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
|
|
|
|
return script;
|
|
|
|
}
|
2016-09-22 16:38:44 -07:00
|
|
|
|
|
|
|
std::string CChainParams::GetFoundersRewardAddressAtIndex(int i) const {
|
2016-09-23 14:16:38 -07:00
|
|
|
assert(i >= 0 && i < vFoundersRewardAddress.size());
|
2016-09-22 16:38:44 -07:00
|
|
|
return vFoundersRewardAddress[i];
|
|
|
|
}
|