Bitcoin Core  28.1.0
P2P Digital Currency
init.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include <config/bitcoin-config.h> // IWYU pragma: keep
7 
8 #include <init.h>
9 
10 #include <kernel/checks.h>
11 
12 #include <addrman.h>
13 #include <banman.h>
14 #include <blockfilter.h>
15 #include <chain.h>
16 #include <chainparams.h>
17 #include <chainparamsbase.h>
18 #include <clientversion.h>
19 #include <common/args.h>
20 #include <common/system.h>
21 #include <consensus/amount.h>
22 #include <deploymentstatus.h>
23 #include <hash.h>
24 #include <httprpc.h>
25 #include <httpserver.h>
26 #include <index/blockfilterindex.h>
27 #include <index/coinstatsindex.h>
28 #include <index/txindex.h>
29 #include <init/common.h>
30 #include <interfaces/chain.h>
31 #include <interfaces/init.h>
32 #include <interfaces/mining.h>
33 #include <interfaces/node.h>
34 #include <kernel/context.h>
35 #include <key.h>
36 #include <logging.h>
37 #include <mapport.h>
38 #include <net.h>
39 #include <net_permissions.h>
40 #include <net_processing.h>
41 #include <netbase.h>
42 #include <netgroup.h>
43 #include <node/blockmanager_args.h>
44 #include <node/blockstorage.h>
45 #include <node/caches.h>
46 #include <node/chainstate.h>
48 #include <node/context.h>
49 #include <node/interface_ui.h>
51 #include <node/mempool_args.h>
52 #include <node/mempool_persist.h>
54 #include <node/miner.h>
55 #include <node/peerman_args.h>
56 #include <policy/feerate.h>
57 #include <policy/fees.h>
58 #include <policy/fees_args.h>
59 #include <policy/policy.h>
60 #include <policy/settings.h>
61 #include <protocol.h>
62 #include <rpc/blockchain.h>
63 #include <rpc/register.h>
64 #include <rpc/server.h>
65 #include <rpc/util.h>
66 #include <scheduler.h>
67 #include <script/sigcache.h>
68 #include <sync.h>
69 #include <torcontrol.h>
70 #include <txdb.h>
71 #include <txmempool.h>
72 #include <util/asmap.h>
73 #include <util/batchpriority.h>
74 #include <util/chaintype.h>
75 #include <util/check.h>
76 #include <util/fs.h>
77 #include <util/fs_helpers.h>
78 #include <util/moneystr.h>
79 #include <util/result.h>
80 #include <util/signalinterrupt.h>
81 #include <util/strencodings.h>
82 #include <util/string.h>
83 #include <util/syserror.h>
84 #include <util/thread.h>
85 #include <util/threadnames.h>
86 #include <util/time.h>
87 #include <util/translation.h>
88 #include <validation.h>
89 #include <validationinterface.h>
90 #include <walletinitinterface.h>
91 
92 #include <algorithm>
93 #include <condition_variable>
94 #include <cstdint>
95 #include <cstdio>
96 #include <fstream>
97 #include <functional>
98 #include <set>
99 #include <string>
100 #include <thread>
101 #include <vector>
102 
103 #ifndef WIN32
104 #include <cerrno>
105 #include <signal.h>
106 #include <sys/stat.h>
107 #endif
108 
109 #include <boost/signals2/signal.hpp>
110 
111 #ifdef ENABLE_ZMQ
112 #include <zmq/zmqabstractnotifier.h>
114 #include <zmq/zmqrpc.h>
115 #endif
116 
120 
122 using node::BlockManager;
123 using node::CacheSizes;
128 using node::DumpMempool;
129 using node::LoadMempool;
132 using node::MempoolPath;
133 using node::NodeContext;
135 using node::ImportBlocks;
137 using util::Join;
138 using util::ReplaceAll;
139 using util::ToString;
140 
141 static constexpr bool DEFAULT_PROXYRANDOMIZE{true};
142 static constexpr bool DEFAULT_REST_ENABLE{false};
143 static constexpr bool DEFAULT_I2P_ACCEPT_INCOMING{true};
144 static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT{false};
145 
146 #ifdef WIN32
147 // Win32 LevelDB doesn't use filedescriptors, and the ones used for
148 // accessing block files don't count towards the fd_set size limit
149 // anyway.
150 #define MIN_CORE_FILEDESCRIPTORS 0
151 #else
152 #define MIN_CORE_FILEDESCRIPTORS 150
153 #endif
154 
155 static const char* DEFAULT_ASMAP_FILENAME="ip_asn.map";
156 
160 static const char* BITCOIN_PID_FILENAME = "bitcoind.pid";
165 static bool g_generated_pid{false};
166 
168 {
170 }
171 
172 [[nodiscard]] static bool CreatePidFile(const ArgsManager& args)
173 {
174  std::ofstream file{GetPidFile(args)};
175  if (file) {
176 #ifdef WIN32
177  tfm::format(file, "%d\n", GetCurrentProcessId());
178 #else
179  tfm::format(file, "%d\n", getpid());
180 #endif
181  g_generated_pid = true;
182  return true;
183  } else {
184  return InitError(strprintf(_("Unable to create the PID file '%s': %s"), fs::PathToString(GetPidFile(args)), SysErrorString(errno)));
185  }
186 }
187 
188 static void RemovePidFile(const ArgsManager& args)
189 {
190  if (!g_generated_pid) return;
191  const auto pid_path{GetPidFile(args)};
192  if (std::error_code error; !fs::remove(pid_path, error)) {
193  std::string msg{error ? error.message() : "File does not exist"};
194  LogPrintf("Unable to remove PID file (%s): %s\n", fs::PathToString(pid_path), msg);
195  }
196 }
197 
198 static std::optional<util::SignalInterrupt> g_shutdown;
199 
201 {
202  assert(!g_shutdown);
203  g_shutdown.emplace();
204 
205  node.args = &gArgs;
206  node.shutdown = &*g_shutdown;
207 }
208 
210 //
211 // Shutdown
212 //
213 
214 //
215 // Thread management and startup/shutdown:
216 //
217 // The network-processing threads are all part of a thread group
218 // created by AppInit() or the Qt main() function.
219 //
220 // A clean exit happens when the SignalInterrupt object is triggered, which
221 // makes the main thread's SignalInterrupt::wait() call return, and join all
222 // other ongoing threads in the thread group to the main thread.
223 // Shutdown() is then called to clean up database connections, and stop other
224 // threads that should only be stopped after the main network-processing
225 // threads have exited.
226 //
227 // Shutdown for Qt is very similar, only it uses a QTimer to detect
228 // ShutdownRequested() getting set, and then does the normal Qt
229 // shutdown thing.
230 //
231 
233 {
234  return bool{*Assert(node.shutdown)};
235 }
236 
237 #if HAVE_SYSTEM
238 static void ShutdownNotify(const ArgsManager& args)
239 {
240  std::vector<std::thread> threads;
241  for (const auto& cmd : args.GetArgs("-shutdownnotify")) {
242  threads.emplace_back(runCommand, cmd);
243  }
244  for (auto& t : threads) {
245  t.join();
246  }
247 }
248 #endif
249 
251 {
252 #if HAVE_SYSTEM
253  ShutdownNotify(*node.args);
254 #endif
257  InterruptRPC();
258  InterruptREST();
261  if (node.connman)
262  node.connman->Interrupt();
263  for (auto* index : node.indexes) {
264  index->Interrupt();
265  }
266 }
267 
269 {
270  static Mutex g_shutdown_mutex;
271  TRY_LOCK(g_shutdown_mutex, lock_shutdown);
272  if (!lock_shutdown) return;
273  LogPrintf("%s: In progress...\n", __func__);
274  Assert(node.args);
275 
280  util::ThreadRename("shutoff");
281  if (node.mempool) node.mempool->AddTransactionsUpdated(1);
282 
283  StopHTTPRPC();
284  StopREST();
285  StopRPC();
286  StopHTTPServer();
287  for (const auto& client : node.chain_clients) {
288  client->flush();
289  }
290  StopMapPort();
291 
292  // Because these depend on each-other, we make sure that neither can be
293  // using the other before destroying them.
294  if (node.peerman && node.validation_signals) node.validation_signals->UnregisterValidationInterface(node.peerman.get());
295  if (node.connman) node.connman->Stop();
296 
297  StopTorControl();
298 
299  if (node.chainman && node.chainman->m_thread_load.joinable()) node.chainman->m_thread_load.join();
300  // After everything has been shut down, but before things get flushed, stop the
301  // the scheduler. After this point, SyncWithValidationInterfaceQueue() should not be called anymore
302  // as this would prevent the shutdown from completing.
303  if (node.scheduler) node.scheduler->stop();
304 
305  // After the threads that potentially access these pointers have been stopped,
306  // destruct and reset all to nullptr.
307  node.peerman.reset();
308  node.connman.reset();
309  node.banman.reset();
310  node.addrman.reset();
311  node.netgroupman.reset();
312 
313  if (node.mempool && node.mempool->GetLoadTried() && ShouldPersistMempool(*node.args)) {
314  DumpMempool(*node.mempool, MempoolPath(*node.args));
315  }
316 
317  // Drop transactions we were still watching, record fee estimations and unregister
318  // fee estimator from validation interface.
319  if (node.fee_estimator) {
320  node.fee_estimator->Flush();
321  if (node.validation_signals) {
322  node.validation_signals->UnregisterValidationInterface(node.fee_estimator.get());
323  }
324  }
325 
326  // FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
327  if (node.chainman) {
328  LOCK(cs_main);
329  for (Chainstate* chainstate : node.chainman->GetAll()) {
330  if (chainstate->CanFlushToDisk()) {
331  chainstate->ForceFlushStateToDisk();
332  }
333  }
334  }
335 
336  // After there are no more peers/RPC left to give us new data which may generate
337  // CValidationInterface callbacks, flush them...
338  if (node.validation_signals) node.validation_signals->FlushBackgroundCallbacks();
339 
340  // Stop and delete all indexes only after flushing background callbacks.
341  for (auto* index : node.indexes) index->Stop();
342  if (g_txindex) g_txindex.reset();
345  node.indexes.clear(); // all instances are nullptr now
346 
347  // Any future callbacks will be dropped. This should absolutely be safe - if
348  // missing a callback results in an unrecoverable situation, unclean shutdown
349  // would too. The only reason to do the above flushes is to let the wallet catch
350  // up with our current chain to avoid any strange pruning edge cases and make
351  // next startup faster by avoiding rescan.
352 
353  if (node.chainman) {
354  LOCK(cs_main);
355  for (Chainstate* chainstate : node.chainman->GetAll()) {
356  if (chainstate->CanFlushToDisk()) {
357  chainstate->ForceFlushStateToDisk();
358  chainstate->ResetCoinsViews();
359  }
360  }
361  }
362  for (const auto& client : node.chain_clients) {
363  client->stop();
364  }
365 
366 #ifdef ENABLE_ZMQ
368  if (node.validation_signals) node.validation_signals->UnregisterValidationInterface(g_zmq_notification_interface.get());
370  }
371 #endif
372 
373  node.chain_clients.clear();
374  if (node.validation_signals) {
375  node.validation_signals->UnregisterAllValidationInterfaces();
376  }
377  node.mempool.reset();
378  node.fee_estimator.reset();
379  node.chainman.reset();
380  node.validation_signals.reset();
381  node.scheduler.reset();
382  node.ecc_context.reset();
383  node.kernel.reset();
384 
385  RemovePidFile(*node.args);
386 
387  LogPrintf("%s: done\n", __func__);
388 }
389 
395 #ifndef WIN32
396 static void HandleSIGTERM(int)
397 {
398  // Return value is intentionally ignored because there is not a better way
399  // of handling this failure in a signal handler.
400  (void)(*Assert(g_shutdown))();
401 }
402 
403 static void HandleSIGHUP(int)
404 {
405  LogInstance().m_reopen_file = true;
406 }
407 #else
408 static BOOL WINAPI consoleCtrlHandler(DWORD dwCtrlType)
409 {
410  if (!(*Assert(g_shutdown))()) {
411  LogError("Failed to send shutdown signal on Ctrl-C\n");
412  return false;
413  }
414  Sleep(INFINITE);
415  return true;
416 }
417 #endif
418 
419 #ifndef WIN32
420 static void registerSignalHandler(int signal, void(*handler)(int))
421 {
422  struct sigaction sa;
423  sa.sa_handler = handler;
424  sigemptyset(&sa.sa_mask);
425  sa.sa_flags = 0;
426  sigaction(signal, &sa, nullptr);
427 }
428 #endif
429 
430 static boost::signals2::connection rpc_notify_block_change_connection;
431 static void OnRPCStarted()
432 {
433  rpc_notify_block_change_connection = uiInterface.NotifyBlockTip_connect(std::bind(RPCNotifyBlockChange, std::placeholders::_2));
434 }
435 
436 static void OnRPCStopped()
437 {
439  RPCNotifyBlockChange(nullptr);
440  g_best_block_cv.notify_all();
441  LogPrint(BCLog::RPC, "RPC stopped.\n");
442 }
443 
445 {
446  SetupHelpOptions(argsman);
447  argsman.AddArg("-help-debug", "Print help message with debugging options and exit", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST); // server-only for now
448 
449  init::AddLoggingArgs(argsman);
450 
451  const auto defaultBaseParams = CreateBaseChainParams(ChainType::MAIN);
452  const auto testnetBaseParams = CreateBaseChainParams(ChainType::TESTNET);
453  const auto testnet4BaseParams = CreateBaseChainParams(ChainType::TESTNET4);
454  const auto signetBaseParams = CreateBaseChainParams(ChainType::SIGNET);
455  const auto regtestBaseParams = CreateBaseChainParams(ChainType::REGTEST);
456  const auto defaultChainParams = CreateChainParams(argsman, ChainType::MAIN);
457  const auto testnetChainParams = CreateChainParams(argsman, ChainType::TESTNET);
458  const auto testnet4ChainParams = CreateChainParams(argsman, ChainType::TESTNET4);
459  const auto signetChainParams = CreateChainParams(argsman, ChainType::SIGNET);
460  const auto regtestChainParams = CreateChainParams(argsman, ChainType::REGTEST);
461 
462  // Hidden Options
463  std::vector<std::string> hidden_args = {
464  "-dbcrashratio", "-forcecompactdb",
465  // GUI args. These will be overwritten by SetupUIArgs for the GUI
466  "-choosedatadir", "-lang=<lang>", "-min", "-resetguisettings", "-splash", "-uiplatform"};
467 
468  argsman.AddArg("-version", "Print version and exit", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
469 #if HAVE_SYSTEM
470  argsman.AddArg("-alertnotify=<cmd>", "Execute command when an alert is raised (%s in cmd is replaced by message)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
471 #endif
472  argsman.AddArg("-assumevalid=<hex>", strprintf("If this block is in the chain assume that it and its ancestors are valid and potentially skip their script verification (0 to verify all, default: %s, testnet3: %s, testnet4: %s, signet: %s)", defaultChainParams->GetConsensus().defaultAssumeValid.GetHex(), testnetChainParams->GetConsensus().defaultAssumeValid.GetHex(), testnet4ChainParams->GetConsensus().defaultAssumeValid.GetHex(), signetChainParams->GetConsensus().defaultAssumeValid.GetHex()), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
473  argsman.AddArg("-blocksdir=<dir>", "Specify directory to hold blocks subdirectory for *.dat files (default: <datadir>)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
474  argsman.AddArg("-blocksxor",
475  strprintf("Whether an XOR-key applies to blocksdir *.dat files. "
476  "The created XOR-key will be zeros for an existing blocksdir or when `-blocksxor=0` is "
477  "set, and random for a freshly initialized blocksdir. "
478  "(default: %u)",
481  argsman.AddArg("-fastprune", "Use smaller block files and lower minimum prune height for testing purposes", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
482 #if HAVE_SYSTEM
483  argsman.AddArg("-blocknotify=<cmd>", "Execute command when the best block changes (%s in cmd is replaced by block hash)", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
484 #endif
485  argsman.AddArg("-blockreconstructionextratxn=<n>", strprintf("Extra transactions to keep in memory for compact block reconstructions (default: %u)", DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
486  argsman.AddArg("-blocksonly", strprintf("Whether to reject transactions from network peers. Disables automatic broadcast and rebroadcast of transactions, unless the source peer has the 'forcerelay' permission. RPC transactions are not affected. (default: %u)", DEFAULT_BLOCKSONLY), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
487  argsman.AddArg("-coinstatsindex", strprintf("Maintain coinstats index used by the gettxoutsetinfo RPC (default: %u)", DEFAULT_COINSTATSINDEX), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
488  argsman.AddArg("-conf=<file>", strprintf("Specify path to read-only configuration file. Relative paths will be prefixed by datadir location (only useable from command line, not configuration file) (default: %s)", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
489  argsman.AddArg("-datadir=<dir>", "Specify data directory", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
490  argsman.AddArg("-dbbatchsize", strprintf("Maximum database write batch size in bytes (default: %u)", nDefaultDbBatchSize), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
491  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);
492  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);
493  argsman.AddArg("-allowignoredconf", strprintf("For backwards compatibility, treat an unused %s file in the datadir as a warning, not an error.", BITCOIN_CONF_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
494  argsman.AddArg("-loadblock=<file>", "Imports blocks from external file on startup", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
495  argsman.AddArg("-maxmempool=<n>", strprintf("Keep the transaction memory pool below <n> megabytes (default: %u)", DEFAULT_MAX_MEMPOOL_SIZE_MB), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
496  argsman.AddArg("-maxorphantx=<n>", strprintf("Keep at most <n> unconnectable transactions in memory (default: %u)", DEFAULT_MAX_ORPHAN_TRANSACTIONS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
497  argsman.AddArg("-mempoolexpiry=<n>", strprintf("Do not keep transactions in the mempool longer than <n> hours (default: %u)", DEFAULT_MEMPOOL_EXPIRY_HOURS), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
498  argsman.AddArg("-minimumchainwork=<hex>", strprintf("Minimum work assumed to exist on a valid chain in hex (default: %s, testnet3: %s, testnet4: %s, signet: %s)", defaultChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnetChainParams->GetConsensus().nMinimumChainWork.GetHex(), testnet4ChainParams->GetConsensus().nMinimumChainWork.GetHex(), signetChainParams->GetConsensus().nMinimumChainWork.GetHex()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::OPTIONS);
499  argsman.AddArg("-par=<n>", strprintf("Set the number of script verification threads (0 = auto, up to %d, <0 = leave that many cores free, default: %d)",
501  argsman.AddArg("-persistmempool", strprintf("Whether to save the mempool on shutdown and load on restart (default: %u)", DEFAULT_PERSIST_MEMPOOL), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
502  argsman.AddArg("-persistmempoolv1",
503  strprintf("Whether a mempool.dat file created by -persistmempool or the savemempool RPC will be written in the legacy format "
504  "(version 1) or the current format (version 2). This temporary option will be removed in the future. (default: %u)",
507  argsman.AddArg("-pid=<file>", strprintf("Specify pid file. Relative paths will be prefixed by a net-specific datadir location. (default: %s)", BITCOIN_PID_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
508  argsman.AddArg("-prune=<n>", strprintf("Reduce storage requirements by enabling pruning (deleting) of old blocks. This allows the pruneblockchain RPC to be called to delete specific blocks and enables automatic pruning of old blocks if a target size in MiB is provided. This mode is incompatible with -txindex. "
509  "Warning: Reverting this setting requires re-downloading the entire blockchain. "
510  "(default: 0 = disable pruning blocks, 1 = allow manual pruning via RPC, >=%u = automatically prune block files to stay under the specified target size in MiB)", MIN_DISK_SPACE_FOR_BLOCK_FILES / 1024 / 1024), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
511  argsman.AddArg("-reindex", "If enabled, wipe chain state and block index, and rebuild them from blk*.dat files on disk. Also wipe and rebuild other optional indexes that are active. If an assumeutxo snapshot was loaded, its chainstate will be wiped as well. The snapshot can then be reloaded via RPC.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
512  argsman.AddArg("-reindex-chainstate", "If enabled, wipe chain state, and rebuild it from blk*.dat files on disk. If an assumeutxo snapshot was loaded, its chainstate will be wiped as well. The snapshot can then be reloaded via RPC.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
513  argsman.AddArg("-settings=<file>", strprintf("Specify path to dynamic settings data file. Can be disabled with -nosettings. File is written at runtime and not meant to be edited by users (use %s instead for custom settings). Relative paths will be prefixed by datadir location. (default: %s)", BITCOIN_CONF_FILENAME, BITCOIN_SETTINGS_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
514 #if HAVE_SYSTEM
515  argsman.AddArg("-startupnotify=<cmd>", "Execute command on startup.", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
516  argsman.AddArg("-shutdownnotify=<cmd>", "Execute command immediately before beginning shutdown. The need for shutdown may be urgent, so be careful not to delay it long (if the command doesn't require interaction with the server, consider having it fork into the background).", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
517 #endif
518  argsman.AddArg("-txindex", strprintf("Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)", DEFAULT_TXINDEX), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
519  argsman.AddArg("-blockfilterindex=<type>",
520  strprintf("Maintain an index of compact filters by block (default: %s, values: %s).", DEFAULT_BLOCKFILTERINDEX, ListBlockFilterTypes()) +
521  " If <type> is not supplied or if <type> = 1, indexes for all known types are enabled.",
523 
524  argsman.AddArg("-addnode=<ip>", strprintf("Add a node to connect to and attempt to keep the connection open (see the addnode RPC help for more info). This option can be specified multiple times to add multiple nodes; connections are limited to %u at a time and are counted separately from the -maxconnections limit.", MAX_ADDNODE_CONNECTIONS), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
525  argsman.AddArg("-asmap=<file>", strprintf("Specify asn mapping used for bucketing of the peers (default: %s). Relative paths will be prefixed by the net-specific datadir location.", DEFAULT_ASMAP_FILENAME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
526  argsman.AddArg("-bantime=<n>", strprintf("Default duration (in seconds) of manually configured bans (default: %u)", DEFAULT_MISBEHAVING_BANTIME), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
527  argsman.AddArg("-bind=<addr>[:<port>][=onion]", strprintf("Bind to given address and always listen on it (default: 0.0.0.0). Use [host]:port notation for IPv6. Append =onion to tag any incoming connections to that address and port as incoming Tor connections (default: 127.0.0.1:%u=onion, testnet3: 127.0.0.1:%u=onion, testnet4: 127.0.0.1:%u=onion, signet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)", defaultChainParams->GetDefaultPort() + 1, testnetChainParams->GetDefaultPort() + 1, testnet4ChainParams->GetDefaultPort() + 1, signetChainParams->GetDefaultPort() + 1, regtestChainParams->GetDefaultPort() + 1), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
528  argsman.AddArg("-cjdnsreachable", "If set, then this host is configured for CJDNS (connecting to fc00::/8 addresses would lead us to the CJDNS network, see doc/cjdns.md) (default: 0)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
529  argsman.AddArg("-connect=<ip>", "Connect only to the specified node; -noconnect disables automatic connections (the rules for this peer are the same as for -addnode). This option can be specified multiple times to connect to multiple nodes.", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
530  argsman.AddArg("-discover", "Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
531  argsman.AddArg("-dns", strprintf("Allow DNS lookups for -addnode, -seednode and -connect (default: %u)", DEFAULT_NAME_LOOKUP), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
532  argsman.AddArg("-dnsseed", strprintf("Query for peer addresses via DNS lookup, if low on addresses (default: %u unless -connect used or -maxconnections=0)", DEFAULT_DNSSEED), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
533  argsman.AddArg("-externalip=<ip>", "Specify your own public address", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
534  argsman.AddArg("-fixedseeds", strprintf("Allow fixed seeds if DNS seeds don't provide peers (default: %u)", DEFAULT_FIXEDSEEDS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
535  argsman.AddArg("-forcednsseed", strprintf("Always query for peer addresses via DNS lookup (default: %u)", DEFAULT_FORCEDNSSEED), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
536  argsman.AddArg("-listen", strprintf("Accept connections from outside (default: %u if no -proxy, -connect or -maxconnections=0)", DEFAULT_LISTEN), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
537  argsman.AddArg("-listenonion", strprintf("Automatically create Tor onion service (default: %d)", DEFAULT_LISTEN_ONION), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
538  argsman.AddArg("-maxconnections=<n>", strprintf("Maintain at most <n> automatic connections to peers (default: %u). This limit does not apply to connections manually added via -addnode or the addnode RPC, which have a separate limit of %u.", DEFAULT_MAX_PEER_CONNECTIONS, MAX_ADDNODE_CONNECTIONS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
539  argsman.AddArg("-maxreceivebuffer=<n>", strprintf("Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)", DEFAULT_MAXRECEIVEBUFFER), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
540  argsman.AddArg("-maxsendbuffer=<n>", strprintf("Maximum per-connection memory usage for the send buffer, <n>*1000 bytes (default: %u)", DEFAULT_MAXSENDBUFFER), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
541  argsman.AddArg("-maxuploadtarget=<n>", strprintf("Tries to keep outbound traffic under the given target per 24h. Limit does not apply to peers with 'download' permission or blocks created within past week. 0 = no limit (default: %s). Optional suffix units [k|K|m|M|g|G|t|T] (default: M). Lowercase is 1000 base while uppercase is 1024 base", DEFAULT_MAX_UPLOAD_TARGET), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
542 #ifdef HAVE_SOCKADDR_UN
543  argsman.AddArg("-onion=<ip:port|path>", "Use separate SOCKS5 proxy to reach peers via Tor onion services, set -noonion to disable (default: -proxy). May be a local file path prefixed with 'unix:'.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
544 #else
545  argsman.AddArg("-onion=<ip:port>", "Use separate SOCKS5 proxy to reach peers via Tor onion services, set -noonion to disable (default: -proxy)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
546 #endif
547  argsman.AddArg("-i2psam=<ip:port>", "I2P SAM proxy to reach I2P peers and accept I2P connections (default: none)", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
548  argsman.AddArg("-i2pacceptincoming", strprintf("Whether to accept inbound I2P connections (default: %i). Ignored if -i2psam is not set. Listening for inbound I2P connections is done through the SAM proxy, not by binding to a local address and port.", DEFAULT_I2P_ACCEPT_INCOMING), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
549  argsman.AddArg("-onlynet=<net>", "Make automatic outbound connections only to network <net> (" + Join(GetNetworkNames(), ", ") + "). Inbound and manual connections are not affected by this option. It can be specified multiple times to allow multiple networks.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
550  argsman.AddArg("-v2transport", strprintf("Support v2 transport (default: %u)", DEFAULT_V2_TRANSPORT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
551  argsman.AddArg("-peerbloomfilters", strprintf("Support filtering of blocks and transaction with bloom filters (default: %u)", DEFAULT_PEERBLOOMFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
552  argsman.AddArg("-peerblockfilters", strprintf("Serve compact block filters to peers per BIP 157 (default: %u)", DEFAULT_PEERBLOCKFILTERS), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
553  argsman.AddArg("-txreconciliation", strprintf("Enable transaction reconciliations per BIP 330 (default: %d)", DEFAULT_TXRECONCILIATION_ENABLE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION);
554  argsman.AddArg("-port=<port>", strprintf("Listen for connections on <port> (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u). Not relevant for I2P (see doc/i2p.md). If set to a value x, the default onion listening port will be set to x+1.", defaultChainParams->GetDefaultPort(), testnetChainParams->GetDefaultPort(), testnet4ChainParams->GetDefaultPort(), signetChainParams->GetDefaultPort(), regtestChainParams->GetDefaultPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::CONNECTION);
555 #ifdef HAVE_SOCKADDR_UN
556  argsman.AddArg("-proxy=<ip:port|path>", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled). May be a local file path prefixed with 'unix:' if the proxy supports it.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION);
557 #else
558  argsman.AddArg("-proxy=<ip:port>", "Connect through SOCKS5 proxy, set -noproxy to disable (default: disabled)", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_ELISION, OptionsCategory::CONNECTION);
559 #endif
560  argsman.AddArg("-proxyrandomize", strprintf("Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)", DEFAULT_PROXYRANDOMIZE), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
561  argsman.AddArg("-seednode=<ip>", "Connect to a node to retrieve peer addresses, and disconnect. This option can be specified multiple times to connect to multiple nodes. During startup, seednodes will be tried before dnsseeds.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
562  argsman.AddArg("-networkactive", "Enable all P2P network activity (default: 1). Can be changed by the setnetworkactive RPC command", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
563  argsman.AddArg("-timeout=<n>", strprintf("Specify socket connection timeout in milliseconds. If an initial attempt to connect is unsuccessful after this amount of time, drop it (minimum: 1, default: %d)", DEFAULT_CONNECT_TIMEOUT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
564  argsman.AddArg("-peertimeout=<n>", strprintf("Specify a p2p connection timeout delay in seconds. After connecting to a peer, wait this amount of time before considering disconnection based on inactivity (minimum: 1, default: %d)", DEFAULT_PEER_CONNECT_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION);
565  argsman.AddArg("-torcontrol=<ip>:<port>", strprintf("Tor control host and port to use if onion listening enabled (default: %s). If no port is specified, the default port of %i will be used.", DEFAULT_TOR_CONTROL, DEFAULT_TOR_CONTROL_PORT), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
566  argsman.AddArg("-torpassword=<pass>", "Tor control port password (default: empty)", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::CONNECTION);
567 #ifdef USE_UPNP
568  argsman.AddArg("-upnp", strprintf("Use UPnP to map the listening port (default: %u)", DEFAULT_UPNP), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
569 #else
570  hidden_args.emplace_back("-upnp");
571 #endif
572 #ifdef USE_NATPMP
573  argsman.AddArg("-natpmp", strprintf("Use NAT-PMP to map the listening port (default: %u)", DEFAULT_NATPMP), ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
574 #else
575  hidden_args.emplace_back("-natpmp");
576 #endif // USE_NATPMP
577  argsman.AddArg("-whitebind=<[permissions@]addr>", "Bind to the given address and add permission flags to the peers connecting to it. "
578  "Use [host]:port notation for IPv6. Allowed permissions: " + Join(NET_PERMISSIONS_DOC, ", ") + ". "
579  "Specify multiple permissions separated by commas (default: download,noban,mempool,relay). Can be specified multiple times.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
580 
581  argsman.AddArg("-whitelist=<[permissions@]IP address or network>", "Add permission flags to the peers using the given IP address (e.g. 1.2.3.4) or "
582  "CIDR-notated network (e.g. 1.2.3.0/24). Uses the same permissions as "
583  "-whitebind. "
584  "Additional flags \"in\" and \"out\" control whether permissions apply to incoming connections and/or manual (default: incoming only). "
585  "Can be specified multiple times.", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
586 
588 
589 #ifdef ENABLE_ZMQ
590  argsman.AddArg("-zmqpubhashblock=<address>", "Enable publish hash block in <address>", ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
591  argsman.AddArg("-zmqpubhashtx=<address>", "Enable publish hash transaction in <address>", ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
592  argsman.AddArg("-zmqpubrawblock=<address>", "Enable publish raw block in <address>", ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
593  argsman.AddArg("-zmqpubrawtx=<address>", "Enable publish raw transaction in <address>", ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
594  argsman.AddArg("-zmqpubsequence=<address>", "Enable publish hash block and tx sequence in <address>", ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
595  argsman.AddArg("-zmqpubhashblockhwm=<n>", strprintf("Set publish hash block outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
596  argsman.AddArg("-zmqpubhashtxhwm=<n>", strprintf("Set publish hash transaction outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
597  argsman.AddArg("-zmqpubrawblockhwm=<n>", strprintf("Set publish raw block outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
598  argsman.AddArg("-zmqpubrawtxhwm=<n>", strprintf("Set publish raw transaction outbound message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
599  argsman.AddArg("-zmqpubsequencehwm=<n>", strprintf("Set publish hash sequence message high water mark (default: %d)", CZMQAbstractNotifier::DEFAULT_ZMQ_SNDHWM), ArgsManager::ALLOW_ANY, OptionsCategory::ZMQ);
600 #else
601  hidden_args.emplace_back("-zmqpubhashblock=<address>");
602  hidden_args.emplace_back("-zmqpubhashtx=<address>");
603  hidden_args.emplace_back("-zmqpubrawblock=<address>");
604  hidden_args.emplace_back("-zmqpubrawtx=<address>");
605  hidden_args.emplace_back("-zmqpubsequence=<n>");
606  hidden_args.emplace_back("-zmqpubhashblockhwm=<n>");
607  hidden_args.emplace_back("-zmqpubhashtxhwm=<n>");
608  hidden_args.emplace_back("-zmqpubrawblockhwm=<n>");
609  hidden_args.emplace_back("-zmqpubrawtxhwm=<n>");
610  hidden_args.emplace_back("-zmqpubsequencehwm=<n>");
611 #endif
612 
613  argsman.AddArg("-checkblocks=<n>", strprintf("How many blocks to check at startup (default: %u, 0 = all)", DEFAULT_CHECKBLOCKS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
614  argsman.AddArg("-checklevel=<n>", strprintf("How thorough the block verification of -checkblocks is: %s (0-4, default: %u)", Join(CHECKLEVEL_DOC, ", "), DEFAULT_CHECKLEVEL), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
615  argsman.AddArg("-checkblockindex", strprintf("Do a consistency check for the block tree, chainstate, and other validation data structures every <n> operations. Use 0 to disable. (default: %u, regtest: %u)", defaultChainParams->DefaultConsistencyChecks(), regtestChainParams->DefaultConsistencyChecks()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
616  argsman.AddArg("-checkaddrman=<n>", strprintf("Run addrman consistency checks every <n> operations. Use 0 to disable. (default: %u)", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
617  argsman.AddArg("-checkmempool=<n>", strprintf("Run mempool consistency checks every <n> transactions. Use 0 to disable. (default: %u, regtest: %u)", defaultChainParams->DefaultConsistencyChecks(), regtestChainParams->DefaultConsistencyChecks()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
618  argsman.AddArg("-checkpoints", strprintf("Enable rejection of any forks from the known historical chain until block %s (default: %u)", defaultChainParams->Checkpoints().GetHeight(), DEFAULT_CHECKPOINTS_ENABLED), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
619  argsman.AddArg("-deprecatedrpc=<method>", "Allows deprecated RPC method(s) to be used", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
620  argsman.AddArg("-stopafterblockimport", strprintf("Stop running after importing blocks from disk (default: %u)", DEFAULT_STOPAFTERBLOCKIMPORT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
621  argsman.AddArg("-stopatheight", strprintf("Stop running after reaching the given height in the main chain (default: %u)", DEFAULT_STOPATHEIGHT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
622  argsman.AddArg("-limitancestorcount=<n>", strprintf("Do not accept transactions if number of in-mempool ancestors is <n> or more (default: %u)", DEFAULT_ANCESTOR_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
623  argsman.AddArg("-limitancestorsize=<n>", strprintf("Do not accept transactions whose size with all in-mempool ancestors exceeds <n> kilobytes (default: %u)", DEFAULT_ANCESTOR_SIZE_LIMIT_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
624  argsman.AddArg("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
625  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_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
626  argsman.AddArg("-test=<option>", "Pass a test-only option. Options include : " + Join(TEST_OPTIONS_DOC, ", ") + ".", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
627  argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
628  argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
629  argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_VALIDATION_CACHE_BYTES >> 20), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
630  argsman.AddArg("-maxtipage=<n>",
631  strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)",
632  Ticks<std::chrono::seconds>(DEFAULT_MAX_TIP_AGE)),
634  argsman.AddArg("-printpriority", strprintf("Log transaction fee rate in " + CURRENCY_UNIT + "/kvB when mining blocks (default: %u)", DEFAULT_PRINT_MODIFIED_FEE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
635  argsman.AddArg("-uacomment=<cmt>", "Append comment to the user agent string", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
636 
638 
639  argsman.AddArg("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (test networks only; default: %u)", DEFAULT_ACCEPT_NON_STD_TXN), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
640  argsman.AddArg("-incrementalrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define cost of relay, used for mempool limiting and replacement policy. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_INCREMENTAL_RELAY_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
641  argsman.AddArg("-dustrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define dust, the value of an output such that it will cost more than its value in fees at this fee rate to spend it. (default: %s)", CURRENCY_UNIT, FormatMoney(DUST_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
642  argsman.AddArg("-acceptstalefeeestimates", strprintf("Read fee estimates even if they are stale (%sdefault: %u) fee estimates are considered stale if they are %s hours old", "regtest only; ", DEFAULT_ACCEPT_STALE_FEE_ESTIMATES, Ticks<std::chrono::hours>(MAX_FILE_AGE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
643  argsman.AddArg("-bytespersigop", strprintf("Equivalent bytes per sigop in transactions for relay and mining (default: %u)", DEFAULT_BYTES_PER_SIGOP), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
644  argsman.AddArg("-datacarrier", strprintf("Relay and mine data carrier transactions (default: %u)", DEFAULT_ACCEPT_DATACARRIER), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
645  argsman.AddArg("-datacarriersize",
646  strprintf("Relay and mine transactions whose data-carrying raw scriptPubKey "
647  "is of this size or less (default: %u)",
650  argsman.AddArg("-mempoolfullrbf", strprintf("(DEPRECATED) Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
651  argsman.AddArg("-permitbaremultisig", strprintf("Relay transactions creating non-P2SH multisig outputs (default: %u)", DEFAULT_PERMIT_BAREMULTISIG), ArgsManager::ALLOW_ANY,
653  argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
655  argsman.AddArg("-whitelistforcerelay", strprintf("Add 'forcerelay' permission to whitelisted peers with default permissions. This will relay transactions even if the transactions were already in the mempool. (default: %d)", DEFAULT_WHITELISTFORCERELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
656  argsman.AddArg("-whitelistrelay", strprintf("Add 'relay' permission to whitelisted peers with default permissions. This will accept relayed transactions even when not relaying transactions (default: %d)", DEFAULT_WHITELISTRELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
657 
658 
659  argsman.AddArg("-blockmaxweight=<n>", strprintf("Set maximum BIP141 block weight (default: %d)", DEFAULT_BLOCK_MAX_WEIGHT), ArgsManager::ALLOW_ANY, OptionsCategory::BLOCK_CREATION);
660  argsman.AddArg("-blockmintxfee=<amt>", strprintf("Set lowest fee rate (in %s/kvB) for transactions to be included in block creation. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_BLOCK_MIN_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::BLOCK_CREATION);
661  argsman.AddArg("-blockversion=<n>", "Override block version to test forking scenarios", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::BLOCK_CREATION);
662 
663  argsman.AddArg("-rest", strprintf("Accept public REST requests (default: %u)", DEFAULT_REST_ENABLE), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
664  argsman.AddArg("-rpcallowip=<ip>", "Allow JSON-RPC connections from specified source. Valid values for <ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0), a network/CIDR (e.g. 1.2.3.4/24), all ipv4 (0.0.0.0/0), or all ipv6 (::/0). This option can be specified multiple times", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
665  argsman.AddArg("-rpcauth=<userpw>", "Username and HMAC-SHA-256 hashed password for JSON-RPC connections. The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A canonical python script is included in share/rpcauth. The client then connects normally using the rpcuser=<USERNAME>/rpcpassword=<PASSWORD> pair of arguments. This option can be specified multiple times", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
666  argsman.AddArg("-rpcbind=<addr>[:port]", "Bind to given address to listen for JSON-RPC connections. Do not expose the RPC server to untrusted networks such as the public internet! This option is ignored unless -rpcallowip is also passed. Port is optional and overrides -rpcport. Use [host]:port notation for IPv6. This option can be specified multiple times (default: 127.0.0.1 and ::1 i.e., localhost)", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::RPC);
667  argsman.AddArg("-rpcdoccheck", strprintf("Throw a non-fatal error at runtime if the documentation for an RPC is incorrect (default: %u)", DEFAULT_RPC_DOC_CHECK), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
668  argsman.AddArg("-rpccookiefile=<loc>", "Location of the auth cookie. Relative paths will be prefixed by a net-specific datadir location. (default: data dir)", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
669  argsman.AddArg("-rpccookieperms=<readable-by>", strprintf("Set permissions on the RPC auth cookie file so that it is readable by [owner|group|all] (default: owner [via umask 0077])"), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
670  argsman.AddArg("-rpcpassword=<pw>", "Password for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
671  argsman.AddArg("-rpcport=<port>", strprintf("Listen for JSON-RPC connections on <port> (default: %u, testnet3: %u, testnet4: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), testnet4BaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::RPC);
672  argsman.AddArg("-rpcservertimeout=<n>", strprintf("Timeout during HTTP requests (default: %d)", DEFAULT_HTTP_SERVER_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
673  argsman.AddArg("-rpcthreads=<n>", strprintf("Set the number of threads to service RPC calls (default: %d)", DEFAULT_HTTP_THREADS), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
674  argsman.AddArg("-rpcuser=<user>", "Username for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
675  argsman.AddArg("-rpcwhitelist=<whitelist>", "Set a whitelist to filter incoming RPC calls for a specific user. The field <whitelist> comes in the format: <USERNAME>:<rpc 1>,<rpc 2>,...,<rpc n>. If multiple whitelists are set for a given user, they are set-intersected. See -rpcwhitelistdefault documentation for information on default whitelist behavior.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
676  argsman.AddArg("-rpcwhitelistdefault", "Sets default behavior for rpc whitelisting. Unless rpcwhitelistdefault is set to 0, if any -rpcwhitelist is set, the rpc server acts as if all rpc users are subject to empty-unless-otherwise-specified whitelists. If rpcwhitelistdefault is set to 1 and no -rpcwhitelist is set, rpc server acts as if all rpc users are subject to empty whitelists.", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
677  argsman.AddArg("-rpcworkqueue=<n>", strprintf("Set the depth of the work queue to service RPC calls (default: %d)", DEFAULT_HTTP_WORKQUEUE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
678  argsman.AddArg("-server", "Accept command line and JSON-RPC commands", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
679 
680 #if HAVE_DECL_FORK
681  argsman.AddArg("-daemon", strprintf("Run in the background as a daemon and accept commands (default: %d)", DEFAULT_DAEMON), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
682  argsman.AddArg("-daemonwait", strprintf("Wait for initialization to be finished before exiting. This implies -daemon (default: %d)", DEFAULT_DAEMONWAIT), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
683 #else
684  hidden_args.emplace_back("-daemon");
685  hidden_args.emplace_back("-daemonwait");
686 #endif
687 
688  // Add the hidden options
689  argsman.AddHiddenArgs(hidden_args);
690 }
691 
692 static bool fHaveGenesis = false;
694 static std::condition_variable g_genesis_wait_cv;
695 
696 static void BlockNotifyGenesisWait(const CBlockIndex* pBlockIndex)
697 {
698  if (pBlockIndex != nullptr) {
699  {
701  fHaveGenesis = true;
702  }
703  g_genesis_wait_cv.notify_all();
704  }
705 }
706 
707 #if HAVE_SYSTEM
708 static void StartupNotify(const ArgsManager& args)
709 {
710  std::string cmd = args.GetArg("-startupnotify", "");
711  if (!cmd.empty()) {
712  std::thread t(runCommand, cmd);
713  t.detach(); // thread runs free
714  }
715 }
716 #endif
717 
719 {
720  const ArgsManager& args = *Assert(node.args);
723  if (!InitHTTPServer(*Assert(node.shutdown))) {
724  return false;
725  }
726  StartRPC();
727  node.rpc_interruption_point = RpcInterruptionPoint;
728  if (!StartHTTPRPC(&node))
729  return false;
731  StartHTTPServer();
732  return true;
733 }
734 
735 // Parameter interaction based on rules
737 {
738  // when specifying an explicit binding address, you want to listen on it
739  // even when -connect or -proxy is specified
740  if (args.IsArgSet("-bind")) {
741  if (args.SoftSetBoolArg("-listen", true))
742  LogInfo("parameter interaction: -bind set -> setting -listen=1\n");
743  }
744  if (args.IsArgSet("-whitebind")) {
745  if (args.SoftSetBoolArg("-listen", true))
746  LogInfo("parameter interaction: -whitebind set -> setting -listen=1\n");
747  }
748 
749  if (args.IsArgSet("-connect") || args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS) <= 0) {
750  // when only connecting to trusted nodes, do not seed via DNS, or listen by default
751  if (args.SoftSetBoolArg("-dnsseed", false))
752  LogInfo("parameter interaction: -connect or -maxconnections=0 set -> setting -dnsseed=0\n");
753  if (args.SoftSetBoolArg("-listen", false))
754  LogInfo("parameter interaction: -connect or -maxconnections=0 set -> setting -listen=0\n");
755  }
756 
757  std::string proxy_arg = args.GetArg("-proxy", "");
758  if (proxy_arg != "" && proxy_arg != "0") {
759  // to protect privacy, do not listen by default if a default proxy server is specified
760  if (args.SoftSetBoolArg("-listen", false))
761  LogInfo("parameter interaction: -proxy set -> setting -listen=0\n");
762  // to protect privacy, do not map ports when a proxy is set. The user may still specify -listen=1
763  // to listen locally, so don't rely on this happening through -listen below.
764  if (args.SoftSetBoolArg("-upnp", false))
765  LogInfo("parameter interaction: -proxy set -> setting -upnp=0\n");
766  if (args.SoftSetBoolArg("-natpmp", false)) {
767  LogInfo("parameter interaction: -proxy set -> setting -natpmp=0\n");
768  }
769  // to protect privacy, do not discover addresses by default
770  if (args.SoftSetBoolArg("-discover", false))
771  LogInfo("parameter interaction: -proxy set -> setting -discover=0\n");
772  }
773 
774  if (!args.GetBoolArg("-listen", DEFAULT_LISTEN)) {
775  // do not map ports or try to retrieve public IP when not listening (pointless)
776  if (args.SoftSetBoolArg("-upnp", false))
777  LogInfo("parameter interaction: -listen=0 -> setting -upnp=0\n");
778  if (args.SoftSetBoolArg("-natpmp", false)) {
779  LogInfo("parameter interaction: -listen=0 -> setting -natpmp=0\n");
780  }
781  if (args.SoftSetBoolArg("-discover", false))
782  LogInfo("parameter interaction: -listen=0 -> setting -discover=0\n");
783  if (args.SoftSetBoolArg("-listenonion", false))
784  LogInfo("parameter interaction: -listen=0 -> setting -listenonion=0\n");
785  if (args.SoftSetBoolArg("-i2pacceptincoming", false)) {
786  LogInfo("parameter interaction: -listen=0 -> setting -i2pacceptincoming=0\n");
787  }
788  }
789 
790  if (args.IsArgSet("-externalip")) {
791  // if an explicit public IP is specified, do not try to find others
792  if (args.SoftSetBoolArg("-discover", false))
793  LogInfo("parameter interaction: -externalip set -> setting -discover=0\n");
794  }
795 
796  if (args.GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY)) {
797  // disable whitelistrelay in blocksonly mode
798  if (args.SoftSetBoolArg("-whitelistrelay", false))
799  LogInfo("parameter interaction: -blocksonly=1 -> setting -whitelistrelay=0\n");
800  // Reduce default mempool size in blocksonly mode to avoid unexpected resource usage
802  LogInfo("parameter interaction: -blocksonly=1 -> setting -maxmempool=%d\n", DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB);
803  }
804 
805  // Forcing relay from whitelisted hosts implies we will accept relays from them in the first place.
806  if (args.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY)) {
807  if (args.SoftSetBoolArg("-whitelistrelay", true))
808  LogInfo("parameter interaction: -whitelistforcerelay=1 -> setting -whitelistrelay=1\n");
809  }
810  if (args.IsArgSet("-onlynet")) {
811  const auto onlynets = args.GetArgs("-onlynet");
812  bool clearnet_reachable = std::any_of(onlynets.begin(), onlynets.end(), [](const auto& net) {
813  const auto n = ParseNetwork(net);
814  return n == NET_IPV4 || n == NET_IPV6;
815  });
816  if (!clearnet_reachable && args.SoftSetBoolArg("-dnsseed", false)) {
817  LogInfo("parameter interaction: -onlynet excludes IPv4 and IPv6 -> setting -dnsseed=0\n");
818  }
819  }
820 }
821 
829 {
832 }
833 
834 namespace { // Variables internal to initialization process only
835 
836 int nMaxConnections;
837 int nUserMaxConnections;
838 int nFD;
840 int64_t peer_connect_timeout;
841 std::set<BlockFilterType> g_enabled_filter_types;
842 
843 } // namespace
844 
845 [[noreturn]] static void new_handler_terminate()
846 {
847  // Rather than throwing std::bad-alloc if allocation fails, terminate
848  // immediately to (try to) avoid chain corruption.
849  // Since logging may itself allocate memory, set the handler directly
850  // to terminate first.
851  std::set_new_handler(std::terminate);
852  LogError("Out of memory. Terminating.\n");
853 
854  // The log was successful, terminate now.
855  std::terminate();
856 };
857 
858 bool AppInitBasicSetup(const ArgsManager& args, std::atomic<int>& exit_status)
859 {
860  // ********************************************************* Step 1: setup
861 #ifdef _MSC_VER
862  // Turn off Microsoft heap dump noise
863  _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
864  _CrtSetReportFile(_CRT_WARN, CreateFileA("NUL", GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, 0));
865  // Disable confusing "helpful" text message on abort, Ctrl-C
866  _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
867 #endif
868 #ifdef WIN32
869  // Enable heap terminate-on-corruption
870  HeapSetInformation(nullptr, HeapEnableTerminationOnCorruption, nullptr, 0);
871 #endif
872  if (!SetupNetworking()) {
873  return InitError(Untranslated("Initializing networking failed."));
874  }
875 
876 #ifndef WIN32
877  // Clean shutdown on SIGTERM
880 
881  // Reopen debug.log on SIGHUP
883 
884  // Ignore SIGPIPE, otherwise it will bring the daemon down if the client closes unexpectedly
885  signal(SIGPIPE, SIG_IGN);
886 #else
887  SetConsoleCtrlHandler(consoleCtrlHandler, true);
888 #endif
889 
890  std::set_new_handler(new_handler_terminate);
891 
892  return true;
893 }
894 
896 {
897  const CChainParams& chainparams = Params();
898  // ********************************************************* Step 2: parameter interactions
899 
900  // also see: InitParameterInteraction()
901 
902  // Error if network-specific options (-addnode, -connect, etc) are
903  // specified in default section of config file, but not overridden
904  // on the command line or in this chain's section of the config file.
905  ChainType chain = args.GetChainType();
906  if (chain == ChainType::SIGNET) {
907  LogPrintf("Signet derived magic (message start): %s\n", HexStr(chainparams.MessageStart()));
908  }
909  bilingual_str errors;
910  for (const auto& arg : args.GetUnsuitableSectionOnlyArgs()) {
911  errors += strprintf(_("Config setting for %s only applied on %s network when in [%s] section.") + Untranslated("\n"), arg, ChainTypeToString(chain), ChainTypeToString(chain));
912  }
913 
914  if (!errors.empty()) {
915  return InitError(errors);
916  }
917 
918  // Testnet3 deprecation warning
919  if (chain == ChainType::TESTNET) {
920  LogInfo("Warning: Support for testnet3 is deprecated and will be removed in an upcoming release. Consider switching to testnet4.\n");
921  }
922 
923  // Warn if unrecognized section name are present in the config file.
924  bilingual_str warnings;
925  for (const auto& section : args.GetUnrecognizedSections()) {
926  warnings += strprintf(Untranslated("%s:%i ") + _("Section [%s] is not recognized.") + Untranslated("\n"), section.m_file, section.m_line, section.m_name);
927  }
928 
929  if (!warnings.empty()) {
930  InitWarning(warnings);
931  }
932 
933  if (!fs::is_directory(args.GetBlocksDirPath())) {
934  return InitError(strprintf(_("Specified blocks directory \"%s\" does not exist."), args.GetArg("-blocksdir", "")));
935  }
936 
937  // parse and validate enabled filter types
938  std::string blockfilterindex_value = args.GetArg("-blockfilterindex", DEFAULT_BLOCKFILTERINDEX);
939  if (blockfilterindex_value == "" || blockfilterindex_value == "1") {
940  g_enabled_filter_types = AllBlockFilterTypes();
941  } else if (blockfilterindex_value != "0") {
942  const std::vector<std::string> names = args.GetArgs("-blockfilterindex");
943  for (const auto& name : names) {
944  BlockFilterType filter_type;
945  if (!BlockFilterTypeByName(name, filter_type)) {
946  return InitError(strprintf(_("Unknown -blockfilterindex value %s."), name));
947  }
948  g_enabled_filter_types.insert(filter_type);
949  }
950  }
951 
952  // Signal NODE_P2P_V2 if BIP324 v2 transport is enabled.
953  if (args.GetBoolArg("-v2transport", DEFAULT_V2_TRANSPORT)) {
954  nLocalServices = ServiceFlags(nLocalServices | NODE_P2P_V2);
955  }
956 
957  // Signal NODE_COMPACT_FILTERS if peerblockfilters and basic filters index are both enabled.
958  if (args.GetBoolArg("-peerblockfilters", DEFAULT_PEERBLOCKFILTERS)) {
959  if (g_enabled_filter_types.count(BlockFilterType::BASIC) != 1) {
960  return InitError(_("Cannot set -peerblockfilters without -blockfilterindex."));
961  }
962 
963  nLocalServices = ServiceFlags(nLocalServices | NODE_COMPACT_FILTERS);
964  }
965 
966  if (args.GetIntArg("-prune", 0)) {
967  if (args.GetBoolArg("-txindex", DEFAULT_TXINDEX))
968  return InitError(_("Prune mode is incompatible with -txindex."));
969  if (args.GetBoolArg("-reindex-chainstate", false)) {
970  return InitError(_("Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead."));
971  }
972  }
973 
974  // If -forcednsseed is set to true, ensure -dnsseed has not been set to false
975  if (args.GetBoolArg("-forcednsseed", DEFAULT_FORCEDNSSEED) && !args.GetBoolArg("-dnsseed", DEFAULT_DNSSEED)){
976  return InitError(_("Cannot set -forcednsseed to true when setting -dnsseed to false."));
977  }
978 
979  // -bind and -whitebind can't be set when not listening
980  size_t nUserBind = args.GetArgs("-bind").size() + args.GetArgs("-whitebind").size();
981  if (nUserBind != 0 && !args.GetBoolArg("-listen", DEFAULT_LISTEN)) {
982  return InitError(Untranslated("Cannot set -bind or -whitebind together with -listen=0"));
983  }
984 
985  // if listen=0, then disallow listenonion=1
986  if (!args.GetBoolArg("-listen", DEFAULT_LISTEN) && args.GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION)) {
987  return InitError(Untranslated("Cannot set -listen=0 together with -listenonion=1"));
988  }
989 
990  // Make sure enough file descriptors are available
991  int nBind = std::max(nUserBind, size_t(1));
992  nUserMaxConnections = args.GetIntArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
993  nMaxConnections = std::max(nUserMaxConnections, 0);
994 
996 
997 #ifdef USE_POLL
998  int fd_max = nFD;
999 #else
1000  int fd_max = FD_SETSIZE;
1001 #endif
1002  // Trim requested connection counts, to fit into system limitations
1003  // <int> in std::min<int>(...) to work around FreeBSD compilation issue described in #2695
1004  nMaxConnections = std::max(std::min<int>(nMaxConnections, fd_max - nBind - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE), 0);
1005  if (nFD < MIN_CORE_FILEDESCRIPTORS)
1006  return InitError(_("Not enough file descriptors available."));
1007  nMaxConnections = std::min(nFD - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS - NUM_FDS_MESSAGE_CAPTURE, nMaxConnections);
1008 
1009  if (nMaxConnections < nUserMaxConnections)
1010  InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
1011 
1012  // ********************************************************* Step 3: parameter-to-internal-flags
1013  if (auto result{init::SetLoggingCategories(args)}; !result) return InitError(util::ErrorString(result));
1014  if (auto result{init::SetLoggingLevel(args)}; !result) return InitError(util::ErrorString(result));
1015 
1017  if (nConnectTimeout <= 0) {
1019  }
1020 
1021  peer_connect_timeout = args.GetIntArg("-peertimeout", DEFAULT_PEER_CONNECT_TIMEOUT);
1022  if (peer_connect_timeout <= 0) {
1023  return InitError(Untranslated("peertimeout must be a positive integer."));
1024  }
1025 
1026  // Sanity check argument for min fee for including tx in block
1027  // TODO: Harmonize which arguments need sanity checking and where that happens
1028  if (args.IsArgSet("-blockmintxfee")) {
1029  if (!ParseMoney(args.GetArg("-blockmintxfee", ""))) {
1030  return InitError(AmountErrMsg("blockmintxfee", args.GetArg("-blockmintxfee", "")));
1031  }
1032  }
1033 
1034  nBytesPerSigOp = args.GetIntArg("-bytespersigop", nBytesPerSigOp);
1035 
1036  if (!g_wallet_init_interface.ParameterInteraction()) return false;
1037 
1038  // Option to startup with mocktime set (used for regression testing):
1039  SetMockTime(args.GetIntArg("-mocktime", 0)); // SetMockTime(0) is a no-op
1040 
1041  if (args.GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
1042  nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
1043 
1044  if (args.IsArgSet("-test")) {
1045  if (chainparams.GetChainType() != ChainType::REGTEST) {
1046  return InitError(Untranslated("-test=<option> can only be used with regtest"));
1047  }
1048  const std::vector<std::string> options = args.GetArgs("-test");
1049  for (const std::string& option : options) {
1050  auto it = std::find_if(TEST_OPTIONS_DOC.begin(), TEST_OPTIONS_DOC.end(), [&option](const std::string& doc_option) {
1051  size_t pos = doc_option.find(" (");
1052  return (pos != std::string::npos) && (doc_option.substr(0, pos) == option);
1053  });
1054  if (it == TEST_OPTIONS_DOC.end()) {
1055  InitWarning(strprintf(_("Unrecognised option \"%s\" provided in -test=<option>."), option));
1056  }
1057  }
1058  }
1059 
1060  // Also report errors from parsing before daemonization
1061  {
1062  kernel::Notifications notifications{};
1063  ChainstateManager::Options chainman_opts_dummy{
1064  .chainparams = chainparams,
1065  .datadir = args.GetDataDirNet(),
1066  .notifications = notifications,
1067  };
1068  auto chainman_result{ApplyArgsManOptions(args, chainman_opts_dummy)};
1069  if (!chainman_result) {
1070  return InitError(util::ErrorString(chainman_result));
1071  }
1072  BlockManager::Options blockman_opts_dummy{
1073  .chainparams = chainman_opts_dummy.chainparams,
1074  .blocks_dir = args.GetBlocksDirPath(),
1075  .notifications = chainman_opts_dummy.notifications,
1076  };
1077  auto blockman_result{ApplyArgsManOptions(args, blockman_opts_dummy)};
1078  if (!blockman_result) {
1079  return InitError(util::ErrorString(blockman_result));
1080  }
1081  }
1082 
1083  return true;
1084 }
1085 
1086 static bool LockDataDirectory(bool probeOnly)
1087 {
1088  // Make sure only a single Bitcoin process is using the data directory.
1089  const fs::path& datadir = gArgs.GetDataDirNet();
1090  switch (util::LockDirectory(datadir, ".lock", probeOnly)) {
1092  return InitError(strprintf(_("Cannot write to data directory '%s'; check permissions."), fs::PathToString(datadir)));
1094  return InitError(strprintf(_("Cannot obtain a lock on data directory %s. %s is probably already running."), fs::PathToString(datadir), PACKAGE_NAME));
1095  case util::LockResult::Success: return true;
1096  } // no default case, so the compiler can warn about missing cases
1097  assert(false);
1098 }
1099 
1101 {
1102  // ********************************************************* Step 4: sanity checks
1103  auto result{kernel::SanityChecks(kernel)};
1104  if (!result) {
1105  InitError(util::ErrorString(result));
1106  return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
1107  }
1108 
1109  if (!ECC_InitSanityCheck()) {
1110  return InitError(strprintf(_("Elliptic curve cryptography sanity check failure. %s is shutting down."), PACKAGE_NAME));
1111  }
1112 
1113  // Probe the data directory lock to give an early error message, if possible
1114  // We cannot hold the data directory lock here, as the forking for daemon() hasn't yet happened,
1115  // and a fork will cause weird behavior to it.
1116  return LockDataDirectory(true);
1117 }
1118 
1120 {
1121  // After daemonization get the data directory lock again and hold on to it until exit
1122  // This creates a slight window for a race condition to happen, however this condition is harmless: it
1123  // will at most make us exit without printing a message to console.
1124  if (!LockDataDirectory(false)) {
1125  // Detailed error printed inside LockDataDirectory
1126  return false;
1127  }
1128  return true;
1129 }
1130 
1132 {
1133  node.chain = node.init->makeChain();
1134  node.mining = node.init->makeMining();
1135  return true;
1136 }
1137 
1139 {
1140  const ArgsManager& args = *Assert(node.args);
1141  const CChainParams& chainparams = Params();
1142 
1143  auto opt_max_upload = ParseByteUnits(args.GetArg("-maxuploadtarget", DEFAULT_MAX_UPLOAD_TARGET), ByteUnit::M);
1144  if (!opt_max_upload) {
1145  return InitError(strprintf(_("Unable to parse -maxuploadtarget: '%s'"), args.GetArg("-maxuploadtarget", "")));
1146  }
1147 
1148  // ********************************************************* Step 4a: application initialization
1149  if (!CreatePidFile(args)) {
1150  // Detailed error printed inside CreatePidFile().
1151  return false;
1152  }
1153  if (!init::StartLogging(args)) {
1154  // Detailed error printed inside StartLogging().
1155  return false;
1156  }
1157 
1158  LogPrintf("Using at most %i automatic connections (%i file descriptors available)\n", nMaxConnections, nFD);
1159 
1160  // Warn about relative -datadir path.
1161  if (args.IsArgSet("-datadir") && !args.GetPathArg("-datadir").is_absolute()) {
1162  LogPrintf("Warning: relative datadir option '%s' specified, which will be interpreted relative to the "
1163  "current working directory '%s'. This is fragile, because if bitcoin is started in the future "
1164  "from a different location, it will be unable to locate the current data files. There could "
1165  "also be data loss if bitcoin is started while in a temporary directory.\n",
1166  args.GetArg("-datadir", ""), fs::PathToString(fs::current_path()));
1167  }
1168 
1169  assert(!node.scheduler);
1170  node.scheduler = std::make_unique<CScheduler>();
1171  auto& scheduler = *node.scheduler;
1172 
1173  // Start the lightweight task scheduler thread
1174  scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
1175 
1176  // Gather some entropy once per minute.
1177  scheduler.scheduleEvery([]{
1178  RandAddPeriodic();
1179  }, std::chrono::minutes{1});
1180 
1181  // Check disk space every 5 minutes to avoid db corruption.
1182  scheduler.scheduleEvery([&args, &node]{
1183  constexpr uint64_t min_disk_space = 50 << 20; // 50 MB
1184  if (!CheckDiskSpace(args.GetBlocksDirPath(), min_disk_space)) {
1185  LogError("Shutting down due to lack of disk space!\n");
1186  if (!(*Assert(node.shutdown))()) {
1187  LogError("Failed to send shutdown signal after disk space check\n");
1188  }
1189  }
1190  }, std::chrono::minutes{5});
1191 
1192  assert(!node.validation_signals);
1193  node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(scheduler));
1194  auto& validation_signals = *node.validation_signals;
1195 
1196  // Create client interfaces for wallets that are supposed to be loaded
1197  // according to -wallet and -disablewallet options. This only constructs
1198  // the interfaces, it doesn't load wallet data. Wallets actually get loaded
1199  // when load() and start() interface methods are called below.
1201  uiInterface.InitWallet();
1202 
1203  /* Register RPC commands regardless of -server setting so they will be
1204  * available in the GUI RPC console even if external calls are disabled.
1205  */
1207  for (const auto& client : node.chain_clients) {
1208  client->registerRpcs();
1209  }
1210 #ifdef ENABLE_ZMQ
1212 #endif
1213 
1214  /* Start the RPC server already. It will be started in "warmup" mode
1215  * and not really process calls already (but it will signify connections
1216  * that the server is there and will be ready later). Warmup mode will
1217  * be disabled when initialisation is finished.
1218  */
1219  if (args.GetBoolArg("-server", false)) {
1220  uiInterface.InitMessage_connect(SetRPCWarmupStatus);
1221  if (!AppInitServers(node))
1222  return InitError(_("Unable to start HTTP server. See debug log for details."));
1223  }
1224 
1225  // ********************************************************* Step 5: verify wallet database integrity
1226  for (const auto& client : node.chain_clients) {
1227  if (!client->verify()) {
1228  return false;
1229  }
1230  }
1231 
1232  // ********************************************************* Step 6: network initialization
1233  // Note that we absolutely cannot open any actual connections
1234  // until the very end ("start node") as the UTXO/block state
1235  // is not yet setup and may end up being set up twice if we
1236  // need to reindex later.
1237 
1238  fListen = args.GetBoolArg("-listen", DEFAULT_LISTEN);
1239  fDiscover = args.GetBoolArg("-discover", true);
1240 
1241  PeerManager::Options peerman_opts{};
1242  ApplyArgsManOptions(args, peerman_opts);
1243 
1244  {
1245 
1246  // Read asmap file if configured
1247  std::vector<bool> asmap;
1248  if (args.IsArgSet("-asmap")) {
1249  fs::path asmap_path = args.GetPathArg("-asmap", DEFAULT_ASMAP_FILENAME);
1250  if (!asmap_path.is_absolute()) {
1251  asmap_path = args.GetDataDirNet() / asmap_path;
1252  }
1253  if (!fs::exists(asmap_path)) {
1254  InitError(strprintf(_("Could not find asmap file %s"), fs::quoted(fs::PathToString(asmap_path))));
1255  return false;
1256  }
1257  asmap = DecodeAsmap(asmap_path);
1258  if (asmap.size() == 0) {
1259  InitError(strprintf(_("Could not parse asmap file %s"), fs::quoted(fs::PathToString(asmap_path))));
1260  return false;
1261  }
1262  const uint256 asmap_version = (HashWriter{} << asmap).GetHash();
1263  LogPrintf("Using asmap version %s for IP bucketing\n", asmap_version.ToString());
1264  } else {
1265  LogPrintf("Using /16 prefix for IP bucketing\n");
1266  }
1267 
1268  // Initialize netgroup manager
1269  assert(!node.netgroupman);
1270  node.netgroupman = std::make_unique<NetGroupManager>(std::move(asmap));
1271 
1272  // Initialize addrman
1273  assert(!node.addrman);
1274  uiInterface.InitMessage(_("Loading P2P addresses…").translated);
1275  auto addrman{LoadAddrman(*node.netgroupman, args)};
1276  if (!addrman) return InitError(util::ErrorString(addrman));
1277  node.addrman = std::move(*addrman);
1278  }
1279 
1280  FastRandomContext rng;
1281  assert(!node.banman);
1282  node.banman = std::make_unique<BanMan>(args.GetDataDirNet() / "banlist", &uiInterface, args.GetIntArg("-bantime", DEFAULT_MISBEHAVING_BANTIME));
1283  assert(!node.connman);
1284  node.connman = std::make_unique<CConnman>(rng.rand64(),
1285  rng.rand64(),
1286  *node.addrman, *node.netgroupman, chainparams, args.GetBoolArg("-networkactive", true));
1287 
1288  assert(!node.fee_estimator);
1289  // Don't initialize fee estimation with old data if we don't relay transactions,
1290  // as they would never get updated.
1291  if (!peerman_opts.ignore_incoming_txs) {
1292  bool read_stale_estimates = args.GetBoolArg("-acceptstalefeeestimates", DEFAULT_ACCEPT_STALE_FEE_ESTIMATES);
1293  if (read_stale_estimates && (chainparams.GetChainType() != ChainType::REGTEST)) {
1294  return InitError(strprintf(_("acceptstalefeeestimates is not supported on %s chain."), chainparams.GetChainTypeString()));
1295  }
1296  node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(args), read_stale_estimates);
1297 
1298  // Flush estimates to disk periodically
1299  CBlockPolicyEstimator* fee_estimator = node.fee_estimator.get();
1300  scheduler.scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
1301  validation_signals.RegisterValidationInterface(fee_estimator);
1302  }
1303 
1304  // Check port numbers
1305  for (const std::string port_option : {
1306  "-port",
1307  "-rpcport",
1308  }) {
1309  if (args.IsArgSet(port_option)) {
1310  const std::string port = args.GetArg(port_option, "");
1311  uint16_t n;
1312  if (!ParseUInt16(port, &n) || n == 0) {
1313  return InitError(InvalidPortErrMsg(port_option, port));
1314  }
1315  }
1316  }
1317 
1318  for ([[maybe_unused]] const auto& [arg, unix] : std::vector<std::pair<std::string, bool>>{
1319  // arg name UNIX socket support
1320  {"-i2psam", false},
1321  {"-onion", true},
1322  {"-proxy", true},
1323  {"-rpcbind", false},
1324  {"-torcontrol", false},
1325  {"-whitebind", false},
1326  {"-zmqpubhashblock", true},
1327  {"-zmqpubhashtx", true},
1328  {"-zmqpubrawblock", true},
1329  {"-zmqpubrawtx", true},
1330  {"-zmqpubsequence", true},
1331  }) {
1332  for (const std::string& socket_addr : args.GetArgs(arg)) {
1333  std::string host_out;
1334  uint16_t port_out{0};
1335  if (!SplitHostPort(socket_addr, port_out, host_out)) {
1336 #ifdef HAVE_SOCKADDR_UN
1337  // Allow unix domain sockets for some options e.g. unix:/some/file/path
1338  if (!unix || socket_addr.find(ADDR_PREFIX_UNIX) != 0) {
1339  return InitError(InvalidPortErrMsg(arg, socket_addr));
1340  }
1341 #else
1342  return InitError(InvalidPortErrMsg(arg, socket_addr));
1343 #endif
1344  }
1345  }
1346  }
1347 
1348  for (const std::string& socket_addr : args.GetArgs("-bind")) {
1349  std::string host_out;
1350  uint16_t port_out{0};
1351  std::string bind_socket_addr = socket_addr.substr(0, socket_addr.rfind('='));
1352  if (!SplitHostPort(bind_socket_addr, port_out, host_out)) {
1353  return InitError(InvalidPortErrMsg("-bind", socket_addr));
1354  }
1355  }
1356 
1357  // sanitize comments per BIP-0014, format user agent and check total size
1358  std::vector<std::string> uacomments;
1359  for (const std::string& cmt : args.GetArgs("-uacomment")) {
1360  if (cmt != SanitizeString(cmt, SAFE_CHARS_UA_COMMENT))
1361  return InitError(strprintf(_("User Agent comment (%s) contains unsafe characters."), cmt));
1362  uacomments.push_back(cmt);
1363  }
1365  if (strSubVersion.size() > MAX_SUBVERSION_LENGTH) {
1366  return InitError(strprintf(_("Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments."),
1368  }
1369 
1370  if (args.IsArgSet("-onlynet")) {
1372  for (const std::string& snet : args.GetArgs("-onlynet")) {
1373  enum Network net = ParseNetwork(snet);
1374  if (net == NET_UNROUTABLE)
1375  return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet));
1376  g_reachable_nets.Add(net);
1377  }
1378  }
1379 
1380  if (!args.IsArgSet("-cjdnsreachable")) {
1381  if (args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_CJDNS)) {
1382  return InitError(
1383  _("Outbound connections restricted to CJDNS (-onlynet=cjdns) but "
1384  "-cjdnsreachable is not provided"));
1385  }
1387  }
1388  // Now g_reachable_nets.Contains(NET_CJDNS) is true if:
1389  // 1. -cjdnsreachable is given and
1390  // 2.1. -onlynet is not given or
1391  // 2.2. -onlynet=cjdns is given
1392 
1393  // Requesting DNS seeds entails connecting to IPv4/IPv6, which -onlynet options may prohibit:
1394  // If -dnsseed=1 is explicitly specified, abort. If it's left unspecified by the user, we skip
1395  // the DNS seeds by adjusting -dnsseed in InitParameterInteraction.
1396  if (args.GetBoolArg("-dnsseed") == true && !g_reachable_nets.Contains(NET_IPV4) && !g_reachable_nets.Contains(NET_IPV6)) {
1397  return InitError(strprintf(_("Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6")));
1398  };
1399 
1400  // Check for host lookup allowed before parsing any network related parameters
1402 
1403  Proxy onion_proxy;
1404 
1405  bool proxyRandomize = args.GetBoolArg("-proxyrandomize", DEFAULT_PROXYRANDOMIZE);
1406  // -proxy sets a proxy for all outgoing network traffic
1407  // -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default
1408  std::string proxyArg = args.GetArg("-proxy", "");
1409  if (proxyArg != "" && proxyArg != "0") {
1410  Proxy addrProxy;
1411  if (IsUnixSocketPath(proxyArg)) {
1412  addrProxy = Proxy(proxyArg, proxyRandomize);
1413  } else {
1414  const std::optional<CService> proxyAddr{Lookup(proxyArg, 9050, fNameLookup)};
1415  if (!proxyAddr.has_value()) {
1416  return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
1417  }
1418 
1419  addrProxy = Proxy(proxyAddr.value(), proxyRandomize);
1420  }
1421 
1422  if (!addrProxy.IsValid())
1423  return InitError(strprintf(_("Invalid -proxy address or hostname: '%s'"), proxyArg));
1424 
1425  SetProxy(NET_IPV4, addrProxy);
1426  SetProxy(NET_IPV6, addrProxy);
1427  SetProxy(NET_CJDNS, addrProxy);
1428  SetNameProxy(addrProxy);
1429  onion_proxy = addrProxy;
1430  }
1431 
1432  const bool onlynet_used_with_onion{args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_ONION)};
1433 
1434  // -onion can be used to set only a proxy for .onion, or override normal proxy for .onion addresses
1435  // -noonion (or -onion=0) disables connecting to .onion entirely
1436  // An empty string is used to not override the onion proxy (in which case it defaults to -proxy set above, or none)
1437  std::string onionArg = args.GetArg("-onion", "");
1438  if (onionArg != "") {
1439  if (onionArg == "0") { // Handle -noonion/-onion=0
1440  onion_proxy = Proxy{};
1441  if (onlynet_used_with_onion) {
1442  return InitError(
1443  _("Outbound connections restricted to Tor (-onlynet=onion) but the proxy for "
1444  "reaching the Tor network is explicitly forbidden: -onion=0"));
1445  }
1446  } else {
1447  if (IsUnixSocketPath(onionArg)) {
1448  onion_proxy = Proxy(onionArg, proxyRandomize);
1449  } else {
1450  const std::optional<CService> addr{Lookup(onionArg, 9050, fNameLookup)};
1451  if (!addr.has_value() || !addr->IsValid()) {
1452  return InitError(strprintf(_("Invalid -onion address or hostname: '%s'"), onionArg));
1453  }
1454 
1455  onion_proxy = Proxy(addr.value(), proxyRandomize);
1456  }
1457  }
1458  }
1459 
1460  if (onion_proxy.IsValid()) {
1461  SetProxy(NET_ONION, onion_proxy);
1462  } else {
1463  // If -listenonion is set, then we will (try to) connect to the Tor control port
1464  // later from the torcontrol thread and may retrieve the onion proxy from there.
1465  const bool listenonion_disabled{!args.GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION)};
1466  if (onlynet_used_with_onion && listenonion_disabled) {
1467  return InitError(
1468  _("Outbound connections restricted to Tor (-onlynet=onion) but the proxy for "
1469  "reaching the Tor network is not provided: none of -proxy, -onion or "
1470  "-listenonion is given"));
1471  }
1473  }
1474 
1475  for (const std::string& strAddr : args.GetArgs("-externalip")) {
1476  const std::optional<CService> addrLocal{Lookup(strAddr, GetListenPort(), fNameLookup)};
1477  if (addrLocal.has_value() && addrLocal->IsValid())
1478  AddLocal(addrLocal.value(), LOCAL_MANUAL);
1479  else
1480  return InitError(ResolveErrMsg("externalip", strAddr));
1481  }
1482 
1483 #ifdef ENABLE_ZMQ
1485  [&chainman = node.chainman](std::vector<uint8_t>& block, const CBlockIndex& index) {
1486  assert(chainman);
1487  return chainman->m_blockman.ReadRawBlockFromDisk(block, WITH_LOCK(cs_main, return index.GetBlockPos()));
1488  });
1489 
1491  validation_signals.RegisterValidationInterface(g_zmq_notification_interface.get());
1492  }
1493 #endif
1494 
1495  // ********************************************************* Step 7: load block chain
1496 
1497  node.notifications = std::make_unique<KernelNotifications>(*Assert(node.shutdown), node.exit_status, *Assert(node.warnings));
1498  ReadNotificationArgs(args, *node.notifications);
1499  ChainstateManager::Options chainman_opts{
1500  .chainparams = chainparams,
1501  .datadir = args.GetDataDirNet(),
1502  .notifications = *node.notifications,
1503  .signals = &validation_signals,
1504  };
1505  Assert(ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction
1506 
1507  BlockManager::Options blockman_opts{
1508  .chainparams = chainman_opts.chainparams,
1509  .blocks_dir = args.GetBlocksDirPath(),
1510  .notifications = chainman_opts.notifications,
1511  };
1512  Assert(ApplyArgsManOptions(args, blockman_opts)); // no error can happen, already checked in AppInitParameterInteraction
1513 
1514  // cache size calculations
1515  CacheSizes cache_sizes = CalculateCacheSizes(args, g_enabled_filter_types.size());
1516 
1517  LogPrintf("Cache configuration:\n");
1518  LogPrintf("* Using %.1f MiB for block index database\n", cache_sizes.block_tree_db * (1.0 / 1024 / 1024));
1519  if (args.GetBoolArg("-txindex", DEFAULT_TXINDEX)) {
1520  LogPrintf("* Using %.1f MiB for transaction index database\n", cache_sizes.tx_index * (1.0 / 1024 / 1024));
1521  }
1522  for (BlockFilterType filter_type : g_enabled_filter_types) {
1523  LogPrintf("* Using %.1f MiB for %s block filter index database\n",
1524  cache_sizes.filter_index * (1.0 / 1024 / 1024), BlockFilterTypeName(filter_type));
1525  }
1526  LogPrintf("* Using %.1f MiB for chain state database\n", cache_sizes.coins_db * (1.0 / 1024 / 1024));
1527 
1528  assert(!node.mempool);
1529  assert(!node.chainman);
1530 
1531  CTxMemPool::Options mempool_opts{
1532  .check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
1533  .signals = &validation_signals,
1534  };
1535  auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};
1536  if (!result) {
1537  return InitError(util::ErrorString(result));
1538  }
1539 
1540  bool do_reindex{args.GetBoolArg("-reindex", false)};
1541  const bool do_reindex_chainstate{args.GetBoolArg("-reindex-chainstate", false)};
1542 
1543  for (bool fLoaded = false; !fLoaded && !ShutdownRequested(node);) {
1544  bilingual_str mempool_error;
1545  node.mempool = std::make_unique<CTxMemPool>(mempool_opts, mempool_error);
1546  if (!mempool_error.empty()) {
1547  return InitError(mempool_error);
1548  }
1549  LogPrintf("* Using %.1f MiB for in-memory UTXO set (plus up to %.1f MiB of unused mempool space)\n", cache_sizes.coins * (1.0 / 1024 / 1024), mempool_opts.max_size_bytes * (1.0 / 1024 / 1024));
1550 
1551  try {
1552  node.chainman = std::make_unique<ChainstateManager>(*Assert(node.shutdown), chainman_opts, blockman_opts);
1553  } catch (std::exception& e) {
1554  return InitError(strprintf(Untranslated("Failed to initialize ChainstateManager: %s"), e.what()));
1555  }
1556  ChainstateManager& chainman = *node.chainman;
1557 
1558  // This is defined and set here instead of inline in validation.h to avoid a hard
1559  // dependency between validation and index/base, since the latter is not in
1560  // libbitcoinkernel.
1561  chainman.snapshot_download_completed = [&node]() {
1562  if (!node.chainman->m_blockman.IsPruneMode()) {
1563  LogPrintf("[snapshot] re-enabling NODE_NETWORK services\n");
1564  node.connman->AddLocalServices(NODE_NETWORK);
1565  }
1566 
1567  LogPrintf("[snapshot] restarting indexes\n");
1568 
1569  // Drain the validation interface queue to ensure that the old indexes
1570  // don't have any pending work.
1571  Assert(node.validation_signals)->SyncWithValidationInterfaceQueue();
1572 
1573  for (auto* index : node.indexes) {
1574  index->Interrupt();
1575  index->Stop();
1576  if (!(index->Init() && index->StartBackgroundSync())) {
1577  LogPrintf("[snapshot] WARNING failed to restart index %s on snapshot chain\n", index->GetName());
1578  }
1579  }
1580  };
1581 
1583  options.mempool = Assert(node.mempool.get());
1584  options.wipe_block_tree_db = do_reindex;
1585  options.wipe_chainstate_db = do_reindex || do_reindex_chainstate;
1586  options.prune = chainman.m_blockman.IsPruneMode();
1587  options.check_blocks = args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS);
1588  options.check_level = args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL);
1589  options.require_full_verification = args.IsArgSet("-checkblocks") || args.IsArgSet("-checklevel");
1590  options.coins_error_cb = [] {
1591  uiInterface.ThreadSafeMessageBox(
1592  _("Error reading from database, shutting down."),
1594  };
1595 
1596  uiInterface.InitMessage(_("Loading block index…").translated);
1597  const auto load_block_index_start_time{SteadyClock::now()};
1598  auto catch_exceptions = [](auto&& f) {
1599  try {
1600  return f();
1601  } catch (const std::exception& e) {
1602  LogError("%s\n", e.what());
1603  return std::make_tuple(node::ChainstateLoadStatus::FAILURE, _("Error opening block database"));
1604  }
1605  };
1606  auto [status, error] = catch_exceptions([&]{ return LoadChainstate(chainman, cache_sizes, options); });
1607  if (status == node::ChainstateLoadStatus::SUCCESS) {
1608  uiInterface.InitMessage(_("Verifying blocks…").translated);
1609  if (chainman.m_blockman.m_have_pruned && options.check_blocks > MIN_BLOCKS_TO_KEEP) {
1610  LogWarning("pruned datadir may not have more than %d blocks; only checking available blocks\n",
1612  }
1613  std::tie(status, error) = catch_exceptions([&]{ return VerifyLoadedChainstate(chainman, options);});
1614  if (status == node::ChainstateLoadStatus::SUCCESS) {
1615  fLoaded = true;
1616  LogPrintf(" block index %15dms\n", Ticks<std::chrono::milliseconds>(SteadyClock::now() - load_block_index_start_time));
1617  }
1618  }
1619 
1621  return InitError(error);
1622  }
1623 
1624  if (!fLoaded && !ShutdownRequested(node)) {
1625  // first suggest a reindex
1626  if (!do_reindex) {
1627  bool fRet = uiInterface.ThreadSafeQuestion(
1628  error + Untranslated(".\n\n") + _("Do you want to rebuild the block database now?"),
1629  error.original + ".\nPlease restart with -reindex or -reindex-chainstate to recover.",
1631  if (fRet) {
1632  do_reindex = true;
1633  if (!Assert(node.shutdown)->reset()) {
1634  LogError("Internal error: failed to reset shutdown signal.\n");
1635  }
1636  } else {
1637  LogError("Aborted block database rebuild. Exiting.\n");
1638  return false;
1639  }
1640  } else {
1641  return InitError(error);
1642  }
1643  }
1644  }
1645 
1646  // As LoadBlockIndex can take several minutes, it's possible the user
1647  // requested to kill the GUI during the last operation. If so, exit.
1648  // As the program has not fully started yet, Shutdown() is possibly overkill.
1649  if (ShutdownRequested(node)) {
1650  LogPrintf("Shutdown requested. Exiting.\n");
1651  return false;
1652  }
1653 
1654  ChainstateManager& chainman = *Assert(node.chainman);
1655 
1656  assert(!node.peerman);
1657  node.peerman = PeerManager::make(*node.connman, *node.addrman,
1658  node.banman.get(), chainman,
1659  *node.mempool, *node.warnings,
1660  peerman_opts);
1661  validation_signals.RegisterValidationInterface(node.peerman.get());
1662 
1663  // ********************************************************* Step 8: start indexers
1664 
1665  if (args.GetBoolArg("-txindex", DEFAULT_TXINDEX)) {
1666  g_txindex = std::make_unique<TxIndex>(interfaces::MakeChain(node), cache_sizes.tx_index, false, do_reindex);
1667  node.indexes.emplace_back(g_txindex.get());
1668  }
1669 
1670  for (const auto& filter_type : g_enabled_filter_types) {
1671  InitBlockFilterIndex([&]{ return interfaces::MakeChain(node); }, filter_type, cache_sizes.filter_index, false, do_reindex);
1672  node.indexes.emplace_back(GetBlockFilterIndex(filter_type));
1673  }
1674 
1675  if (args.GetBoolArg("-coinstatsindex", DEFAULT_COINSTATSINDEX)) {
1676  g_coin_stats_index = std::make_unique<CoinStatsIndex>(interfaces::MakeChain(node), /*cache_size=*/0, false, do_reindex);
1677  node.indexes.emplace_back(g_coin_stats_index.get());
1678  }
1679 
1680  // Init indexes
1681  for (auto index : node.indexes) if (!index->Init()) return false;
1682 
1683  // ********************************************************* Step 9: load wallet
1684  for (const auto& client : node.chain_clients) {
1685  if (!client->load()) {
1686  return false;
1687  }
1688  }
1689 
1690  // ********************************************************* Step 10: data directory maintenance
1691 
1692  // if pruning, perform the initial blockstore prune
1693  // after any wallet rescanning has taken place.
1694  if (chainman.m_blockman.IsPruneMode()) {
1695  if (chainman.m_blockman.m_blockfiles_indexed) {
1696  LOCK(cs_main);
1697  for (Chainstate* chainstate : chainman.GetAll()) {
1698  uiInterface.InitMessage(_("Pruning blockstore…").translated);
1699  chainstate->PruneAndFlush();
1700  }
1701  }
1702  } else {
1703  // Prior to setting NODE_NETWORK, check if we can provide historical blocks.
1704  if (!WITH_LOCK(chainman.GetMutex(), return chainman.BackgroundSyncInProgress())) {
1705  LogPrintf("Setting NODE_NETWORK on non-prune mode\n");
1706  nLocalServices = ServiceFlags(nLocalServices | NODE_NETWORK);
1707  } else {
1708  LogPrintf("Running node in NODE_NETWORK_LIMITED mode until snapshot background sync completes\n");
1709  }
1710  }
1711 
1712  // ********************************************************* Step 11: import blocks
1713 
1714  if (!CheckDiskSpace(args.GetDataDirNet())) {
1715  InitError(strprintf(_("Error: Disk space is low for %s"), fs::quoted(fs::PathToString(args.GetDataDirNet()))));
1716  return false;
1717  }
1719  InitError(strprintf(_("Error: Disk space is low for %s"), fs::quoted(fs::PathToString(args.GetBlocksDirPath()))));
1720  return false;
1721  }
1722 
1723  int chain_active_height = WITH_LOCK(cs_main, return chainman.ActiveChain().Height());
1724 
1725  // On first startup, warn on low block storage space
1726  if (!do_reindex && !do_reindex_chainstate && chain_active_height <= 1) {
1727  uint64_t assumed_chain_bytes{chainparams.AssumedBlockchainSize() * 1024 * 1024 * 1024};
1728  uint64_t additional_bytes_needed{
1729  chainman.m_blockman.IsPruneMode() ?
1730  std::min(chainman.m_blockman.GetPruneTarget(), assumed_chain_bytes) :
1731  assumed_chain_bytes};
1732 
1733  if (!CheckDiskSpace(args.GetBlocksDirPath(), additional_bytes_needed)) {
1735  "Disk space for %s may not accommodate the block files. " \
1736  "Approximately %u GB of data will be stored in this directory."
1737  ),
1739  chainparams.AssumedBlockchainSize()
1740  ));
1741  }
1742  }
1743 
1744  // Either install a handler to notify us when genesis activates, or set fHaveGenesis directly.
1745  // No locking, as this happens before any background thread is started.
1746  boost::signals2::connection block_notify_genesis_wait_connection;
1747  if (WITH_LOCK(chainman.GetMutex(), return chainman.ActiveChain().Tip() == nullptr)) {
1748  block_notify_genesis_wait_connection = uiInterface.NotifyBlockTip_connect(std::bind(BlockNotifyGenesisWait, std::placeholders::_2));
1749  } else {
1750  fHaveGenesis = true;
1751  }
1752 
1753 #if HAVE_SYSTEM
1754  const std::string block_notify = args.GetArg("-blocknotify", "");
1755  if (!block_notify.empty()) {
1756  uiInterface.NotifyBlockTip_connect([block_notify](SynchronizationState sync_state, const CBlockIndex* pBlockIndex) {
1757  if (sync_state != SynchronizationState::POST_INIT || !pBlockIndex) return;
1758  std::string command = block_notify;
1759  ReplaceAll(command, "%s", pBlockIndex->GetBlockHash().GetHex());
1760  std::thread t(runCommand, command);
1761  t.detach(); // thread runs free
1762  });
1763  }
1764 #endif
1765 
1766  std::vector<fs::path> vImportFiles;
1767  for (const std::string& strFile : args.GetArgs("-loadblock")) {
1768  vImportFiles.push_back(fs::PathFromString(strFile));
1769  }
1770 
1771  chainman.m_thread_load = std::thread(&util::TraceThread, "initload", [=, &chainman, &args, &node] {
1773  // Import blocks
1774  ImportBlocks(chainman, vImportFiles);
1775  if (args.GetBoolArg("-stopafterblockimport", DEFAULT_STOPAFTERBLOCKIMPORT)) {
1776  LogPrintf("Stopping after block import\n");
1777  if (!(*Assert(node.shutdown))()) {
1778  LogError("Failed to send shutdown signal after finishing block import\n");
1779  }
1780  return;
1781  }
1782 
1783  // Start indexes initial sync
1785  bilingual_str err_str = _("Failed to start indexes, shutting down..");
1786  chainman.GetNotifications().fatalError(err_str);
1787  return;
1788  }
1789  // Load mempool from disk
1790  if (auto* pool{chainman.ActiveChainstate().GetMempool()}) {
1792  pool->SetLoadTried(!chainman.m_interrupt);
1793  }
1794  });
1795 
1796  // Wait for genesis block to be processed
1797  {
1799  // We previously could hang here if shutdown was requested prior to
1800  // ImportBlocks getting started, so instead we just wait on a timer to
1801  // check ShutdownRequested() regularly.
1802  while (!fHaveGenesis && !ShutdownRequested(node)) {
1803  g_genesis_wait_cv.wait_for(lock, std::chrono::milliseconds(500));
1804  }
1805  block_notify_genesis_wait_connection.disconnect();
1806  }
1807 
1808  if (ShutdownRequested(node)) {
1809  return false;
1810  }
1811 
1812  // ********************************************************* Step 12: start node
1813 
1815  int64_t best_block_time{};
1816  {
1817  LOCK(cs_main);
1818  LogPrintf("block tree size = %u\n", chainman.BlockIndex().size());
1819  chain_active_height = chainman.ActiveChain().Height();
1820  best_block_time = chainman.ActiveChain().Tip() ? chainman.ActiveChain().Tip()->GetBlockTime() : chainman.GetParams().GenesisBlock().GetBlockTime();
1821  if (tip_info) {
1822  tip_info->block_height = chain_active_height;
1823  tip_info->block_time = best_block_time;
1824  tip_info->verification_progress = GuessVerificationProgress(chainman.GetParams().TxData(), chainman.ActiveChain().Tip());
1825  }
1826  if (tip_info && chainman.m_best_header) {
1827  tip_info->header_height = chainman.m_best_header->nHeight;
1828  tip_info->header_time = chainman.m_best_header->GetBlockTime();
1829  }
1830  }
1831  LogPrintf("nBestHeight = %d\n", chain_active_height);
1832  if (node.peerman) node.peerman->SetBestBlock(chain_active_height, std::chrono::seconds{best_block_time});
1833 
1834  // Map ports with UPnP or NAT-PMP.
1836 
1837  CConnman::Options connOptions;
1838  connOptions.nLocalServices = nLocalServices;
1839  connOptions.m_max_automatic_connections = nMaxConnections;
1840  connOptions.uiInterface = &uiInterface;
1841  connOptions.m_banman = node.banman.get();
1842  connOptions.m_msgproc = node.peerman.get();
1843  connOptions.nSendBufferMaxSize = 1000 * args.GetIntArg("-maxsendbuffer", DEFAULT_MAXSENDBUFFER);
1844  connOptions.nReceiveFloodSize = 1000 * args.GetIntArg("-maxreceivebuffer", DEFAULT_MAXRECEIVEBUFFER);
1845  connOptions.m_added_nodes = args.GetArgs("-addnode");
1846  connOptions.nMaxOutboundLimit = *opt_max_upload;
1847  connOptions.m_peer_connect_timeout = peer_connect_timeout;
1848  connOptions.whitelist_forcerelay = args.GetBoolArg("-whitelistforcerelay", DEFAULT_WHITELISTFORCERELAY);
1849  connOptions.whitelist_relay = args.GetBoolArg("-whitelistrelay", DEFAULT_WHITELISTRELAY);
1850 
1851  // Port to bind to if `-bind=addr` is provided without a `:port` suffix.
1852  const uint16_t default_bind_port =
1853  static_cast<uint16_t>(args.GetIntArg("-port", Params().GetDefaultPort()));
1854 
1855  const uint16_t default_bind_port_onion = default_bind_port + 1;
1856 
1857  const auto BadPortWarning = [](const char* prefix, uint16_t port) {
1858  return strprintf(_("%s request to listen on port %u. This port is considered \"bad\" and "
1859  "thus it is unlikely that any peer will connect to it. See "
1860  "doc/p2p-bad-ports.md for details and a full list."),
1861  prefix,
1862  port);
1863  };
1864 
1865  for (const std::string& bind_arg : args.GetArgs("-bind")) {
1866  std::optional<CService> bind_addr;
1867  const size_t index = bind_arg.rfind('=');
1868  if (index == std::string::npos) {
1869  bind_addr = Lookup(bind_arg, default_bind_port, /*fAllowLookup=*/false);
1870  if (bind_addr.has_value()) {
1871  connOptions.vBinds.push_back(bind_addr.value());
1872  if (IsBadPort(bind_addr.value().GetPort())) {
1873  InitWarning(BadPortWarning("-bind", bind_addr.value().GetPort()));
1874  }
1875  continue;
1876  }
1877  } else {
1878  const std::string network_type = bind_arg.substr(index + 1);
1879  if (network_type == "onion") {
1880  const std::string truncated_bind_arg = bind_arg.substr(0, index);
1881  bind_addr = Lookup(truncated_bind_arg, default_bind_port_onion, false);
1882  if (bind_addr.has_value()) {
1883  connOptions.onion_binds.push_back(bind_addr.value());
1884  continue;
1885  }
1886  }
1887  }
1888  return InitError(ResolveErrMsg("bind", bind_arg));
1889  }
1890 
1891  for (const std::string& strBind : args.GetArgs("-whitebind")) {
1892  NetWhitebindPermissions whitebind;
1893  bilingual_str error;
1894  if (!NetWhitebindPermissions::TryParse(strBind, whitebind, error)) return InitError(error);
1895  connOptions.vWhiteBinds.push_back(whitebind);
1896  }
1897 
1898  // If the user did not specify -bind= or -whitebind= then we bind
1899  // on any address - 0.0.0.0 (IPv4) and :: (IPv6).
1900  connOptions.bind_on_any = args.GetArgs("-bind").empty() && args.GetArgs("-whitebind").empty();
1901 
1902  // Emit a warning if a bad port is given to -port= but only if -bind and -whitebind are not
1903  // given, because if they are, then -port= is ignored.
1904  if (connOptions.bind_on_any && args.IsArgSet("-port")) {
1905  const uint16_t port_arg = args.GetIntArg("-port", 0);
1906  if (IsBadPort(port_arg)) {
1907  InitWarning(BadPortWarning("-port", port_arg));
1908  }
1909  }
1910 
1911  CService onion_service_target;
1912  if (!connOptions.onion_binds.empty()) {
1913  onion_service_target = connOptions.onion_binds.front();
1914  } else if (!connOptions.vBinds.empty()) {
1915  onion_service_target = connOptions.vBinds.front();
1916  } else {
1917  onion_service_target = DefaultOnionServiceTarget(default_bind_port_onion);
1918  connOptions.onion_binds.push_back(onion_service_target);
1919  }
1920 
1921  if (args.GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION)) {
1922  if (connOptions.onion_binds.size() > 1) {
1923  InitWarning(strprintf(_("More than one onion bind address is provided. Using %s "
1924  "for the automatically created Tor onion service."),
1925  onion_service_target.ToStringAddrPort()));
1926  }
1927  StartTorControl(onion_service_target);
1928  }
1929 
1930  if (connOptions.bind_on_any) {
1931  // Only add all IP addresses of the machine if we would be listening on
1932  // any address - 0.0.0.0 (IPv4) and :: (IPv6).
1933  Discover();
1934  }
1935 
1936  for (const auto& net : args.GetArgs("-whitelist")) {
1937  NetWhitelistPermissions subnet;
1938  ConnectionDirection connection_direction;
1939  bilingual_str error;
1940  if (!NetWhitelistPermissions::TryParse(net, subnet, connection_direction, error)) return InitError(error);
1941  if (connection_direction & ConnectionDirection::In) {
1942  connOptions.vWhitelistedRangeIncoming.push_back(subnet);
1943  }
1944  if (connection_direction & ConnectionDirection::Out) {
1945  connOptions.vWhitelistedRangeOutgoing.push_back(subnet);
1946  }
1947  }
1948 
1949  connOptions.vSeedNodes = args.GetArgs("-seednode");
1950 
1951  // Initiate outbound connections unless connect=0
1952  connOptions.m_use_addrman_outgoing = !args.IsArgSet("-connect");
1953  if (!connOptions.m_use_addrman_outgoing) {
1954  const auto connect = args.GetArgs("-connect");
1955  if (connect.size() != 1 || connect[0] != "0") {
1956  connOptions.m_specified_outgoing = connect;
1957  }
1958  if (!connOptions.m_specified_outgoing.empty() && !connOptions.vSeedNodes.empty()) {
1959  LogPrintf("-seednode is ignored when -connect is used\n");
1960  }
1961 
1962  if (args.IsArgSet("-dnsseed") && args.GetBoolArg("-dnsseed", DEFAULT_DNSSEED) && args.IsArgSet("-proxy")) {
1963  LogPrintf("-dnsseed is ignored when -connect is used and -proxy is specified\n");
1964  }
1965  }
1966 
1967  const std::string& i2psam_arg = args.GetArg("-i2psam", "");
1968  if (!i2psam_arg.empty()) {
1969  const std::optional<CService> addr{Lookup(i2psam_arg, 7656, fNameLookup)};
1970  if (!addr.has_value() || !addr->IsValid()) {
1971  return InitError(strprintf(_("Invalid -i2psam address or hostname: '%s'"), i2psam_arg));
1972  }
1973  SetProxy(NET_I2P, Proxy{addr.value()});
1974  } else {
1975  if (args.IsArgSet("-onlynet") && g_reachable_nets.Contains(NET_I2P)) {
1976  return InitError(
1977  _("Outbound connections restricted to i2p (-onlynet=i2p) but "
1978  "-i2psam is not provided"));
1979  }
1981  }
1982 
1983  connOptions.m_i2p_accept_incoming = args.GetBoolArg("-i2pacceptincoming", DEFAULT_I2P_ACCEPT_INCOMING);
1984 
1985  if (!node.connman->Start(scheduler, connOptions)) {
1986  return false;
1987  }
1988 
1989  // ********************************************************* Step 13: finished
1990 
1991  // At this point, the RPC is "started", but still in warmup, which means it
1992  // cannot yet be called. Before we make it callable, we need to make sure
1993  // that the RPC's view of the best block is valid and consistent with
1994  // ChainstateManager's active tip.
1995  //
1996  // If we do not do this, RPC's view of the best block will be height=0 and
1997  // hash=0x0. This will lead to erroroneous responses for things like
1998  // waitforblockheight.
1999  RPCNotifyBlockChange(WITH_LOCK(chainman.GetMutex(), return chainman.ActiveTip()));
2001 
2002  uiInterface.InitMessage(_("Done loading").translated);
2003 
2004  for (const auto& client : node.chain_clients) {
2005  client->start(scheduler);
2006  }
2007 
2008  BanMan* banman = node.banman.get();
2009  scheduler.scheduleEvery([banman]{
2010  banman->DumpBanlist();
2011  }, DUMP_BANS_INTERVAL);
2012 
2013  if (node.peerman) node.peerman->StartScheduledTasks(scheduler);
2014 
2015 #if HAVE_SYSTEM
2017 #endif
2018 
2019  return true;
2020 }
2021 
2023 {
2024  // Find the oldest block among all indexes.
2025  // This block is used to verify that we have the required blocks' data stored on disk,
2026  // starting from that point up to the current tip.
2027  // indexes_start_block='nullptr' means "start from height 0".
2028  std::optional<const CBlockIndex*> indexes_start_block;
2029  std::string older_index_name;
2030  ChainstateManager& chainman = *Assert(node.chainman);
2031  const Chainstate& chainstate = WITH_LOCK(::cs_main, return chainman.GetChainstateForIndexing());
2032  const CChain& index_chain = chainstate.m_chain;
2033 
2034  for (auto index : node.indexes) {
2035  const IndexSummary& summary = index->GetSummary();
2036  if (summary.synced) continue;
2037 
2038  // Get the last common block between the index best block and the active chain
2039  LOCK(::cs_main);
2040  const CBlockIndex* pindex = chainman.m_blockman.LookupBlockIndex(summary.best_block_hash);
2041  if (!index_chain.Contains(pindex)) {
2042  pindex = index_chain.FindFork(pindex);
2043  }
2044 
2045  if (!indexes_start_block || !pindex || pindex->nHeight < indexes_start_block.value()->nHeight) {
2046  indexes_start_block = pindex;
2047  older_index_name = summary.name;
2048  if (!pindex) break; // Starting from genesis so no need to look for earlier block.
2049  }
2050  };
2051 
2052  // Verify all blocks needed to sync to current tip are present.
2053  if (indexes_start_block) {
2054  LOCK(::cs_main);
2055  const CBlockIndex* start_block = *indexes_start_block;
2056  if (!start_block) start_block = chainman.ActiveChain().Genesis();
2057  if (!chainman.m_blockman.CheckBlockDataAvailability(*index_chain.Tip(), *Assert(start_block))) {
2058  return InitError(strprintf(Untranslated("%s best block of the index goes beyond pruned data. Please disable the index or reindex (which will download the whole blockchain again)"), older_index_name));
2059  }
2060  }
2061 
2062  // Start threads
2063  for (auto index : node.indexes) if (!index->StartBackgroundSync()) return false;
2064  return true;
2065 }
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)
Definition: string.cpp:11
std::thread m_thread_load
Definition: validation.h:1010
static void BlockNotifyGenesisWait(const CBlockIndex *pBlockIndex)
Definition: init.cpp:696
fs::path AbsPathForConfigVal(const ArgsManager &args, const fs::path &path, bool net_specific=true)
Most paths passed as configuration arguments are treated as relative to the datadir if they are not a...
Definition: config.cpp:214
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
Definition: validation.h:1013
static path PathFromString(const std::string &string)
Convert byte string to path object.
Definition: fs.h:174
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
Definition: args.cpp:271
static const bool DEFAULT_PRINT_MODIFIED_FEE
Definition: miner.h:34
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument &#39;checklevel&#39;.
Definition: validation.cpp:95
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
Definition: args.cpp:370
fs::path FeeestPath(const ArgsManager &argsman)
Definition: fees_args.cpp:13
bool ShouldPersistMempool(const ArgsManager &argsman)
const std::string ADDR_PREFIX_UNIX
Prefix for unix domain socket addresses (which are local filesystem paths)
Definition: netbase.h:31
void SetupChainParamsBaseOptions(ArgsManager &argsman)
Set the arguments for chainparams.
void Remove(Network net) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:110
void ImportBlocks(ChainstateManager &chainman, std::vector< fs::path > vImportFiles)
bool InitHTTPServer(const util::SignalInterrupt &interrupt)
Initialize HTTP server.
Definition: httpserver.cpp:427
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
Definition: policy.h:35
const std::vector< std::string > NET_PERMISSIONS_DOC
std::condition_variable g_best_block_cv
Definition: validation.cpp:111
void ReadNotificationArgs(const ArgsManager &args, KernelNotifications &notifications)
void InitLogging(const ArgsManager &args)
Initialize global loggers.
Definition: init.cpp:828
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition: validation.h:82
BCLog::Logger & LogInstance()
Definition: logging.cpp:23
Definition: banman.h:58
ServiceFlags
nServices flags
Definition: protocol.h:309
bool IsPruneMode() const
Whether running in -prune mode.
Definition: blockstorage.h:355
bool InitBlockFilterIndex(std::function< std::unique_ptr< interfaces::Chain >()> make_chain, BlockFilterType filter_type, size_t n_cache_size, bool f_memory, bool f_wipe)
Initialize a block filter index for the given type if one does not already exist. ...
bool IsUnixSocketPath(const std::string &name)
Check if a string is a valid UNIX domain socket path.
Definition: netbase.cpp:230
CClientUIInterface uiInterface
#define LogPrint(category,...)
Definition: logging.h:293
int64_t GetBlockTime() const
Definition: chain.h:266
assert(!tx.IsCoinBase())
static const int DEFAULT_HTTP_SERVER_TIMEOUT
Definition: httpserver.h:19
static constexpr unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT_KVB
Default for -limitdescendantsize, maximum kilobytes of in-mempool descendants.
Definition: policy.h:65
static constexpr unsigned int DEFAULT_MEMPOOL_EXPIRY_HOURS
Default for -mempoolexpiry, expiration time for mempool transactions in hours.
#define TRY_LOCK(cs, name)
Definition: sync.h:261
void SetupServerArgs(ArgsManager &argsman)
Register all arguments with the ArgsManager.
Definition: init.cpp:444
const char *const BITCOIN_SETTINGS_FILENAME
Definition: args.cpp:39
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn&#39;t already have a value.
Definition: args.cpp:537
std::unique_ptr< CZMQNotificationInterface > g_zmq_notification_interface
std::string GetChainTypeString() const
Return the chain type string.
Definition: chainparams.h:113
void Shutdown(NodeContext &node)
Definition: init.cpp:268
int64_t block_tree_db
Definition: caches.h:15
Bilingual messages:
Definition: translation.h:18
void SetRPCWarmupStatus(const std::string &newStatus)
Set the RPC warmup status.
Definition: server.cpp:337
ChainstateLoadResult VerifyLoadedChainstate(ChainstateManager &chainman, const ChainstateLoadOptions &options)
Definition: chainstate.cpp:247
static const unsigned int MAX_OP_RETURN_RELAY
Default setting for -datacarriersize.
Definition: policy.h:72
bool SplitHostPort(std::string_view in, uint16_t &portOut, std::string &hostOut)
Splits socket address string into host string and port value.
bool BlockFilterTypeByName(const std::string &name, BlockFilterType &filter_type)
Find a filter type by its human-readable name.
static constexpr bool DEFAULT_ACCEPT_STALE_FEE_ESTIMATES
Definition: fees.h:36
static boost::signals2::connection rpc_notify_block_change_connection
Definition: init.cpp:430
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:870
constexpr bool DEFAULT_WHITELISTRELAY
Default for -whitelistrelay.
bool empty() const
Definition: translation.h:29
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition: tinyformat.h:1161
static const int DEFAULT_HTTP_WORKQUEUE
Definition: httpserver.h:18
static void RegisterAllCoreRPCCommands(CRPCTable &t)
Definition: register.h:26
An in-memory indexed chain of blocks.
Definition: chain.h:416
bool CheckBlockDataAvailability(const CBlockIndex &upper_block LIFETIMEBOUND, const CBlockIndex &lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, uint32_t status_mask, const CBlockIndex *lower_block=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned)
Check if all blocks in the [upper_block, lower_block] range have data available.
Definition: blockstorage.h:403
bilingual_str ResolveErrMsg(const std::string &optname, const std::string &strBind)
Definition: messages.cpp:148
IPv4.
Definition: netaddress.h:37
std::vector< bool > DecodeAsmap(fs::path path)
Read asmap from provided binary file.
Definition: asmap.cpp:197
static const char *const DEFAULT_BLOCKFILTERINDEX
static void OnRPCStarted()
Definition: init.cpp:431
void Add(Network net) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:103
static std::unique_ptr< PeerManager > make(CConnman &connman, AddrMan &addrman, BanMan *banman, ChainstateManager &chainman, CTxMemPool &pool, node::Warnings &warnings, Options opts)
static void HandleSIGTERM(int)
Signal handlers are very limited in what they are allowed to do.
Definition: init.cpp:396
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:48
util::Result< void > SetLoggingLevel(const ArgsManager &args)
Definition: common.cpp:58
static const unsigned int MIN_BLOCKS_TO_KEEP
Block files containing a block-height within MIN_BLOCKS_TO_KEEP of ActiveChain().Tip() will not be pr...
Definition: validation.h:68
void StartREST(const std::any &context)
Start HTTP REST subsystem.
Definition: rest.cpp:1024
static constexpr bool DEFAULT_RPC_DOC_CHECK
Definition: util.h:46
const char * prefix
Definition: rest.cpp:1007
const std::vector< std::string > TEST_OPTIONS_DOC
Definition: args.cpp:686
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1117
void AddHiddenArgs(const std::vector< std::string > &args)
Add many hidden arguments.
Definition: args.cpp:584
static constexpr int DEFAULT_CHECKLEVEL
Definition: validation.h:70
static constexpr std::chrono::hours MAX_FILE_AGE
fee_estimates.dat that are more than 60 hours (2.5 days) old will not be read, as fee estimates are b...
Definition: fees.h:33
int Height() const
Return the maximal height in the chain.
Definition: chain.h:462
util::Result< void > SetLoggingCategories(const ArgsManager &args)
Definition: common.cpp:79
void StopTorControl()
Definition: torcontrol.cpp:705
constexpr int DEFAULT_TOR_CONTROL_PORT
Functionality for communicating with Tor.
Definition: torcontrol.h:22
static constexpr int DEFAULT_STOPATHEIGHT
void StopREST()
Stop HTTP REST subsystem.
Definition: rest.cpp:1036
Fatal error which should not prompt to reindex.
void OnStopped(std::function< void()> slot)
Definition: server.cpp:83
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
Definition: policy.h:57
static const bool DEFAULT_LISTEN
-listen default
Definition: net.h:75
std::atomic< bool > m_reopen_file
Definition: logging.h:148
static constexpr bool DEFAULT_PROXYRANDOMIZE
Definition: init.cpp:141
static const int MAX_ADDNODE_CONNECTIONS
Maximum number of addnode outgoing nodes.
Definition: net.h:69
An options struct for ChainstateManager, more ergonomically referred to as ChainstateManager::Options...
static void OnRPCStopped()
Definition: init.cpp:436
const auto cmd
#define PACKAGE_NAME
void InterruptRPC()
Definition: server.cpp:303
const std::set< BlockFilterType > & AllBlockFilterTypes()
Get a list of known filter types.
static constexpr std::chrono::hours FEE_FLUSH_INTERVAL
Definition: fees.h:27
bool fDiscover
Definition: net.cpp:113
int64_t filter_index
Definition: caches.h:19
bool DefaultConsistencyChecks() const
Default value for -checkmempool and -checkblockindex argument.
Definition: chainparams.h:100
static void RemovePidFile(const ArgsManager &args)
Definition: init.cpp:188
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
Definition: chain.h:427
void Discover()
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses t...
Definition: net.cpp:3088
const CBlock & GenesisBlock() const
Definition: chainparams.h:98
bool Contains(Network net) const EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:124
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system...
Definition: chainparams.h:80
static constexpr size_t DEFAULT_VALIDATION_CACHE_BYTES
Definition: sigcache.h:28
util::Result< void > SanityChecks(const Context &)
Ensure a usable environment with all necessary library support.
Definition: checks.cpp:15
static constexpr bool DEFAULT_CHECKPOINTS_ENABLED
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: args.cpp:506
void StartMapPort(bool use_upnp, bool use_natpmp)
Definition: mapport.cpp:298
bool SetProxy(enum Network net, const Proxy &addrProxy)
Definition: netbase.cpp:679
static const int64_t nMinDbCache
min. -dbcache (MiB)
Definition: txdb.h:31
bool StartHTTPRPC(const std::any &context)
Start HTTP RPC subsystem.
Definition: httprpc.cpp:358
static constexpr bool DEFAULT_PERMIT_BAREMULTISIG
Default for -permitbaremultisig.
Definition: policy.h:39
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
void RandAddPeriodic() noexcept
Gather entropy from various expensive sources, and feed them to the PRNG state.
Definition: random.cpp:685
void InterruptHTTPRPC()
Interrupt HTTP RPC subsystem.
Definition: httprpc.cpp:376
static constexpr unsigned int DEFAULT_BYTES_PER_SIGOP
Default for -bytespersigop.
Definition: policy.h:37
static void HandleSIGHUP(int)
Definition: init.cpp:403
void InitWarning(const bilingual_str &str)
Show warning message.
int RaiseFileDescriptorLimit(int nMinFD)
this function tries to raise the file descriptor limit to the requested number.
Definition: fs_helpers.cpp:163
CChain m_chain
The current chain of blockheaders we consult and build on.
Definition: validation.h:593
ChainType GetChainType() const
Returns the appropriate chain type from the program arguments.
Definition: args.cpp:749
void StartTorControl(CService onion_service_target)
Definition: torcontrol.cpp:676
void InterruptHTTPServer()
Interrupt HTTP server threads.
Definition: httpserver.cpp:496
bool SoftSetArg(const std::string &strArg, const std::string &strValue)
Set an argument if it doesn&#39;t already have a value.
Definition: args.cpp:529
bool(* handler)(const std::any &context, HTTPRequest *req, const std::string &strReq)
Definition: rest.cpp:1008
void ThreadRename(const std::string &)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name...
Definition: threadnames.cpp:57
virtual void Construct(node::NodeContext &node) const =0
Add wallets that should be opened to list of chain clients.
bool synced
Definition: base.h:25
static constexpr bool DEFAULT_DAEMON
Default value for -daemon option.
Definition: init.h:12
bool require_full_verification
Setting require_full_verification to true will require all checks at check_level (below) to succeed f...
Definition: chainstate.h:37
I2P.
Definition: netaddress.h:46
std::string ToStringAddrPort() const
Definition: netaddress.cpp:905
virtual void fatalError(const bilingual_str &message)
The fatal error notification is sent to notify the user when an error occurs in kernel code that can&#39;...
void RPCNotifyBlockChange(const CBlockIndex *pindex)
Callback for when block tip changed.
Definition: blockchain.cpp:246
bilingual_str AmountErrMsg(const std::string &optname, const std::string &strValue)
Definition: messages.cpp:163
static void ShutdownNotify(const ArgsManager &args)
Definition: init.cpp:238
disable validation
Definition: args.h:104
const util::SignalInterrupt & m_interrupt
Definition: validation.h:1008
bool DumpMempool(const CTxMemPool &pool, const fs::path &dump_path, FopenFn mockable_fopen_function, bool skip_file_commit)
static constexpr unsigned int DEFAULT_ANCESTOR_SIZE_LIMIT_KVB
Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors.
Definition: policy.h:61
std::function< void()> snapshot_download_completed
Function to restart active indexes; set dynamically to avoid a circular dependency on base/index...
Definition: validation.h:979
bool AppInitBasicSetup(const ArgsManager &args, std::atomic< int > &exit_status)
Initialize bitcoin core: Basic context setup.
Definition: init.cpp:858
util::Result< std::unique_ptr< AddrMan > > LoadAddrman(const NetGroupManager &netgroupman, const ArgsManager &args)
Returns an error string on failure.
Definition: addrdb.cpp:191
static const bool DEFAULT_PEERBLOCKFILTERS
std::string SysErrorString(int err)
Return system error string from errno value.
Definition: syserror.cpp:19
static constexpr bool DEFAULT_XOR_BLOCKSDIR
bool LoadMempool(CTxMemPool &pool, const fs::path &load_path, Chainstate &active_chainstate, ImportMempoolOptions &&opts)
Import the file and attempt to add its contents to the mempool.
static constexpr bool DEFAULT_UPNP
Definition: mapport.h:8
Common init functions shared by bitcoin-node, bitcoin-wallet, etc.
uint256 GetBlockHash() const
Definition: chain.h:243
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
Definition: time.cpp:32
void SetRPCWarmupFinished()
Definition: server.cpp:343
std::string SanitizeString(std::string_view str, int rule)
Remove unsafe chars.
static const size_t DEFAULT_MAXRECEIVEBUFFER
Definition: net.h:92
BlockFilterType
Definition: blockfilter.h:92
NodeContext struct containing references to chain state and connection state.
Definition: context.h:55
disallow -foo syntax that doesn&#39;t assign any value
Definition: args.h:110
bool IsBadPort(uint16_t port)
Determine if a port is "bad" from the perspective of attempting to connect to a node on that port...
Definition: netbase.cpp:791
CRPCTable tableRPC
Definition: server.cpp:590
static constexpr unsigned int DEFAULT_BLOCKSONLY_MAX_MEMPOOL_SIZE_MB
Default for -maxmempool when blocksonly is set.
uint16_t GetListenPort()
Definition: net.cpp:133
const std::string & ListBlockFilterTypes()
Get a comma-separated list of known filter type names.
ChainType
Definition: chaintype.h:11
bool BackgroundSyncInProgress() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
The state of a background sync (for net processing)
Definition: validation.h:1122
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
Definition: args.h:232
static constexpr unsigned int DEFAULT_DESCENDANT_LIMIT
Default for -limitdescendantcount, max number of in-mempool descendants.
Definition: policy.h:63
static std::string PathToString(const path &path)
Convert path object to a byte string.
Definition: fs.h:151
ArgsManager & args
Definition: bitcoind.cpp:270
const std::string DEFAULT_TOR_CONTROL
Default control ip and port.
Definition: torcontrol.cpp:50
Chainstate stores and provides an API to update our local knowledge of the current best chain...
Definition: validation.h:512
constexpr bool DEFAULT_WHITELISTFORCERELAY
Default for -whitelistforcerelay.
static constexpr bool DEFAULT_PERSIST_MEMPOOL
Default for -persistmempool, indicating whether the node should attempt to automatically load the mem...
void StopHTTPServer()
Stop HTTP server.
Definition: httpserver.cpp:508
static std::condition_variable g_genesis_wait_cv
Definition: init.cpp:694
void Interrupt(NodeContext &node)
Interrupt threads.
Definition: init.cpp:250
static constexpr unsigned int DEFAULT_MAX_MEMPOOL_SIZE_MB
Default for -maxmempool, maximum megabytes of mempool memory usage.
#define LOCK(cs)
Definition: sync.h:257
const char * name
Definition: rest.cpp:49
The BlockPolicyEstimator is used for estimating the feerate needed for a transaction to be included i...
Definition: fees.h:148
bool InitError(const bilingual_str &str)
Show error message.
std::unique_ptr< TxIndex > g_txindex
The global transaction index, used in GetTransaction. May be null.
Definition: txindex.cpp:16
static constexpr int DEFAULT_SCRIPTCHECK_THREADS
-par default (number of script-checking threads, 0 = auto)
bool AddLocal(const CService &addr_, int nScore)
Definition: net.cpp:266
fs::path GetBlocksDirPath() const
Get blocks directory path.
Definition: args.cpp:281
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:530
A writer stream (for serialization) that computes a 256-bit hash.
Definition: hash.h:100
Fast randomness source.
Definition: random.h:376
void format(std::ostream &out, const char *fmt, const Args &... args)
Format list of arguments to the stream according to given format string.
Definition: tinyformat.h:1059
kernel::Notifications & GetNotifications() const
Definition: validation.h:986
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
bool SetNameProxy(const Proxy &addrProxy)
Set the name proxy to use for all connections to nodes specified by a hostname.
Definition: netbase.cpp:697
void DestroyAllBlockFilterIndexes()
Destroy all open block filter indexes.
static constexpr unsigned int DEFAULT_ANCESTOR_LIMIT
Default for -limitancestorcount, max number of in-mempool ancestors.
Definition: policy.h:59
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
Definition: args.cpp:563
bool StartLogging(const ArgsManager &args)
Definition: common.cpp:104
std::unique_ptr< CBaseChainParams > CreateBaseChainParams(const ChainType chain)
Port numbers for incoming Tor connections (8334, 18334, 38334, 48334, 18445) have been chosen arbitra...
std::optional< uint64_t > ParseByteUnits(std::string_view str, ByteUnit default_multiplier)
Parse a string with suffix unit [k|K|m|M|g|G|t|T].
static const int NUM_FDS_MESSAGE_CAPTURE
Number of file descriptors required for message capture.
Definition: net.h:85
std::optional< CAmount > ParseMoney(const std::string &money_string)
Parse an amount denoted in full coins.
Definition: moneystr.cpp:45
bool AppInitMain(NodeContext &node, interfaces::BlockAndHeaderTipInfo *tip_info)
Bitcoin core main initialization.
Definition: init.cpp:1138
std::list< SectionInfo > GetUnrecognizedSections() const
Log warnings for unrecognized section names in the config file.
Definition: args.cpp:155
LockResult LockDirectory(const fs::path &directory, const fs::path &lockfile_name, bool probe_only)
Definition: fs_helpers.cpp:53
static constexpr std::chrono::minutes DUMP_BANS_INTERVAL
How often to dump banned addresses/subnets to disk.
Definition: banman.h:22
const std::string CURRENCY_UNIT
Definition: feerate.h:17
static constexpr bool DEFAULT_FIXEDSEEDS
Definition: net.h:91
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Definition: validation.h:1119
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
Definition: blockstorage.h:134
static const int64_t nDefaultDbCache
-dbcache default (MiB)
Definition: txdb.h:25
Network
A network type.
Definition: netaddress.h:32
Block and header tip information.
Definition: node.h:49
static void StartupNotify(const ArgsManager &args)
Definition: init.cpp:708
std::atomic_bool m_blockfiles_indexed
Whether all blockfiles have been added to the block tree database.
Definition: blockstorage.h:280
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS
The maximum number of peer connections to maintain.
Definition: net.h:77
#define WAIT_LOCK(cs, name)
Definition: sync.h:262
static constexpr bool DEFAULT_V2_TRANSPORT
Definition: net.h:95
static constexpr bool DEFAULT_DNSSEED
Definition: net.h:90
static const int64_t nDefaultDbBatchSize
-dbbatchsize default (bytes)
Definition: txdb.h:27
std::string ToString() const
Definition: uint256.cpp:47
void StartRPC()
Definition: server.cpp:296
static fs::path GetPidFile(const ArgsManager &args)
Definition: init.cpp:167
static GlobalMutex g_genesis_wait_mutex
Definition: init.cpp:693
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
Definition: validation.h:1006
bool IsValid() const
Definition: netbase.h:70
static constexpr bool DEFAULT_COINSTATSINDEX
int64_t GetBlockTime() const
Definition: block.h:61
const std::string CLIENT_NAME
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
A base class defining functions for notifying about certain kernel events.
std::string strSubVersion
Subversion as sent to the P2P network in version messages.
Definition: net.cpp:117
static const int DEFAULT_NAME_LOOKUP
-dns default
Definition: netbase.h:28
static constexpr auto DEFAULT_MAX_TIP_AGE
void SetLoggingOptions(const ArgsManager &args)
Definition: common.cpp:44
int nConnectTimeout
Definition: netbase.cpp:36
static const int DEFAULT_ZMQ_SNDHWM
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
Definition: validation.h:1086
bool CheckDiskSpace(const fs::path &dir, uint64_t additional_bytes)
Definition: fs_helpers.cpp:93
void AddLoggingArgs(ArgsManager &argsman)
Definition: common.cpp:26
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:301
static bool g_generated_pid
True if this process has created a PID file.
Definition: init.cpp:165
int64_t coins
Definition: caches.h:17
virtual void AddWalletOptions(ArgsManager &argsman) const =0
Get wallet help string.
std::vector< std::string > GetNetworkNames(bool append_unroutable)
Return a vector of publicly routable Network names; optionally append NET_UNROUTABLE.
Definition: netbase.cpp:134
CService DefaultOnionServiceTarget(uint16_t port)
Definition: torcontrol.cpp:714
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
Definition: validation.h:1131
static constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
Definition: messages.h:20
void StopHTTPRPC()
Stop HTTP RPC subsystem.
Definition: httprpc.cpp:381
std::function< void()> coins_error_cb
Definition: chainstate.h:40
enum Network ParseNetwork(const std::string &net_in)
Definition: netbase.cpp:100
ArgsManager gArgs
Definition: args.cpp:41
Definition: netbase.h:58
void DumpBanlist() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Definition: banman.cpp:48
#define LogInfo(...)
Definition: logging.h:269
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
Definition: policy.h:55
const CChainParams & GetParams() const
Definition: validation.h:981
void SetupHelpOptions(ArgsManager &args)
Add help options to the args manager.
Definition: args.cpp:665
std::string FormatMoney(const CAmount n)
Money parsing/formatting utilities.
Definition: moneystr.cpp:19
void LogPackageVersion()
Definition: common.cpp:141
256-bit opaque blob.
Definition: uint256.h:178
static std::unique_ptr< CZMQNotificationInterface > Create(std::function< bool(std::vector< uint8_t > &, const CBlockIndex &)> get_block_by_index)
static constexpr bool DEFAULT_NATPMP
Definition: mapport.h:10
std::vector< CService > Lookup(const std::string &name, uint16_t portDefault, bool fAllowLookup, unsigned int nMaxSolutions, DNSLookupFn dns_lookup_function)
Resolve a service string to its corresponding service.
Definition: netbase.cpp:195
static const bool DEFAULT_PEERBLOOMFILTERS
void RegisterZMQRPCCommands(CRPCTable &t)
Definition: zmqrpc.cpp:65
std::string name
Definition: base.h:24
const WalletInitInterface & g_wallet_init_interface
Definition: init.cpp:138
ChainType GetChainType() const
Return the chain type.
Definition: chainparams.h:115
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
Definition: interfaces.cpp:928
bool SetupNetworking()
Definition: system.cpp:91
static constexpr unsigned int DEFAULT_MISBEHAVING_BANTIME
Definition: banman.h:19
static constexpr bool DEFAULT_I2P_ACCEPT_INCOMING
Definition: init.cpp:143
const ChainTxData & TxData() const
Definition: chainparams.h:132
unsigned int nBytesPerSigOp
Definition: settings.cpp:10
void StopRPC()
Definition: server.cpp:314
const auto command
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
Definition: init.cpp:895
static const char * DEFAULT_ASMAP_FILENAME
Definition: init.cpp:155
static const size_t DEFAULT_MAXSENDBUFFER
Definition: net.h:93
virtual bool ParameterInteraction() const =0
Check wallet parameter interaction.
uint64_t AssumedBlockchainSize() const
Minimum free space (in GB) needed for data directory.
Definition: chainparams.h:107
std::string original
Definition: translation.h:19
static void new_handler_terminate()
Definition: init.cpp:845
The block chain is a tree shaped structure starting with the genesis block at the root...
Definition: chain.h:140
const CChainParams & Params()
Return the currently selected parameters.
static const uint32_t DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN
Default number of non-mempool transactions to keep around for block reconstruction.
bool ShutdownRequested(node::NodeContext &node)
Return whether node shutdown was requested.
Definition: init.cpp:232
static constexpr bool DEFAULT_TXRECONCILIATION_ENABLE
Whether transaction reconciliation protocol should be enabled by default.
static const signed int DEFAULT_CHECKBLOCKS
Definition: validation.h:69
void ScheduleBatchPriority()
On platforms that support it, tell the kernel the calling thread is CPU-intensive and non-interactive...
#define LogError(...)
Definition: logging.h:271
static bool TryParse(const std::string &str, NetWhitelistPermissions &output, ConnectionDirection &output_connection_direction, bilingual_str &error)
static constexpr bool DEFAULT_MEMPOOL_FULL_RBF
Default for -mempoolfullrbf, if the transaction replaceability signaling is ignored.
void RpcInterruptionPoint()
Throw JSONRPCError if RPC is not running.
Definition: server.cpp:332
fs::path MempoolPath(const ArgsManager &argsman)
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
Definition: args.cpp:481
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess how far we are in the verification process at the given block index require cs_main if pindex h...
const MessageStartChars & MessageStart() const
Definition: chainparams.h:94
static constexpr bool DEFAULT_REST_ENABLE
Definition: init.cpp:142
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Definition: args.cpp:456
std::unique_ptr< const CChainParams > CreateChainParams(const ArgsManager &args, const ChainType chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
ServiceFlags nLocalServices
Definition: net.h:1038
void InterruptREST()
Interrupt RPC REST subsystem.
Definition: rest.cpp:1032
int64_t tx_index
Definition: caches.h:18
static const int DEFAULT_CONNECT_TIMEOUT
-timeout default
Definition: netbase.h:26
Context struct holding the kernel library&#39;s logically global state, and passed to external libbitcoin...
Definition: context.h:16
static constexpr bool DEFAULT_PERSIST_V1_DAT
Whether to fall back to legacy V1 serialization when writing mempool.dat.
static constexpr int32_t DEFAULT_ADDRMAN_CONSISTENCY_CHECKS
Default for -checkaddrman.
Definition: addrman.h:31
static const int64_t nMaxDbCache
max. -dbcache (MiB)
Definition: txdb.h:29
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
Definition: chain.h:433
std::string FormatSubVersion(const std::string &name, int nClientVersion, const std::vector< std::string > &comments)
Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip...
static constexpr bool DEFAULT_TXINDEX
Definition: txindex.h:10
static const uint32_t DEFAULT_MAX_ORPHAN_TRANSACTIONS
Default for -maxorphantx, maximum number of orphan transactions kept in memory.
IPv6.
Definition: netaddress.h:40
std::string GetHex() const
Definition: uint256.cpp:11
Generic failure which reindexing may fix.
void RemoveAll() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Definition: netbase.h:117
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition: hex_base.cpp:29
TOR (v2 or v3)
Definition: netaddress.h:43
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
Definition: init.cpp:1100
static std::optional< util::SignalInterrupt > g_shutdown
Definition: init.cpp:198
static constexpr unsigned int DEFAULT_BLOCK_MAX_WEIGHT
Default for -blockmaxweight, which controls the range of block weights the mining code will create...
Definition: policy.h:23
bool fListen
Definition: net.cpp:114
int exit_status
static constexpr bool DEFAULT_ACCEPT_NON_STD_TXN
Default for -acceptnonstdtxn.
static constexpr bool DEFAULT_FORCEDNSSEED
Definition: net.h:89
std::string ChainTypeToString(ChainType chain)
Definition: chaintype.cpp:11
const char *const BITCOIN_CONF_FILENAME
Definition: args.cpp:38
static constexpr bool DEFAULT_DAEMONWAIT
Default value for -daemonwait option.
Definition: init.h:14
static const unsigned int MAX_SUBVERSION_LENGTH
Maximum length of the user agent string in version message.
Definition: net.h:65
bilingual_str ErrorString(const Result< T > &result)
Definition: result.h:93
static const int64_t DEFAULT_PEER_CONNECT_TIMEOUT
-peertimeout default
Definition: net.h:83
#define LogWarning(...)
Definition: logging.h:270
static const bool DEFAULT_BLOCKSONLY
Default for blocks only.
Definition: net.h:81
static constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE
Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by min...
Definition: policy.h:25
void StartHTTPServer()
Start HTTP server.
Definition: httpserver.cpp:485
std::unique_ptr< CoinStatsIndex > g_coin_stats_index
The global UTXO set hash object.
static auto quoted(const std::string &s)
Definition: fs.h:95
void InterruptTorControl()
Definition: torcontrol.cpp:695
void OnStarted(std::function< void()> slot)
Definition: server.cpp:78
bool AppInitInterfaces(NodeContext &node)
Initialize node and wallet interface pointers.
Definition: init.cpp:1131
void InterruptMapPort()
Definition: mapport.cpp:305
bool AppInitLockDataDirectory()
Lock bitcoin core data directory.
Definition: init.cpp:1119
bilingual_str InvalidPortErrMsg(const std::string &optname, const std::string &invalid_value)
Definition: messages.cpp:153
Options struct containing options for constructing a CTxMemPool.
static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT
Definition: init.cpp:144
bool StartIndexBackgroundSync(NodeContext &node)
Validates requirements to run the indexes and spawns each index initial sync thread.
Definition: init.cpp:2022
static bool TryParse(const std::string &str, NetWhitebindPermissions &output, bilingual_str &error)
Different type to mark Mutex at global scope.
Definition: sync.h:140
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:153
bool ECC_InitSanityCheck()
Check that required EC support is available at runtime.
Definition: key.cpp:442
static const char * BITCOIN_PID_FILENAME
The PID file facilities.
Definition: init.cpp:160
ChainstateLoadResult LoadChainstate(ChainstateManager &chainman, const CacheSizes &cache_sizes, const ChainstateLoadOptions &options)
This sequence can have 4 types of outcomes:
Definition: chainstate.cpp:162
static void registerSignalHandler(int signal, void(*handler)(int))
Definition: init.cpp:420
static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Definition: validation.h:79
std::vector< std::string > GetArgs(const std::string &strArg) const
Return a vector of strings of the given argument.
Definition: args.cpp:361
int64_t coins_db
Definition: caches.h:16
static bool exists(const path &p)
Definition: fs.h:89
#define MIN_CORE_FILEDESCRIPTORS
Definition: init.cpp:152
#define LogPrintf(...)
Definition: logging.h:274
uint64_t rand64() noexcept
Generate a random 64-bit integer.
Definition: random.h:395
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:32
ConnectionDirection
Definition: netbase.h:33
static const int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
Definition: clientversion.h:31
static const bool DEFAULT_LISTEN_ONION
Definition: torcontrol.h:24
CJDNS.
Definition: netaddress.h:49
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:115
uint64_t GetPruneTarget() const
Attempt to stay below this number of bytes of block files.
Definition: blockstorage.h:358
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
Definition: cs_main.cpp:8
static const bool DEFAULT_ACCEPT_DATACARRIER
Default for -datacarrier.
Definition: policy.h:67
bilingual_str _(ConstevalStringLiteral str)
Translation function.
Definition: translation.h:80
void StopMapPort()
Definition: mapport.cpp:313
void InitContext(NodeContext &node)
Initialize node context shutdown and args variables.
Definition: init.cpp:200
BIP-0014 subset.
Definition: strencodings.h:31
static bool CreatePidFile(const ArgsManager &args)
Definition: init.cpp:172
static const int DEFAULT_HTTP_THREADS
Definition: httpserver.h:17
static bool AppInitServers(NodeContext &node)
Definition: init.cpp:718
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
Definition: validation.h:1116
uint256 best_block_hash
Definition: base.h:27
bool fNameLookup
Definition: netbase.cpp:37
CacheSizes CalculateCacheSizes(const ArgsManager &args, size_t n_indexes)
Definition: caches.cpp:12
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
Definition: init.cpp:736
std::string ToString(const T &t)
Locale-independent version of std::to_string.
Definition: string.h:156
#define Assert(val)
Identity function.
Definition: check.h:77
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency...
Definition: util.cpp:43
static bool LockDataDirectory(bool probeOnly)
Definition: init.cpp:1086
ReachableNets g_reachable_nets
Definition: netbase.cpp:43
const std::string & BlockFilterTypeName(BlockFilterType filter_type)
Get the human-readable name for a filter type.
static bool fHaveGenesis
Definition: init.cpp:692
void TraceThread(std::string_view thread_name, std::function< void()> thread_func)
A wrapper for do-something-once thread functions.
Definition: thread.cpp:16
std::set< std::string > GetUnsuitableSectionOnlyArgs() const
Log warnings for options in m_section_only_args when they are specified in the default section but no...
Definition: args.cpp:135
static const std::string DEFAULT_MAX_UPLOAD_TARGET
The default for -maxuploadtarget.
Definition: net.h:79
Addresses from these networks are not publicly routable on the global Internet.
Definition: netaddress.h:34