Skip to content

Discuss: unify bip70 chain names, user-facing chain strings and default dir names #6229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ BITCOIN_CORE_H = \
support/pagelocker.h \
sync.h \
threadsafety.h \
templates.hpp \
timedata.h \
tinyformat.h \
txdb.h \
Expand Down
57 changes: 30 additions & 27 deletions src/chainparams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

#include "chainparams.h"

#include "templates.hpp"
#include "tinyformat.h"
#include "util.h"
#include "utilstrencodings.h"

Expand All @@ -30,7 +32,7 @@ using namespace std;
class CMainParams : public CChainParams {
public:
CMainParams() {
strNetworkID = "main";
strNetworkID = CBaseChainParams::MAIN;
consensus.nSubsidyHalvingInterval = 210000;
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
Expand Down Expand Up @@ -128,15 +130,14 @@ class CMainParams : public CChainParams {
};
}
};
static CMainParams mainParams;

/**
* Testnet (v3)
*/
class CTestNetParams : public CMainParams {
public:
CTestNetParams() {
strNetworkID = "test";
strNetworkID = CBaseChainParams::TESTNET;
consensus.nMajorityEnforceBlockUpgrade = 51;
consensus.nMajorityRejectBlockOutdated = 75;
consensus.nMajorityWindow = 100;
Expand Down Expand Up @@ -188,15 +189,14 @@ class CTestNetParams : public CMainParams {

}
};
static CTestNetParams testNetParams;

/**
* Regression test
*/
class CRegTestParams : public CTestNetParams {
public:
CRegTestParams() {
strNetworkID = "regtest";
strNetworkID = CBaseChainParams::REGTEST;
consensus.nSubsidyHalvingInterval = 150;
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
Expand Down Expand Up @@ -234,40 +234,43 @@ class CRegTestParams : public CTestNetParams {
};
}
};
static CRegTestParams regTestParams;

static CChainParams *pCurrentParams = 0;
static Container<CChainParams> currentParams;
static Container<CChainParams> switchingParams;

const CChainParams &Params() {
assert(pCurrentParams);
return *pCurrentParams;
return currentParams.Get();
}

CChainParams &Params(CBaseChainParams::Network network) {
switch (network) {
case CBaseChainParams::MAIN:
return mainParams;
case CBaseChainParams::TESTNET:
return testNetParams;
case CBaseChainParams::REGTEST:
return regTestParams;
default:
assert(false && "Unimplemented network");
return mainParams;
}
CChainParams* ParamsFactory(std::string chain)
{
if (chain == CBaseChainParams::MAIN)
return new CMainParams();
else if (chain == CBaseChainParams::TESTNET)
return new CTestNetParams();
else if (chain == CBaseChainParams::REGTEST)
return new CRegTestParams();
throw std::runtime_error(strprintf(_("%s: Unknown chain %s."), __func__, chain));
}

const CChainParams& Params(std::string chain)
{
switchingParams.Set(ParamsFactory(chain));
return switchingParams.Get();
}

void SelectParams(CBaseChainParams::Network network) {
SelectBaseParams(network);
pCurrentParams = &Params(network);
void SelectParams(std::string chain)
{
SelectBaseParams(chain);
currentParams.Set(ParamsFactory(chain));
}

bool SelectParamsFromCommandLine()
{
CBaseChainParams::Network network = NetworkIdFromCommandLine();
if (network == CBaseChainParams::MAX_NETWORK_TYPES)
std::string chain = ChainNameFromCommandLine();
if (chain == CBaseChainParams::MAX_NETWORK_TYPES)
return false;

SelectParams(network);
SelectParams(chain);
return true;
}
22 changes: 17 additions & 5 deletions src/chainparams.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class CChainParams
bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
/** In the future use NetworkIDString() for RPC fields */
bool TestnetToBeDeprecatedFieldRPC() const { return fTestnetToBeDeprecatedFieldRPC; }
/** Return the BIP70 network string (main, test or regtest) */
/** Returns the BIP70 chain name string (main, testnet3 or regtest) */
std::string NetworkIDString() const { return strNetworkID; }
const std::vector<CDNSSeedData>& DNSSeeds() const { return vSeeds; }
const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }
Expand Down Expand Up @@ -95,17 +95,29 @@ class CChainParams
Checkpoints::CCheckpointData checkpointData;
};

/**
* Creates a CChainParams of the chosen chain and returns a
* pointer to it. The caller has to delete the object.
* Raises a std::runtime_error if the chain is not supported.
*/
CChainParams* ParamsFactory(std::string chain);

/** Functions that relay on internal state */
/**
* Return the currently selected parameters. This won't change after app
* startup, except for unit tests.
*/
const CChainParams &Params();

/** Return parameters for the given network. */
CChainParams &Params(CBaseChainParams::Network network);
/**
* Returns parameters for the given BIP70 chain name.
*/
const CChainParams& Params(std::string chain);

/** Sets the params returned by Params() to those for the given network. */
void SelectParams(CBaseChainParams::Network network);
/**
* Sets the params returned by Params() to those for the given BIP70 chain name.
*/
void SelectParams(std::string chain);

/**
* Looks for -regtest or -testnet and then calls SelectParams as appropriate.
Expand Down
57 changes: 28 additions & 29 deletions src/chainparamsbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@

#include "chainparamsbase.h"

#include "templates.hpp"
#include "tinyformat.h"
#include "util.h"

#include <assert.h>
const std::string CBaseChainParams::MAIN = "main";
const std::string CBaseChainParams::TESTNET = "testnet3";
const std::string CBaseChainParams::REGTEST = "regtest";
const std::string CBaseChainParams::MAX_NETWORK_TYPES = "unknown_chain";

/**
* Main network
Expand All @@ -20,7 +25,6 @@ class CBaseMainParams : public CBaseChainParams
nRPCPort = 8332;
}
};
static CBaseMainParams mainParams;

/**
* Testnet (v3)
Expand All @@ -31,10 +35,9 @@ class CBaseTestNetParams : public CBaseMainParams
CBaseTestNetParams()
{
nRPCPort = 18332;
strDataDir = "testnet3";
strDataDir = CBaseChainParams::TESTNET;
}
};
static CBaseTestNetParams testNetParams;

/*
* Regression test
Expand All @@ -44,10 +47,9 @@ class CBaseRegTestParams : public CBaseTestNetParams
public:
CBaseRegTestParams()
{
strDataDir = "regtest";
strDataDir = CBaseChainParams::REGTEST;
}
};
static CBaseRegTestParams regTestParams;

/*
* Unit test
Expand All @@ -62,33 +64,30 @@ class CBaseUnitTestParams : public CBaseMainParams
};
static CBaseUnitTestParams unitTestParams;

static CBaseChainParams* pCurrentBaseParams = 0;
static Container<CBaseChainParams> currentBaseParams;

const CBaseChainParams& BaseParams()
{
assert(pCurrentBaseParams);
return *pCurrentBaseParams;
return currentBaseParams.Get();
}

void SelectBaseParams(CBaseChainParams::Network network)
CBaseChainParams* FactoryBaseParams(std::string chain)
{
switch (network) {
case CBaseChainParams::MAIN:
pCurrentBaseParams = &mainParams;
break;
case CBaseChainParams::TESTNET:
pCurrentBaseParams = &testNetParams;
break;
case CBaseChainParams::REGTEST:
pCurrentBaseParams = &regTestParams;
break;
default:
assert(false && "Unimplemented network");
return;
}
if (chain == CBaseChainParams::MAIN)
return new CBaseMainParams();
else if (chain == CBaseChainParams::TESTNET)
return new CBaseTestNetParams();
else if (chain == CBaseChainParams::REGTEST)
return new CBaseRegTestParams();
throw std::runtime_error(strprintf(_("%s: Unknown chain %s."), __func__, chain));
}

void SelectBaseParams(std::string chain)
{
currentBaseParams.Set(FactoryBaseParams(chain));
}

CBaseChainParams::Network NetworkIdFromCommandLine()
std::string ChainNameFromCommandLine()
{
bool fRegTest = GetBoolArg("-regtest", false);
bool fTestNet = GetBoolArg("-testnet", false);
Expand All @@ -104,15 +103,15 @@ CBaseChainParams::Network NetworkIdFromCommandLine()

bool SelectBaseParamsFromCommandLine()
{
CBaseChainParams::Network network = NetworkIdFromCommandLine();
if (network == CBaseChainParams::MAX_NETWORK_TYPES)
std::string chain = ChainNameFromCommandLine();
if (chain == CBaseChainParams::MAX_NETWORK_TYPES)
return false;

SelectBaseParams(network);
SelectBaseParams(chain);
return true;
}

bool AreBaseParamsConfigured()
{
return pCurrentBaseParams != NULL;
return !currentBaseParams.IsNull();
}
38 changes: 23 additions & 15 deletions src/chainparamsbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,11 @@
class CBaseChainParams
{
public:
enum Network {
MAIN,
TESTNET,
REGTEST,

MAX_NETWORK_TYPES
};
/** BIP70 chain name strings (main, test or regtest) */
static const std::string MAIN;
static const std::string TESTNET;
static const std::string REGTEST;
static const std::string MAX_NETWORK_TYPES;

const std::string& DataDir() const { return strDataDir; }
int RPCPort() const { return nRPCPort; }
Expand All @@ -33,20 +31,31 @@ class CBaseChainParams
std::string strDataDir;
};

/**
* Creates a CBaseChainParams of the chosen chain and returns a
* pointer to it. The caller has to delete the object.
* Raises an error if the chain is not supported.
*/
CBaseChainParams* FactoryBaseParams(std::string chain);
/**
* Looks for -regtest, -testnet and returns the appropriate BIP70 chain name.
* Returns CBaseChainParams::MAIN by default.
* Returns CBaseChainParams::MAX_NETWORK_TYPES if an invalid combination is given.
*/
std::string ChainNameFromCommandLine();

/** Functions that relay on internal state */
/**
* Return the currently selected parameters. This won't change after app
* startup, except for unit tests.
*/
const CBaseChainParams& BaseParams();

/** Sets the params returned by Params() to those for the given network. */
void SelectBaseParams(CBaseChainParams::Network network);

/**
* Looks for -regtest or -testnet and returns the appropriate Network ID.
* Returns MAX_NETWORK_TYPES if an invalid combination is given.
* Sets the params returned by BaseParams() to those for the appropriate chain returned by ChainNameFromCommandLine().
* Raises a std::runtime_error if an unsupported chain name is given.
*/
CBaseChainParams::Network NetworkIdFromCommandLine();
void SelectBaseParams(std::string chain);

/**
* Calls NetworkIdFromCommandLine() and then calls SelectParams as appropriate.
Expand All @@ -55,8 +64,7 @@ CBaseChainParams::Network NetworkIdFromCommandLine();
bool SelectBaseParamsFromCommandLine();

/**
* Return true if SelectBaseParamsFromCommandLine() has been called to select
* a network.
* Return true if SelectBaseParamsFromCommandLine() has been called to select a chain.
*/
bool AreBaseParamsConfigured();

Expand Down
19 changes: 8 additions & 11 deletions src/qt/guiutil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -581,12 +581,10 @@ TableViewLastColumnResizingFixer::TableViewLastColumnResizingFixer(QTableView* t
#ifdef WIN32
boost::filesystem::path static StartupShortcutPath()
{
if (GetBoolArg("-testnet", false))
return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin (testnet).lnk";
else if (GetBoolArg("-regtest", false))
return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin (regtest).lnk";

return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin.lnk";
std::string chain = ChainNameFromCommandLine();
if (chain == CBaseChainParams::MAIN)
return GetSpecialFolderPath(CSIDL_STARTUP) / "Bitcoin.lnk";
return GetSpecialFolderPath(CSIDL_STARTUP) / strprintf("Bitcoin (%s).lnk", chain);
}

bool GetStartOnSystemStartup()
Expand Down Expand Up @@ -719,15 +717,14 @@ bool SetStartOnSystemStartup(bool fAutoStart)
boost::filesystem::ofstream optionFile(GetAutostartFilePath(), std::ios_base::out|std::ios_base::trunc);
if (!optionFile.good())
return false;
std::string chain = ChainNameFromCommandLine();
// Write a bitcoin.desktop file to the autostart directory:
optionFile << "[Desktop Entry]\n";
optionFile << "Type=Application\n";
if (GetBoolArg("-testnet", false))
optionFile << "Name=Bitcoin (testnet)\n";
else if (GetBoolArg("-regtest", false))
optionFile << "Name=Bitcoin (regtest)\n";
else
if (chain == CBaseChainParams::MAIN)
optionFile << "Name=Bitcoin\n";
else
optionFile << strprintf("Name=Bitcoin (%s)\n", chain);
optionFile << "Exec=" << pszExePath << strprintf(" -min -testnet=%d -regtest=%d\n", GetBoolArg("-testnet", false), GetBoolArg("-regtest", false));
optionFile << "Terminal=false\n";
optionFile << "Hidden=false\n";
Expand Down
2 changes: 1 addition & 1 deletion src/qt/networkstyle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ static const struct {
const char *titleAddText;
} network_styles[] = {
{"main", QAPP_APP_NAME_DEFAULT, 0, 0, ""},
{"test", QAPP_APP_NAME_TESTNET, 70, 30, QT_TRANSLATE_NOOP("SplashScreen", "[testnet]")},
{"testnet3", QAPP_APP_NAME_TESTNET, 70, 30, QT_TRANSLATE_NOOP("SplashScreen", "[testnet3]")},
{"regtest", QAPP_APP_NAME_TESTNET, 160, 30, "[regtest]"}
};
static const unsigned network_styles_count = sizeof(network_styles)/sizeof(*network_styles);
Expand Down
Loading