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