mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
merge bitcoin#21732: Move common init code to init/common
This commit is contained in:
parent
3944d4ed96
commit
72eeb9a0d6
@ -216,6 +216,7 @@ BITCOIN_CORE_H = \
|
|||||||
index/txindex.h \
|
index/txindex.h \
|
||||||
indirectmap.h \
|
indirectmap.h \
|
||||||
init.h \
|
init.h \
|
||||||
|
init/common.h \
|
||||||
interfaces/chain.h \
|
interfaces/chain.h \
|
||||||
interfaces/coinjoin.h \
|
interfaces/coinjoin.h \
|
||||||
interfaces/handler.h \
|
interfaces/handler.h \
|
||||||
@ -731,6 +732,7 @@ libbitcoin_common_a_SOURCES = \
|
|||||||
core_write.cpp \
|
core_write.cpp \
|
||||||
deploymentinfo.cpp \
|
deploymentinfo.cpp \
|
||||||
governance/common.cpp \
|
governance/common.cpp \
|
||||||
|
init/common.cpp \
|
||||||
key.cpp \
|
key.cpp \
|
||||||
key_io.cpp \
|
key_io.cpp \
|
||||||
merkleblock.cpp \
|
merkleblock.cpp \
|
||||||
|
131
src/init.cpp
131
src/init.cpp
@ -24,12 +24,12 @@
|
|||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include <httpserver.h>
|
#include <httpserver.h>
|
||||||
#include <httprpc.h>
|
#include <httprpc.h>
|
||||||
|
#include <init/common.h>
|
||||||
#include <interfaces/chain.h>
|
#include <interfaces/chain.h>
|
||||||
#include <index/blockfilterindex.h>
|
#include <index/blockfilterindex.h>
|
||||||
#include <index/coinstatsindex.h>
|
#include <index/coinstatsindex.h>
|
||||||
#include <index/txindex.h>
|
#include <index/txindex.h>
|
||||||
#include <interfaces/node.h>
|
#include <interfaces/node.h>
|
||||||
#include <key.h>
|
|
||||||
#include <mapport.h>
|
#include <mapport.h>
|
||||||
#include <miner.h>
|
#include <miner.h>
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
@ -398,7 +398,7 @@ void Shutdown(NodeContext& node)
|
|||||||
PrepareShutdown(node);
|
PrepareShutdown(node);
|
||||||
}
|
}
|
||||||
// Shutdown part 2: delete wallet instance
|
// Shutdown part 2: delete wallet instance
|
||||||
ECC_Stop();
|
init::UnsetGlobals();
|
||||||
node.mempool.reset();
|
node.mempool.reset();
|
||||||
node.fee_estimator.reset();
|
node.fee_estimator.reset();
|
||||||
node.chainman.reset();
|
node.chainman.reset();
|
||||||
@ -489,6 +489,8 @@ void SetupServerArgs(NodeContext& node)
|
|||||||
SetupHelpOptions(argsman);
|
SetupHelpOptions(argsman);
|
||||||
argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
|
||||||
|
init::AddLoggingArgs(argsman);
|
||||||
|
|
||||||
const auto defaultBaseParams = CreateBaseChainParams(CBaseChainParams::MAIN);
|
const auto defaultBaseParams = CreateBaseChainParams(CBaseChainParams::MAIN);
|
||||||
const auto testnetBaseParams = CreateBaseChainParams(CBaseChainParams::TESTNET);
|
const auto testnetBaseParams = CreateBaseChainParams(CBaseChainParams::TESTNET);
|
||||||
const auto regtestBaseParams = CreateBaseChainParams(CBaseChainParams::REGTEST);
|
const auto regtestBaseParams = CreateBaseChainParams(CBaseChainParams::REGTEST);
|
||||||
@ -523,7 +525,6 @@ void SetupServerArgs(NodeContext& node)
|
|||||||
argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (%d to %d, default: %d). In addition, unused mempool memory is shared for this cache (see -maxmempool).", nMinDbCache, nMaxDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-dbcache=<n>", strprintf("Maximum database cache size <n> MiB (%d to %d, default: %d). In addition, unused mempool memory is shared for this cache (see -maxmempool).", nMinDbCache, nMaxDbCache, nDefaultDbCache), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file. Relative paths will be prefixed by a net-specific datadir location. (-nodebuglogfile to disable; default: %s)", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
|
||||||
argsman.AddArg("-includeconf=<file>", "Specify additional configuration file, relative to the -datadir path (only useable from configuration file, not command line)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-includeconf=<file>", "Specify additional configuration file, relative to the -datadir path (only useable from configuration file, not command line)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-maxmempool=<n>", strprintf("Keep the transaction memory pool below <n> megabytes (default: %u)", DEFAULT_MAX_MEMPOOL_SIZE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-maxmempool=<n>", strprintf("Keep the transaction memory pool below <n> megabytes (default: %u)", DEFAULT_MAX_MEMPOOL_SIZE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
@ -714,27 +715,13 @@ void SetupServerArgs(NodeContext& node)
|
|||||||
argsman.AddArg("-watchquorums=<n>", strprintf("Watch and validate quorum communication (default: %u)", llmq::DEFAULT_WATCH_QUORUMS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-watchquorums=<n>", strprintf("Watch and validate quorum communication (default: %u)", llmq::DEFAULT_WATCH_QUORUMS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-addrmantest", "Allows to test address relay on localhost", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-addrmantest", "Allows to test address relay on localhost", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_BOOL | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_BOOL | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-debug=<category>", "Output debugging information (default: -nodebug, supplying <category> is optional). "
|
|
||||||
"If <category> is not supplied or if <category> = 1, output all debugging information. <category> can be: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-debugexclude=<category>", strprintf("Exclude debugging information for a category. Can be used in conjunction with -debug=1 to output debug logs for all categories except the specified category. This option can be specified multiple times to exclude multiple categories."), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-disablegovernance", strprintf("Disable governance validation (0-1, default: %u)", 0), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-disablegovernance", strprintf("Disable governance validation (0-1, default: %u)", 0), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
#ifdef HAVE_THREAD_LOCAL
|
|
||||||
argsman.AddArg("-logthreadnames", strprintf("Prepend debug output with name of the originating thread (only available on platforms supporting thread_local) (default: %u)", DEFAULT_LOGTHREADNAMES), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
|
||||||
#else
|
|
||||||
hidden_args.emplace_back("-logthreadnames");
|
|
||||||
#endif
|
|
||||||
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-maxtipage=<n>", strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)", DEFAULT_MAX_TIP_AGE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-maxtipage=<n>", strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)", DEFAULT_MAX_TIP_AGE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + "(default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + "(default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-minsporkkeys=<n>", "Overrides minimum spork signers to change spork value. Only useful for regtest and devnet. Using this on mainnet or testnet will ban you.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-minsporkkeys=<n>", "Overrides minimum spork signers to change spork value. Only useful for regtest and devnet. Using this on mainnet or testnet will ban you.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-printpriority", strprintf("Log transaction fee per kB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-printpriority", strprintf("Log transaction fee per kB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-pushversion", "Protocol version to report to other nodes", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-pushversion", "Protocol version to report to other nodes", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
|
||||||
argsman.AddArg("-sporkaddr=<dashaddress>", "Override spork address. Only useful for regtest and devnet. Using this on mainnet or testnet will ban you.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-sporkaddr=<dashaddress>", "Override spork address. Only useful for regtest and devnet. Using this on mainnet or testnet will ban you.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-sporkkey=<privatekey>", "Set the private key to be used for signing spork messages.", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-sporkkey=<privatekey>", "Set the private key to be used for signing spork messages.", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
@ -893,31 +880,6 @@ static void PeriodicStats(ArgsManager& args, ChainstateManager& chainman, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sanity checks
|
|
||||||
* Ensure that Dash Core is running in a usable environment with all
|
|
||||||
* necessary library support.
|
|
||||||
*/
|
|
||||||
static bool InitSanityCheck()
|
|
||||||
{
|
|
||||||
if (!ECC_InitSanityCheck()) {
|
|
||||||
return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting."));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!BLSInit()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Random_SanityCheck()) {
|
|
||||||
return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting."));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ChronoSanityCheck()) {
|
|
||||||
return InitError(Untranslated("Clock epoch mismatch. Aborting."));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool AppInitServers(NodeContext& node)
|
static bool AppInitServers(NodeContext& node)
|
||||||
{
|
{
|
||||||
const ArgsManager& args = *Assert(node.args);
|
const ArgsManager& args = *Assert(node.args);
|
||||||
@ -1040,25 +1002,8 @@ void InitParameterInteraction(ArgsManager& args)
|
|||||||
*/
|
*/
|
||||||
void InitLogging(const ArgsManager& args)
|
void InitLogging(const ArgsManager& args)
|
||||||
{
|
{
|
||||||
LogInstance().m_print_to_file = !args.IsArgNegated("-debuglogfile");
|
init::SetLoggingOptions(args);
|
||||||
LogInstance().m_file_path = AbsPathForConfigVal(args.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE));
|
init::LogPackageVersion();
|
||||||
LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", !args.GetBoolArg("-daemon", false));
|
|
||||||
LogInstance().m_log_timestamps = args.GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS);
|
|
||||||
LogInstance().m_log_time_micros = args.GetBoolArg("-logtimemicros", DEFAULT_LOGTIMEMICROS);
|
|
||||||
#ifdef HAVE_THREAD_LOCAL
|
|
||||||
LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES);
|
|
||||||
#endif
|
|
||||||
LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS);
|
|
||||||
|
|
||||||
fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS);
|
|
||||||
|
|
||||||
std::string version_string = FormatFullVersion();
|
|
||||||
#ifdef DEBUG_CORE
|
|
||||||
version_string += " (debug build)";
|
|
||||||
#else
|
|
||||||
version_string += " (release build)";
|
|
||||||
#endif
|
|
||||||
LogPrintf(PACKAGE_NAME " version %s\n", version_string);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace { // Variables internal to initialization process only
|
namespace { // Variables internal to initialization process only
|
||||||
@ -1248,26 +1193,7 @@ bool AppInitParameterInteraction(const ArgsManager& args)
|
|||||||
InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
|
InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
|
||||||
|
|
||||||
// ********************************************************* Step 3: parameter-to-internal-flags
|
// ********************************************************* Step 3: parameter-to-internal-flags
|
||||||
if (args.IsArgSet("-debug")) {
|
init::SetLoggingCategories(args);
|
||||||
// Special-case: if -debug=0/-nodebug is set, turn off debugging messages
|
|
||||||
const std::vector<std::string> categories = args.GetArgs("-debug");
|
|
||||||
|
|
||||||
if (std::none_of(categories.begin(), categories.end(),
|
|
||||||
[](std::string cat){return cat == "0" || cat == "none";})) {
|
|
||||||
for (const auto& cat : categories) {
|
|
||||||
if (!LogInstance().EnableCategory(cat)) {
|
|
||||||
InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debug", cat));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now remove the logging categories which were explicitly excluded
|
|
||||||
for (const std::string& cat : args.GetArgs("-debugexclude")) {
|
|
||||||
if (!LogInstance().DisableCategory(cat)) {
|
|
||||||
InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debugexclude", cat));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fCheckBlockIndex = args.GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
|
fCheckBlockIndex = args.GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
|
||||||
fCheckpointsEnabled = args.GetBoolArg("-checkpoints", DEFAULT_CHECKPOINTS_ENABLED);
|
fCheckpointsEnabled = args.GetBoolArg("-checkpoints", DEFAULT_CHECKPOINTS_ENABLED);
|
||||||
@ -1455,15 +1381,11 @@ bool AppInitSanityChecks()
|
|||||||
{
|
{
|
||||||
// ********************************************************* Step 4: sanity checks
|
// ********************************************************* Step 4: sanity checks
|
||||||
|
|
||||||
// Initialize elliptic curve code
|
init::SetGlobals();
|
||||||
std::string sha256_algo = SHA256AutoDetect();
|
|
||||||
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
|
||||||
RandomInit();
|
|
||||||
ECC_Start();
|
|
||||||
|
|
||||||
// Sanity check
|
if (!init::SanityChecks()) {
|
||||||
if (!InitSanityCheck())
|
|
||||||
return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
|
return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
|
||||||
|
}
|
||||||
|
|
||||||
// Probe the data directory lock to give an early error message, if possible
|
// Probe the data directory lock to give an early error message, if possible
|
||||||
// We cannot hold the data directory lock here, as the forking for daemon() hasn't yet happened,
|
// We cannot hold the data directory lock here, as the forking for daemon() hasn't yet happened,
|
||||||
@ -1503,37 +1425,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
|||||||
// Detailed error printed inside CreatePidFile().
|
// Detailed error printed inside CreatePidFile().
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (LogInstance().m_print_to_file) {
|
if (!init::StartLogging(args)) {
|
||||||
if (args.GetBoolArg("-shrinkdebugfile", LogInstance().DefaultShrinkDebugFile())) {
|
// Detailed error printed inside StartLogging().
|
||||||
// Do this first since it both loads a bunch of debug.log into memory,
|
return false;
|
||||||
// and because this needs to happen before any other debug.log printing
|
|
||||||
LogInstance().ShrinkDebugFile();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!LogInstance().StartLogging()) {
|
|
||||||
return InitError(strprintf(Untranslated("Could not open debug log file %s"),
|
|
||||||
LogInstance().m_file_path.string()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!LogInstance().m_log_timestamps)
|
|
||||||
LogPrintf("Startup time: %s\n", FormatISO8601DateTime(GetTime()));
|
|
||||||
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string());
|
|
||||||
LogPrintf("Using data directory %s\n", GetDataDir().string());
|
|
||||||
|
|
||||||
// Only log conf file usage message if conf file actually exists.
|
|
||||||
fs::path config_file_path = GetConfigFile(args.GetArg("-conf", BITCOIN_CONF_FILENAME));
|
|
||||||
if (fs::exists(config_file_path)) {
|
|
||||||
LogPrintf("Config file: %s\n", config_file_path.string());
|
|
||||||
} else if (args.IsArgSet("-conf")) {
|
|
||||||
// Warn if no conf file exists at path provided by user
|
|
||||||
InitWarning(strprintf(_("The specified config file %s does not exist"), config_file_path.string()));
|
|
||||||
} else {
|
|
||||||
// Not categorizing as "Warning" because it's the default behavior
|
|
||||||
LogPrintf("Config file: %s (not found, skipping)\n", config_file_path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log the config arguments to debug.log
|
|
||||||
args.LogArgs();
|
|
||||||
|
|
||||||
LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
||||||
|
|
||||||
|
164
src/init/common.cpp
Normal file
164
src/init/common.cpp
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
// Copyright (c) 2021 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#if defined(HAVE_CONFIG_H)
|
||||||
|
#include <config/bitcoin-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <bls/bls.h>
|
||||||
|
#include <clientversion.h>
|
||||||
|
#include <crypto/sha256.h>
|
||||||
|
#include <key.h>
|
||||||
|
#include <logging.h>
|
||||||
|
#include <node/ui_interface.h>
|
||||||
|
#include <pubkey.h>
|
||||||
|
#include <random.h>
|
||||||
|
#include <util/system.h>
|
||||||
|
#include <util/time.h>
|
||||||
|
#include <util/translation.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace init {
|
||||||
|
void SetGlobals()
|
||||||
|
{
|
||||||
|
std::string sha256_algo = SHA256AutoDetect();
|
||||||
|
LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo);
|
||||||
|
RandomInit();
|
||||||
|
ECC_Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnsetGlobals()
|
||||||
|
{
|
||||||
|
ECC_Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SanityChecks()
|
||||||
|
{
|
||||||
|
if (!ECC_InitSanityCheck()) {
|
||||||
|
return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting."));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!BLSInit()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Random_SanityCheck()) {
|
||||||
|
return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting."));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ChronoSanityCheck()) {
|
||||||
|
return InitError(Untranslated("Clock epoch mismatch. Aborting."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddLoggingArgs(ArgsManager& argsman)
|
||||||
|
{
|
||||||
|
argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file. Relative paths will be prefixed by a net-specific datadir location. (-nodebuglogfile to disable; default: %s)", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
|
argsman.AddArg("-debug=<category>", "Output debugging information (default: -nodebug, supplying <category> is optional). "
|
||||||
|
"If <category> is not supplied or if <category> = 1, output all debugging information. <category> can be: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.",
|
||||||
|
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-debugexclude=<category>", strprintf("Exclude debugging information for a category. Can be used in conjunction with -debug=1 to output debug logs for all categories except the specified category. This option can be specified multiple times to exclude multiple categories."), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
#ifdef HAVE_THREAD_LOCAL
|
||||||
|
argsman.AddArg("-logthreadnames", strprintf("Prepend debug output with name of the originating thread (only available on platforms supporting thread_local) (default: %u)", DEFAULT_LOGTHREADNAMES), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
|
#else
|
||||||
|
argsman.AddHiddenArgs({"-logthreadnames"});
|
||||||
|
#endif
|
||||||
|
argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLoggingOptions(const ArgsManager& args)
|
||||||
|
{
|
||||||
|
LogInstance().m_print_to_file = !args.IsArgNegated("-debuglogfile");
|
||||||
|
LogInstance().m_file_path = AbsPathForConfigVal(args.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE));
|
||||||
|
LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", !args.GetBoolArg("-daemon", false));
|
||||||
|
LogInstance().m_log_timestamps = args.GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS);
|
||||||
|
LogInstance().m_log_time_micros = args.GetBoolArg("-logtimemicros", DEFAULT_LOGTIMEMICROS);
|
||||||
|
#ifdef HAVE_THREAD_LOCAL
|
||||||
|
LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES);
|
||||||
|
#endif
|
||||||
|
LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS);
|
||||||
|
|
||||||
|
fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetLoggingCategories(const ArgsManager& args)
|
||||||
|
{
|
||||||
|
if (args.IsArgSet("-debug")) {
|
||||||
|
// Special-case: if -debug=0/-nodebug is set, turn off debugging messages
|
||||||
|
const std::vector<std::string> categories = args.GetArgs("-debug");
|
||||||
|
|
||||||
|
if (std::none_of(categories.begin(), categories.end(),
|
||||||
|
[](std::string cat){return cat == "0" || cat == "none";})) {
|
||||||
|
for (const auto& cat : categories) {
|
||||||
|
if (!LogInstance().EnableCategory(cat)) {
|
||||||
|
InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debug", cat));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now remove the logging categories which were explicitly excluded
|
||||||
|
for (const std::string& cat : args.GetArgs("-debugexclude")) {
|
||||||
|
if (!LogInstance().DisableCategory(cat)) {
|
||||||
|
InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debugexclude", cat));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartLogging(const ArgsManager& args)
|
||||||
|
{
|
||||||
|
if (LogInstance().m_print_to_file) {
|
||||||
|
if (args.GetBoolArg("-shrinkdebugfile", LogInstance().DefaultShrinkDebugFile())) {
|
||||||
|
// Do this first since it both loads a bunch of debug.log into memory,
|
||||||
|
// and because this needs to happen before any other debug.log printing
|
||||||
|
LogInstance().ShrinkDebugFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!LogInstance().StartLogging()) {
|
||||||
|
return InitError(strprintf(Untranslated("Could not open debug log file %s"),
|
||||||
|
LogInstance().m_file_path.string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!LogInstance().m_log_timestamps)
|
||||||
|
LogPrintf("Startup time: %s\n", FormatISO8601DateTime(GetTime()));
|
||||||
|
LogPrintf("Default data directory %s\n", GetDefaultDataDir().string());
|
||||||
|
LogPrintf("Using data directory %s\n", GetDataDir().string());
|
||||||
|
|
||||||
|
// Only log conf file usage message if conf file actually exists.
|
||||||
|
fs::path config_file_path = GetConfigFile(args.GetArg("-conf", BITCOIN_CONF_FILENAME));
|
||||||
|
if (fs::exists(config_file_path)) {
|
||||||
|
LogPrintf("Config file: %s\n", config_file_path.string());
|
||||||
|
} else if (args.IsArgSet("-conf")) {
|
||||||
|
// Warn if no conf file exists at path provided by user
|
||||||
|
InitWarning(strprintf(_("The specified config file %s does not exist"), config_file_path.string()));
|
||||||
|
} else {
|
||||||
|
// Not categorizing as "Warning" because it's the default behavior
|
||||||
|
LogPrintf("Config file: %s (not found, skipping)\n", config_file_path.string());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log the config arguments to debug.log
|
||||||
|
args.LogArgs();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogPackageVersion()
|
||||||
|
{
|
||||||
|
std::string version_string = FormatFullVersion();
|
||||||
|
#ifdef DEBUG_CORE
|
||||||
|
version_string += " (debug build)";
|
||||||
|
#else
|
||||||
|
version_string += " (release build)";
|
||||||
|
#endif
|
||||||
|
LogPrintf(PACKAGE_NAME " version %s\n", version_string);
|
||||||
|
}
|
||||||
|
} // namespace init
|
28
src/init/common.h
Normal file
28
src/init/common.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
// Copyright (c) 2021 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
//! @file
|
||||||
|
//! @brief Common init functions shared by bitcoin-node, bitcoin-wallet, etc.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_INIT_COMMON_H
|
||||||
|
#define BITCOIN_INIT_COMMON_H
|
||||||
|
|
||||||
|
class ArgsManager;
|
||||||
|
|
||||||
|
namespace init {
|
||||||
|
void SetGlobals();
|
||||||
|
void UnsetGlobals();
|
||||||
|
/**
|
||||||
|
* Ensure a usable environment with all
|
||||||
|
* necessary library support.
|
||||||
|
*/
|
||||||
|
bool SanityChecks();
|
||||||
|
void AddLoggingArgs(ArgsManager& args);
|
||||||
|
void SetLoggingOptions(const ArgsManager& args);
|
||||||
|
void SetLoggingCategories(const ArgsManager& args);
|
||||||
|
bool StartLogging(const ArgsManager& args);
|
||||||
|
void LogPackageVersion();
|
||||||
|
} // namespace init
|
||||||
|
|
||||||
|
#endif // BITCOIN_INIT_COMMON_H
|
Loading…
Reference in New Issue
Block a user