|
22 | 22 | #include <httpserver.h>
|
23 | 23 | #include <index/blockfilterindex.h>
|
24 | 24 | #include <index/txindex.h>
|
| 25 | +#include <init/common.h> |
25 | 26 | #include <interfaces/chain.h>
|
26 | 27 | #include <interfaces/node.h>
|
27 |
| -#include <key.h> |
28 | 28 | #include <mapport.h>
|
29 | 29 | #include <miner.h>
|
30 | 30 | #include <net.h>
|
@@ -151,8 +151,6 @@ static fs::path GetPidFile(const ArgsManager& args)
|
151 | 151 | // shutdown thing.
|
152 | 152 | //
|
153 | 153 |
|
154 |
| -static std::unique_ptr<ECCVerifyHandle> globalVerifyHandle; |
155 |
| - |
156 | 154 | void Interrupt(NodeContext& node)
|
157 | 155 | {
|
158 | 156 | InterruptHTTPServer();
|
@@ -286,8 +284,7 @@ void Shutdown(NodeContext& node)
|
286 | 284 | node.chain_clients.clear();
|
287 | 285 | UnregisterAllValidationInterfaces();
|
288 | 286 | GetMainSignals().UnregisterBackgroundSignalScheduler();
|
289 |
| - globalVerifyHandle.reset(); |
290 |
| - ECC_Stop(); |
| 287 | + init::UnsetGlobals(); |
291 | 288 | node.mempool.reset();
|
292 | 289 | node.fee_estimator.reset();
|
293 | 290 | node.chainman = nullptr;
|
@@ -363,6 +360,8 @@ void SetupServerArgs(NodeContext& node)
|
363 | 360 | SetupHelpOptions(argsman);
|
364 | 361 | argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); // server-only for now
|
365 | 362 |
|
| 363 | + init::AddLoggingArgs(argsman); |
| 364 | + |
366 | 365 | const auto defaultBaseParams = CreateBaseChainParams(CBaseChainParams::MAIN);
|
367 | 366 | const auto testnetBaseParams = CreateBaseChainParams(CBaseChainParams::TESTNET);
|
368 | 367 | const auto signetBaseParams = CreateBaseChainParams(CBaseChainParams::SIGNET);
|
@@ -394,7 +393,6 @@ void SetupServerArgs(NodeContext& node)
|
394 | 393 | argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
395 | 394 | argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
|
396 | 395 | 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);
|
397 |
| - 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); |
398 | 396 | argsman.AddArg("-feefilter", strprintf("Tell other nodes to filter invs to us by our mempool min fee (default: %u)", DEFAULT_FEEFILTER), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
|
399 | 397 | 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);
|
400 | 398 | argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
@@ -522,25 +520,10 @@ void SetupServerArgs(NodeContext& node)
|
522 | 520 | argsman.AddArg("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
523 | 521 | argsman.AddArg("-addrmantest", "Allows to test address relay on localhost", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
524 | 522 | argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_BOOL | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
525 |
| - argsman.AddArg("-debug=<category>", "Output debugging information (default: -nodebug, supplying <category> is optional). " |
526 |
| - "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.", |
527 |
| - ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
528 |
| - 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); |
529 |
| - argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
530 |
| - argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
531 |
| -#ifdef HAVE_THREAD_LOCAL |
532 |
| - 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, OptionsCategory::DEBUG_TEST); |
533 |
| -#else |
534 |
| - hidden_args.emplace_back("-logthreadnames"); |
535 |
| -#endif |
536 |
| - 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); |
537 |
| - argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST); |
538 | 523 | argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
539 | 524 | 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);
|
540 | 525 | 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);
|
541 | 526 | 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);
|
542 |
| - 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); |
543 |
| - argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); |
544 | 527 | argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
545 | 528 |
|
546 | 529 | SetupChainParamsBaseOptions(argsman);
|
@@ -675,30 +658,6 @@ static void StartupNotify(const ArgsManager& args)
|
675 | 658 | }
|
676 | 659 | #endif
|
677 | 660 |
|
678 |
| -/** Sanity checks |
679 |
| - * Ensure that Bitcoin is running in a usable environment with all |
680 |
| - * necessary library support. |
681 |
| - */ |
682 |
| -static bool InitSanityCheck() |
683 |
| -{ |
684 |
| - if (!ECC_InitSanityCheck()) { |
685 |
| - return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting.")); |
686 |
| - } |
687 |
| - |
688 |
| - if (!glibcxx_sanity_test()) |
689 |
| - return false; |
690 |
| - |
691 |
| - if (!Random_SanityCheck()) { |
692 |
| - return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting.")); |
693 |
| - } |
694 |
| - |
695 |
| - if (!ChronoSanityCheck()) { |
696 |
| - return InitError(Untranslated("Clock epoch mismatch. Aborting.")); |
697 |
| - } |
698 |
| - |
699 |
| - return true; |
700 |
| -} |
701 |
| - |
702 | 661 | static bool AppInitServers(NodeContext& node)
|
703 | 662 | {
|
704 | 663 | const ArgsManager& args = *Assert(node.args);
|
@@ -796,25 +755,8 @@ void InitParameterInteraction(ArgsManager& args)
|
796 | 755 | */
|
797 | 756 | void InitLogging(const ArgsManager& args)
|
798 | 757 | {
|
799 |
| - LogInstance().m_print_to_file = !args.IsArgNegated("-debuglogfile"); |
800 |
| - LogInstance().m_file_path = AbsPathForConfigVal(args.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE)); |
801 |
| - LogInstance().m_print_to_console = args.GetBoolArg("-printtoconsole", !args.GetBoolArg("-daemon", false)); |
802 |
| - LogInstance().m_log_timestamps = args.GetBoolArg("-logtimestamps", DEFAULT_LOGTIMESTAMPS); |
803 |
| - LogInstance().m_log_time_micros = args.GetBoolArg("-logtimemicros", DEFAULT_LOGTIMEMICROS); |
804 |
| -#ifdef HAVE_THREAD_LOCAL |
805 |
| - LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES); |
806 |
| -#endif |
807 |
| - LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS); |
808 |
| - |
809 |
| - fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS); |
810 |
| - |
811 |
| - std::string version_string = FormatFullVersion(); |
812 |
| -#ifdef DEBUG |
813 |
| - version_string += " (debug build)"; |
814 |
| -#else |
815 |
| - version_string += " (release build)"; |
816 |
| -#endif |
817 |
| - LogPrintf(PACKAGE_NAME " version %s\n", version_string); |
| 758 | + init::SetLoggingOptions(args); |
| 759 | + init::LogPackageVersion(); |
818 | 760 | }
|
819 | 761 |
|
820 | 762 | namespace { // Variables internal to initialization process only
|
@@ -982,26 +924,7 @@ bool AppInitParameterInteraction(const ArgsManager& args)
|
982 | 924 | InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
|
983 | 925 |
|
984 | 926 | // ********************************************************* Step 3: parameter-to-internal-flags
|
985 |
| - if (args.IsArgSet("-debug")) { |
986 |
| - // Special-case: if -debug=0/-nodebug is set, turn off debugging messages |
987 |
| - const std::vector<std::string> categories = args.GetArgs("-debug"); |
988 |
| - |
989 |
| - if (std::none_of(categories.begin(), categories.end(), |
990 |
| - [](std::string cat){return cat == "0" || cat == "none";})) { |
991 |
| - for (const auto& cat : categories) { |
992 |
| - if (!LogInstance().EnableCategory(cat)) { |
993 |
| - InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debug", cat)); |
994 |
| - } |
995 |
| - } |
996 |
| - } |
997 |
| - } |
998 |
| - |
999 |
| - // Now remove the logging categories which were explicitly excluded |
1000 |
| - for (const std::string& cat : args.GetArgs("-debugexclude")) { |
1001 |
| - if (!LogInstance().DisableCategory(cat)) { |
1002 |
| - InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debugexclude", cat)); |
1003 |
| - } |
1004 |
| - } |
| 927 | + init::SetLoggingCategories(args); |
1005 | 928 |
|
1006 | 929 | fCheckBlockIndex = args.GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
|
1007 | 930 | fCheckpointsEnabled = args.GetBoolArg("-checkpoints", DEFAULT_CHECKPOINTS_ENABLED);
|
@@ -1148,16 +1071,11 @@ bool AppInitSanityChecks()
|
1148 | 1071 | {
|
1149 | 1072 | // ********************************************************* Step 4: sanity checks
|
1150 | 1073 |
|
1151 |
| - // Initialize elliptic curve code |
1152 |
| - std::string sha256_algo = SHA256AutoDetect(); |
1153 |
| - LogPrintf("Using the '%s' SHA256 implementation\n", sha256_algo); |
1154 |
| - RandomInit(); |
1155 |
| - ECC_Start(); |
1156 |
| - globalVerifyHandle.reset(new ECCVerifyHandle()); |
| 1074 | + init::SetGlobals(); |
1157 | 1075 |
|
1158 |
| - // Sanity check |
1159 |
| - if (!InitSanityCheck()) |
| 1076 | + if (!init::SanityChecks()) { |
1160 | 1077 | return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
|
| 1078 | + } |
1161 | 1079 |
|
1162 | 1080 | // Probe the data directory lock to give an early error message, if possible
|
1163 | 1081 | // We cannot hold the data directory lock here, as the forking for daemon() hasn't yet happened,
|
@@ -1197,38 +1115,11 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
1197 | 1115 | // Detailed error printed inside CreatePidFile().
|
1198 | 1116 | return false;
|
1199 | 1117 | }
|
1200 |
| - if (LogInstance().m_print_to_file) { |
1201 |
| - if (args.GetBoolArg("-shrinkdebugfile", LogInstance().DefaultShrinkDebugFile())) { |
1202 |
| - // Do this first since it both loads a bunch of debug.log into memory, |
1203 |
| - // and because this needs to happen before any other debug.log printing |
1204 |
| - LogInstance().ShrinkDebugFile(); |
1205 |
| - } |
1206 |
| - } |
1207 |
| - if (!LogInstance().StartLogging()) { |
1208 |
| - return InitError(strprintf(Untranslated("Could not open debug log file %s"), |
1209 |
| - LogInstance().m_file_path.string())); |
1210 |
| - } |
1211 |
| - |
1212 |
| - if (!LogInstance().m_log_timestamps) |
1213 |
| - LogPrintf("Startup time: %s\n", FormatISO8601DateTime(GetTime())); |
1214 |
| - LogPrintf("Default data directory %s\n", GetDefaultDataDir().string()); |
1215 |
| - LogPrintf("Using data directory %s\n", GetDataDir().string()); |
1216 |
| - |
1217 |
| - // Only log conf file usage message if conf file actually exists. |
1218 |
| - fs::path config_file_path = GetConfigFile(args.GetArg("-conf", BITCOIN_CONF_FILENAME)); |
1219 |
| - if (fs::exists(config_file_path)) { |
1220 |
| - LogPrintf("Config file: %s\n", config_file_path.string()); |
1221 |
| - } else if (args.IsArgSet("-conf")) { |
1222 |
| - // Warn if no conf file exists at path provided by user |
1223 |
| - InitWarning(strprintf(_("The specified config file %s does not exist"), config_file_path.string())); |
1224 |
| - } else { |
1225 |
| - // Not categorizing as "Warning" because it's the default behavior |
1226 |
| - LogPrintf("Config file: %s (not found, skipping)\n", config_file_path.string()); |
| 1118 | + if (!init::StartLogging(args)) { |
| 1119 | + // Detailed error printed inside StartLogging(). |
| 1120 | + return false; |
1227 | 1121 | }
|
1228 | 1122 |
|
1229 |
| - // Log the config arguments to debug.log |
1230 |
| - args.LogArgs(); |
1231 |
| - |
1232 | 1123 | LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
|
1233 | 1124 |
|
1234 | 1125 | // Warn about relative -datadir path.
|
|
0 commit comments