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