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