From 0e4b31755534fac4ea6c20a60f719e3694252220 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Tue, 7 May 2013 15:16:25 +0200 Subject: Introduce a CChainParameters singleton class and regtest mode. The new class is accessed via the Params() method and holds most things that vary between main, test and regtest networks. The regtest mode has two purposes, one is to run the bitcoind/bitcoinj comparison tool which compares two separate implementations of the Bitcoin protocol looking for divergence. The other is that when run, you get a local node which can mine a single block instantly, which is highly convenient for testing apps during development as there's no need to wait 10 minutes for a block on the testnet. --- src/chainparams.h | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/chainparams.h (limited to 'src/chainparams.h') diff --git a/src/chainparams.h b/src/chainparams.h new file mode 100644 index 0000000000..572712b589 --- /dev/null +++ b/src/chainparams.h @@ -0,0 +1,102 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2013 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_CHAIN_PARAMS_H +#define BITCOIN_CHAIN_PARAMS_H + +#include "bignum.h" +#include "uint256.h" +#include "util.h" + +#include + +using namespace std; + +#define MESSAGE_START_SIZE 4 +typedef unsigned char MessageStartChars[MESSAGE_START_SIZE]; + +class CAddress; +class CBlock; + +struct CDNSSeedData { + string name, host; + CDNSSeedData(const string &strName, const string &strHost) : name(strName), host(strHost) {} +}; + +/** + * CChainParams defines various tweakable parameters of a given instance of the + * Bitcoin system. There are three: the main network on which people trade goods + * and services, the public test network which gets reset from time to time and + * a regression test mode which is intended for private networks only. It has + * minimal difficulty to ensure that blocks can be found instantly. + */ +class CChainParams +{ +public: + enum Network { + MAIN, + TESTNET, + REGTEST, + }; + + enum Base58Type { + PUBKEY_ADDRESS, + SCRIPT_ADDRESS, + SECRET_KEY, + + MAX_BASE58_TYPES + }; + + const uint256& HashGenesisBlock() const { return hashGenesisBlock; } + const MessageStartChars& MessageStart() const { return pchMessageStart; } + const vector& AlertKey() const { return vAlertPubKey; } + int GetDefaultPort() const { return nDefaultPort; } + const CBigNum& ProofOfWorkLimit() const { return bnProofOfWorkLimit; } + int SubsidyHalvingInterval() const { return nSubsidyHalvingInterval; } + virtual const CBlock& GenesisBlock() const = 0; + virtual bool RequireRPCPassword() const { return true; } + const string& DataDir() const { return strDataDir; } + virtual Network NetworkID() const = 0; + const vector& DNSSeeds() const { return vSeeds; } + int Base58Prefix(Base58Type type) const { return base58Prefixes[type]; } + virtual const vector& FixedSeeds() const = 0; + int RPCPort() const { return nRPCPort; } +protected: + CChainParams() {}; + + uint256 hashGenesisBlock; + MessageStartChars pchMessageStart; + // Raw pub key bytes for the broadcast alert signing key. + vector vAlertPubKey; + int nDefaultPort; + int nRPCPort; + CBigNum bnProofOfWorkLimit; + int nSubsidyHalvingInterval; + string strDataDir; + vector vSeeds; + int base58Prefixes[MAX_BASE58_TYPES]; +}; + +/** + * Return the currently selected parameters. This won't change after app startup + * outside of the unit tests. + */ +const CChainParams &Params(); + +/** Sets the params returned by Params() to those for the given network. */ +void SelectParams(CChainParams::Network network); + +/** + * Looks for -regtest or -testnet and then calls SelectParams as appropriate. + * Returns false if an invalid combination is given. + */ +bool SelectParamsFromCommandLine(); + +inline bool TestNet() { + // Note: it's deliberate that this returns "false" for regression test mode. + return Params().NetworkID() == CChainParams::TESTNET; +} + +#endif -- cgit v1.2.3