From e2aef80ab8c92c6dec545049946bc875fc9b85af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Tim=C3=B3n?= Date: Fri, 23 Sep 2016 01:22:50 +0200 Subject: [PATCH] Preparations: Pass mapArgs to CChainParams::Factory --- src/bitcoin-tx.cpp | 2 +- src/bitcoind.cpp | 2 +- src/chainparams.cpp | 30 +++++++++++++++++++++++------- src/chainparams.h | 5 +++-- src/init.cpp | 3 ++- src/qt/bitcoin.cpp | 2 +- src/qt/paymentserver.cpp | 6 +++--- src/qt/test/paymentservertests.cpp | 2 +- src/test/Checkpoints_tests.cpp | 3 ++- src/test/base58_tests.cpp | 14 ++++++++------ src/test/main_tests.cpp | 3 ++- src/test/test_bitcoin.cpp | 2 +- src/test/versionbits_tests.cpp | 6 ++++-- 13 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp index a66cde5c5e..742fa7c8a4 100644 --- a/src/bitcoin-tx.cpp +++ b/src/bitcoin-tx.cpp @@ -44,7 +44,7 @@ static bool AppInitRawTx(int argc, char* argv[]) // Check for -chain, -testnet or -regtest parameter (Params() calls are only valid after this clause) try { - SelectParams(ChainNameFromCommandLine()); + SelectParams(ChainNameFromCommandLine(), mapArgs); } catch (const std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); return false; diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 64323519d5..a87a47748c 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -112,7 +112,7 @@ bool AppInit(int argc, char* argv[]) } // Check for -chain, -testnet or -regtest parameter (Params() calls are only valid after this clause) try { - SelectParams(ChainNameFromCommandLine()); + SelectParams(ChainNameFromCommandLine(), mapArgs); } catch (const std::exception& e) { fprintf(stderr, "Error: %s\n", e.what()); return false; diff --git a/src/chainparams.cpp b/src/chainparams.cpp index c546378bc3..1e9a50d745 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -48,6 +48,14 @@ static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesi class CElementsParams : public CChainParams { public: CElementsParams() { + std::map mapArgs; + Reset(mapArgs); + } + CElementsParams(const std::map& mapArgs) { + Reset(mapArgs); + } + void Reset(const std::map& mapArgs) + { strNetworkID = CHAINPARAMS_ELEMENTS; consensus.nSubsidyHalvingInterval = 210000; consensus.nMajorityEnforceBlockUpgrade = 750; @@ -133,7 +141,7 @@ public: */ class CMainParams : public CElementsParams { public: - CMainParams() : CElementsParams() { + CMainParams(const std::map& mapArgs) : CElementsParams(mapArgs) { strNetworkID = CHAINPARAMS_OLD_MAIN; base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,0); @@ -151,6 +159,14 @@ public: class CRegTestParams : public CChainParams { public: CRegTestParams() { + std::map mapArgs; + Reset(mapArgs); + } + CRegTestParams(const std::map& mapArgs) { + Reset(mapArgs); + } + void Reset(const std::map& mapArgs) + { strNetworkID = CHAINPARAMS_REGTEST; consensus.nSubsidyHalvingInterval = 150; consensus.nMajorityEnforceBlockUpgrade = 750; @@ -235,22 +251,22 @@ const CChainParams &Params() { return *globalChainParams; } -CChainParams* CChainParams::Factory(const std::string& chain) +CChainParams* CChainParams::Factory(const std::string& chain, const std::map& mapArgs) { if (chain == CBaseChainParams::MAIN) - return new CMainParams(); + return new CMainParams(mapArgs); else if (chain == CHAINPARAMS_ELEMENTS) - return new CElementsParams(); + return new CElementsParams(mapArgs); else if (chain == CBaseChainParams::REGTEST) - return new CRegTestParams(); + return new CRegTestParams(mapArgs); else throw std::runtime_error(strprintf("%s: Unknown chain %s.", __func__, chain)); } -void SelectParams(const std::string& network) +void SelectParams(const std::string& network, const std::map& mapArgs) { SelectBaseParams(network); - globalChainParams.reset(CChainParams::Factory(network)); + globalChainParams.reset(CChainParams::Factory(network, mapArgs)); } void UpdateRegtestBIP9Parameters(Consensus::DeploymentPos d, int64_t nStartTime, int64_t nTimeout) diff --git a/src/chainparams.h b/src/chainparams.h index 734deffdd2..260d247510 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -88,10 +88,11 @@ public: const CScript& CoinbaseDestination() const { return scriptCoinbaseDestination; } /** * Creates and returns a CChainParams* of the chosen chain. The caller has to delete the object. + * @param mapArgs A map with the runtime configuration. * @returns a CChainParams* of the chosen chain. * @throws a std::runtime_error if the chain is not supported. */ - static CChainParams* Factory(const std::string& chain); + static CChainParams* Factory(const std::string& chain, const std::map& mapArgs); protected: CChainParams() {} @@ -124,7 +125,7 @@ const CChainParams &Params(); * Sets the params returned by Params() to those for the given BIP70 chain name. * @throws std::runtime_error when the chain is not supported. */ -void SelectParams(const std::string& chain); +void SelectParams(const std::string& network, const std::map& mapArgs); /** * Allows modifying the BIP9 regtest parameters. diff --git a/src/init.cpp b/src/init.cpp index 4f9f35be2c..736cd91c42 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -298,7 +298,8 @@ void OnRPCPreCommand(const CRPCCommand& cmd) std::string HelpMessage(HelpMessageMode mode) { - const boost::scoped_ptr defaultChainParams(CChainParams::Factory(CBaseChainParams::MAIN)); + std::map mapArgs; + const boost::scoped_ptr defaultChainParams(CChainParams::Factory(CBaseChainParams::MAIN, mapArgs)); const boost::scoped_ptr defaultBaseParams(CBaseChainParams::Factory(CBaseChainParams::MAIN)); const bool showDebug = GetBoolArg("-help-debug", false); diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 2c4f9ee26a..619a7b4094 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -605,7 +605,7 @@ int main(int argc, char *argv[]) // Check for -chain, -testnet or -regtest parameter (Params() calls are only valid after this clause) try { - SelectParams(ChainNameFromCommandLine()); + SelectParams(ChainNameFromCommandLine(), mapArgs); } catch(std::exception &e) { QMessageBox::critical(0, QObject::tr(PACKAGE_NAME), QObject::tr("Error: %1").arg(e.what())); return 1; diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp index e339dc8e0a..5b645e9603 100644 --- a/src/qt/paymentserver.cpp +++ b/src/qt/paymentserver.cpp @@ -223,9 +223,9 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[]) CBitcoinAddress address(r.address.toStdString()); std::map::const_iterator iter; for (iter = CChainParams::supportedChains.begin(); iter != CChainParams::supportedChains.end(); ++iter) { - boost::scoped_ptr tempChainParams(CChainParams::Factory(iter->first)); + boost::scoped_ptr tempChainParams(CChainParams::Factory(iter->first, mapArgs)); if (address.IsValid(*tempChainParams)) { - SelectParams(iter->first); + SelectParams(iter->first, mapArgs); break; } } @@ -237,7 +237,7 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[]) PaymentRequestPlus request; if (readPaymentRequestFromFile(arg, request)) - SelectParams(request.getDetails().network()); + SelectParams(request.getDetails().network(), mapArgs); } else { diff --git a/src/qt/test/paymentservertests.cpp b/src/qt/test/paymentservertests.cpp index 58ff6da0bc..ee89af8bb6 100644 --- a/src/qt/test/paymentservertests.cpp +++ b/src/qt/test/paymentservertests.cpp @@ -64,7 +64,7 @@ static SendCoinsRecipient handleRequest(PaymentServer* server, std::vector mapArgs; std::map::const_iterator iter; for (iter = CChainParams::supportedChains.begin(); iter != CChainParams::supportedChains.end(); ++iter) { - const boost::scoped_ptr testChainParams(CChainParams::Factory(iter->first)); + const boost::scoped_ptr testChainParams(CChainParams::Factory(iter->first, mapArgs)); const CChainParams& chainparams = *testChainParams; std::string hashStr = chainparams.GenesisBlock().GetHash().GetHex(); BOOST_CHECK_EQUAL(hashStr, iter->second.GetHex()); diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index 19dd9b6611..1760f00928 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -124,7 +124,8 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse) std::vector result; CBitcoinSecret secret; CBitcoinAddress addr; - SelectParams(CBaseChainParams::MAIN); + std::map mapArgs; + SelectParams(CBaseChainParams::MAIN, mapArgs); for (unsigned int idx = 0; idx < tests.size(); idx++) { UniValue test = tests[idx]; @@ -140,9 +141,9 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse) bool isPrivkey = find_value(metadata, "isPrivkey").get_bool(); bool isTestnet = find_value(metadata, "isTestnet").get_bool(); if (isTestnet) - SelectParams(CBaseChainParams::REGTEST); + SelectParams(CBaseChainParams::REGTEST, mapArgs); else - SelectParams(CBaseChainParams::MAIN); + SelectParams(CBaseChainParams::MAIN, mapArgs); if(isPrivkey) { bool isCompressed = find_value(metadata, "isCompressed").get_bool(); @@ -180,6 +181,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) { UniValue tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid))); std::vector result; + std::map mapArgs; for (unsigned int idx = 0; idx < tests.size(); idx++) { UniValue test = tests[idx]; @@ -195,9 +197,9 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) bool isPrivkey = find_value(metadata, "isPrivkey").get_bool(); bool isTestnet = find_value(metadata, "isTestnet").get_bool(); if (isTestnet) - SelectParams(CBaseChainParams::REGTEST); + SelectParams(CBaseChainParams::REGTEST, mapArgs); else - SelectParams(CBaseChainParams::MAIN); + SelectParams(CBaseChainParams::MAIN, mapArgs); if(isPrivkey) { bool isCompressed = find_value(metadata, "isCompressed").get_bool(); @@ -240,7 +242,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) CTxDestination nodest = CNoDestination(); BOOST_CHECK(!dummyAddr.Set(nodest)); - SelectParams(CBaseChainParams::MAIN); + SelectParams(CBaseChainParams::MAIN, mapArgs); } // Goal: check that base58 parsing code is robust against a variety of corrupted data diff --git a/src/test/main_tests.cpp b/src/test/main_tests.cpp index 3a34bb200c..7ef54e151e 100644 --- a/src/test/main_tests.cpp +++ b/src/test/main_tests.cpp @@ -46,7 +46,8 @@ BOOST_AUTO_TEST_CASE(block_subsidy_test) BOOST_AUTO_TEST_CASE(subsidy_limit_test) { - const boost::scoped_ptr testChainParams(CChainParams::Factory(CBaseChainParams::MAIN)); + std::map mapArgs; + const boost::scoped_ptr testChainParams(CChainParams::Factory(CBaseChainParams::MAIN, mapArgs)); CAmount nSum = GetBlockSubsidy(0, testChainParams->GetConsensus()); BOOST_CHECK_EQUAL(nSum, 2100000000000000ULL); for (int nHeight = 1; nHeight < 14000000; nHeight += 1000) { diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp index 0e5f781197..d3663614c8 100644 --- a/src/test/test_bitcoin.cpp +++ b/src/test/test_bitcoin.cpp @@ -37,7 +37,7 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName) SetupNetworking(); fPrintToDebugLog = false; // don't want to write to debug.log file fCheckBlockIndex = true; - SelectParams(chainName); + SelectParams(chainName, mapArgs); noui_connect(); } diff --git a/src/test/versionbits_tests.cpp b/src/test/versionbits_tests.cpp index bba6341030..15b3d0229d 100644 --- a/src/test/versionbits_tests.cpp +++ b/src/test/versionbits_tests.cpp @@ -187,7 +187,8 @@ BOOST_AUTO_TEST_CASE(versionbits_test) } // Sanity checks of version bit deployments - const Consensus::Params &mainnetParams = CChainParams::Factory(CBaseChainParams::MAIN)->GetConsensus();//Params(CBaseChainParams::MAIN).GetConsensus(); + std::map mapArgs; + const Consensus::Params &mainnetParams = CChainParams::Factory(CBaseChainParams::MAIN, mapArgs)->GetConsensus();//Params(CBaseChainParams::MAIN).GetConsensus(); for (int i=0; i<(int) Consensus::MAX_VERSION_BITS_DEPLOYMENTS; i++) { uint32_t bitmask = VersionBitsMask(mainnetParams, (Consensus::DeploymentPos)i); // Make sure that no deployment tries to set an invalid bit. @@ -213,7 +214,8 @@ BOOST_AUTO_TEST_CASE(versionbits_computeblockversion) { // Check that ComputeBlockVersion will set the appropriate bit correctly // on mainnet. - const Consensus::Params &mainnetParams = CChainParams::Factory(CBaseChainParams::MAIN)->GetConsensus();//Params(CBaseChainParams::MAIN).GetConsensus(); + std::map mapArgs; + const Consensus::Params &mainnetParams = CChainParams::Factory(CBaseChainParams::MAIN, mapArgs)->GetConsensus();//Params(CBaseChainParams::MAIN).GetConsensus(); // Use the TESTDUMMY deployment for testing purposes. int64_t bit = mainnetParams.vDeployments[Consensus::DEPLOYMENT_TESTDUMMY].bit;