6#if defined(HAVE_CONFIG_H)
7#include <config/bitcoin-config.h>
92#include <boost/signals2/signal.hpp>
95#include <chronik-cpp/chronik.h>
110#include <condition_variable>
151#define MIN_CORE_FILEDESCRIPTORS 0
153#define MIN_CORE_FILEDESCRIPTORS 150
211static void ShutdownNotify(
const ArgsManager &args) {
212 std::vector<std::thread> threads;
213 for (
const auto &cmd : args.
GetArgs(
"-shutdownnotify")) {
214 threads.emplace_back(runCommand, cmd);
216 for (
auto &t : threads) {
224 ShutdownNotify(*
node.args);
232 if (
node.avalanche) {
235 node.avalanche->stopEventLoop();
238 node.connman->Interrupt();
250 static Mutex g_shutdown_mutex;
251 TRY_LOCK(g_shutdown_mutex, lock_shutdown);
252 if (!lock_shutdown) {
255 LogPrintf(
"%s: In progress...\n", __func__);
264 node.mempool->AddTransactionsUpdated(1);
283 for (
const auto &client :
node.chain_clients) {
294 if (
node.avalanche) {
295 node.avalanche->stopEventLoop();
300 if (
node.peerman &&
node.validation_signals) {
301 node.validation_signals->UnregisterValidationInterface(
305 node.connman->Stop();
310 if (
node.background_init_thread.joinable()) {
311 node.background_init_thread.join();
317 if (
node.scheduler) {
318 node.scheduler->stop();
323 node.peerman.reset();
326 node.avalanche.reset();
327 node.connman.reset();
329 node.addrman.reset();
331 if (
node.mempool &&
node.mempool->GetLoadTried() &&
341 if (chainstate->CanFlushToDisk()) {
342 chainstate->ForceFlushStateToDisk();
349 if (
node.validation_signals) {
350 node.validation_signals->FlushBackgroundCallbacks();
382 if (chainstate->CanFlushToDisk()) {
383 chainstate->ForceFlushStateToDisk();
384 chainstate->ResetCoinsViews();
388 node.chainman->DumpRecentHeadersTime(
node.chainman->m_options.datadir /
391 for (
const auto &client :
node.chain_clients) {
397 if (
node.validation_signals) {
398 node.validation_signals->UnregisterValidationInterface(
405 node.chain_clients.clear();
406 if (
node.validation_signals) {
407 node.validation_signals->UnregisterAllValidationInterfaces();
410 node.mempool.reset();
411 node.chainman.reset();
412 node.validation_signals.reset();
413 node.scheduler.reset();
417 LogPrintf(
"%s: Unable to remove PID file: File does not exist\n",
420 }
catch (
const fs::filesystem_error &e) {
421 LogWarning(
"%s: Unable to remove PID file: %s\n", __func__,
442static BOOL WINAPI consoleCtrlHandler(DWORD dwCtrlType) {
453 sigemptyset(&sa.sa_mask);
455 sigaction(signal, &sa,
nullptr);
480 argsman.
AddArg(
"-help-debug",
481 "Print help message with debugging options and exit",
false,
490 const auto testnetChainParams =
492 const auto regtestChainParams =
496 std::vector<std::string> hidden_args = {
501 "-automaticunparking",
502 "-replayprotectionactivationtime",
504 "-chronikallowpause",
507 "-allowselfsignedrootcertificates",
512 "-rootcertificates=<file>",
516 "-mengeractivationtime",
526#if defined(HAVE_SYSTEM)
528 "-alertnotify=<cmd>",
529 "Execute command when a relevant alert is received or we see "
530 "a really long fork (%s in cmd is replaced by message)",
534 "-assumevalid=<hex>",
536 "If this block is in the chain assume that it and its ancestors "
537 "are valid and potentially skip their script verification (0 to "
538 "verify all, default: %s, testnet: %s)",
539 defaultChainParams->GetConsensus().defaultAssumeValid.GetHex(),
540 testnetChainParams->GetConsensus().defaultAssumeValid.GetHex()),
542 argsman.
AddArg(
"-blocksdir=<dir>",
543 "Specify directory to hold blocks subdirectory for *.dat "
544 "files (default: <datadir>)",
546 argsman.
AddArg(
"-fastprune",
547 "Use smaller block files and lower minimum prune height for "
551#if defined(HAVE_SYSTEM)
552 argsman.
AddArg(
"-blocknotify=<cmd>",
553 "Execute command when the best block changes (%s in cmd is "
554 "replaced by block hash)",
557 argsman.
AddArg(
"-blockreconstructionextratxn=<n>",
558 strprintf(
"Extra transactions to keep in memory for compact "
559 "block reconstructions (default: %u)",
564 strprintf(
"Whether to reject transactions from network peers. "
565 "Disables automatic broadcast and rebroadcast of "
566 "transactions, unless the source peer has the "
567 "'forcerelay' permission. RPC transactions are"
568 " not affected. (default: %u)",
571 argsman.
AddArg(
"-coinstatsindex",
572 strprintf(
"Maintain coinstats index used by the "
573 "gettxoutsetinfo RPC (default: %u)",
578 strprintf(
"Specify path to read-only configuration file. Relative "
579 "paths will be prefixed by datadir location. (default: %s)",
582 argsman.
AddArg(
"-datadir=<dir>",
"Specify data directory",
586 strprintf(
"Maximum database write batch size in bytes (default: %u)",
590 argsman.
AddArg(
"-dbcache=<n>",
591 strprintf(
"Maximum database cache size <n> MiB (minimum %d, "
592 "default: %d). Make sure you have enough RAM. In "
593 "addition, unused memory allocated to the mempool "
594 "is shared with this cache (see -maxmempool).",
598 "-includeconf=<file>",
599 "Specify additional configuration file, relative to the -datadir path "
600 "(only useable from configuration file, not command line)",
602 argsman.
AddArg(
"-allowignoredconf",
603 strprintf(
"For backwards compatibility, treat an unused %s "
604 "file in the datadir as a warning, not an error.",
607 argsman.
AddArg(
"-loadblock=<file>",
608 "Imports blocks from external file on startup",
610 argsman.
AddArg(
"-maxmempool=<n>",
611 strprintf(
"Keep the transaction memory pool below <n> "
612 "megabytes (default: %u)",
615 argsman.
AddArg(
"-maxorphantx=<n>",
616 strprintf(
"Keep at most <n> unconnectable transactions in "
617 "memory (default: %u)",
620 argsman.
AddArg(
"-mempoolexpiry=<n>",
621 strprintf(
"Do not keep transactions in the mempool longer "
622 "than <n> hours (default: %u)",
626 "-minimumchainwork=<hex>",
628 "Minimum work assumed to exist on a valid chain in hex "
629 "(default: %s, testnet: %s)",
630 defaultChainParams->GetConsensus().nMinimumChainWork.GetHex(),
631 testnetChainParams->GetConsensus().nMinimumChainWork.GetHex()),
636 strprintf(
"Set the number of script verification threads (0 = auto, "
637 "up to %d, <0 = leave that many cores free, default: %d)",
640 argsman.
AddArg(
"-persistmempool",
641 strprintf(
"Whether to save the mempool on shutdown and load "
642 "on restart (default: %u)",
646 "-persistrecentheaderstime",
648 "Whether the node stores the recent headers reception time to a "
649 "file and load it upon startup. This is intended for mining nodes "
650 "to overestimate the real time target upon restart (default: %u)",
655 strprintf(
"Specify pid file. Relative paths will be prefixed "
656 "by a net-specific datadir location. (default: %s)",
661 strprintf(
"Reduce storage requirements by enabling pruning (deleting) "
662 "of old blocks. This allows the pruneblockchain RPC to be "
663 "called to delete specific blocks and enables automatic "
664 "pruning of old blocks if a target size in MiB is provided. "
665 "This mode is incompatible with -txindex and -rescan. "
666 "Warning: Reverting this setting requires re-downloading the "
667 "entire blockchain. (default: 0 = disable pruning blocks, "
668 "1 = allow manual pruning via RPC, >=%u = automatically "
669 "prune block files to stay under the specified target size "
674 "-reindex-chainstate",
675 "Rebuild chain state from the currently indexed blocks. When "
676 "in pruning mode or if blocks on disk might be corrupted, use "
677 "full -reindex instead.",
681 "Rebuild chain state and block index from the blk*.dat files on disk."
682 " This will also rebuild active optional indexes.",
687 "Specify path to dynamic settings data file. Can be disabled with "
688 "-nosettings. File is written at runtime and not meant to be "
689 "edited by users (use %s instead for custom settings). Relative "
690 "paths will be prefixed by datadir location. (default: %s)",
694 argsman.
AddArg(
"-startupnotify=<cmd>",
"Execute command on startup.",
697 "-shutdownnotify=<cmd>",
698 "Execute command immediately before beginning shutdown. The need for "
699 "shutdown may be urgent, so be careful not to delay it long (if the "
700 "command doesn't require interaction with the server, consider having "
701 "it fork into the background).",
707 "Create new files with system default permissions, instead of umask "
708 "077 (only effective with disabled wallet functionality)",
711 hidden_args.emplace_back(
"-sysperms");
713 argsman.
AddArg(
"-txindex",
714 strprintf(
"Maintain a full transaction index, used by the "
715 "getrawtransaction rpc call (default: %d)",
721 strprintf(
"Enable the Chronik indexer, which can be read via a "
722 "dedicated HTTP/Protobuf interface (default: %d)",
726 "-chronikbind=<addr>[:port]",
728 "Bind the Chronik indexer to the given address to listen for "
729 "HTTP/Protobuf connections to access the index. Unlike the "
730 "JSON-RPC, it's ok to have this publicly exposed on the internet. "
731 "This option can be specified multiple times (default: %s; default "
732 "port: %u, testnet: %u, regtest: %u)",
733 Join(chronik::DEFAULT_BINDS,
", "),
734 defaultBaseParams->ChronikPort(), testnetBaseParams->ChronikPort(),
735 regtestBaseParams->ChronikPort()),
739 argsman.
AddArg(
"-chroniktokenindex",
740 "Enable token indexing in Chronik (default: 1)",
742 argsman.
AddArg(
"-chroniklokadidindex",
743 "Enable LOKAD ID indexing in Chronik (default: 1)",
745 argsman.
AddArg(
"-chronikreindex",
746 "Reindex the Chronik indexer from genesis, but leave the "
747 "other indexes untouched",
750 "-chroniktxnumcachebuckets",
752 "Tuning param of the TxNumCache, specifies how many buckets "
753 "to use on the belt. Caution against setting this too high, "
754 "it may slow down indexing. Set to 0 to disable. (default: %d)",
755 chronik::DEFAULT_TX_NUM_CACHE_BUCKETS),
759 "-chroniktxnumcachebucketsize",
761 "Tuning param of the TxNumCache, specifies the size of each bucket "
762 "on the belt. Unlike the number of buckets, this may be increased "
763 "without much danger of slowing the indexer down. The total cache "
764 "size will be `num_buckets * bucket_size * 40B`, so by default the "
765 "cache will require %dkB of memory. (default: %d)",
766 chronik::DEFAULT_TX_NUM_CACHE_BUCKETS *
767 chronik::DEFAULT_TX_NUM_CACHE_BUCKET_SIZE * 40 / 1000,
768 chronik::DEFAULT_TX_NUM_CACHE_BUCKET_SIZE),
771 argsman.
AddArg(
"-chronikperfstats",
772 "Output some performance statistics (e.g. num cache hits, "
773 "seconds spent) into a <datadir>/perf folder. (default: 0)",
775 argsman.
AddArg(
"-chronikscripthashindex",
776 "Enable the scripthash index for the Chronik indexer "
777 "(default: 1 if chronikelectrumbind is set, 0 otherwise) ",
780 "-chronikelectrumbind=<addr>[:port][:t|s|w|y]",
782 "Bind the Chronik Electrum interface to the given "
783 "address:port:protocol. If not set, the Electrum interface will "
784 "not start. This option can be specified multiple times. The "
785 "protocol is selected by a single letter, where 't' means TCP, 's' "
786 "means TLS, 'w' means WS and 'y' means WSS. If TLS and/or WSS is "
787 "selected, the certificate chain and private key must both be "
788 "passed (see -chronikelectrumcert and -chronikelectrumprivkey "
789 "(default: disabled; default port: %u, testnet: %u, regtest: %u; "
790 "default protocol: TLS)",
791 defaultBaseParams->ChronikElectrumPort(),
792 testnetBaseParams->ChronikElectrumPort(),
793 regtestBaseParams->ChronikElectrumPort()),
798 "-chronikelectrumcert",
799 "Path to the certificate file to be used by the Chronik Electrum "
800 "server when the TLS protocol is selected. The file should contain "
801 "the whole certificate chain (typically a .pem file). If used the "
802 "-chronikelectrumprivkey must be set as well.",
807 "-chronikelectrumprivkey",
808 "Path to the private key file to be used by the Chronik Electrum "
809 "server when the TLS protocol is selected. If used the "
810 "-chronikelectrumcert must be set as well.",
815 "-chronikelectrumurl",
816 "The URL to advertise to the Electrum peers. This needs to be set to "
817 "the server public URL to instruct the other Electrum peers that they "
818 "don't have to drop the connection. See the 'hosts' key in "
819 "https://electrum-cash-protocol.readthedocs.io/en/latest/"
820 "protocol-methods.html#server.features (default: 127.0.0.1).",
825 "-chronikelectrummaxhistory",
826 strprintf(
"Largest tx history we are willing to serve. (default: %u)",
827 chronik::DEFAULT_ELECTRUM_MAX_HISTORY),
831 "-chronikelectrumdonationaddress",
833 "The server donation address. No checks are done on the server "
834 "side to ensure this is a valid eCash address, it is just relayed "
835 "to clients verbatim as a text string (%u characters maximum).",
836 chronik::MAX_LENGTH_DONATION_ADDRESS),
840 "-chronikelectrumpeersvalidationinterval",
842 "The peers submitted via the Chronik Electrum server.add_peer "
843 "endpoint are periodically checked for validity and are only "
844 "returned after they passed the validation. This option controls "
845 "the interval duration between successive peers validation "
846 "processes in seconds (default: %u). Setting this value to 0 "
847 "disables the peer validation completely.",
848 std::chrono::duration_cast<std::chrono::seconds>(
849 chronik::DEFAULT_ELECTRUM_PEER_VALIDATION_INTERVAL)
854 "-chronikelectrumidletimeout",
856 "Drop Chronik Electrum clients that send no data for this many "
857 "seconds (default: %u). Set to 0 to disable. Healthy Electrum ABC "
858 "clients send server.ping every 5 minutes, so the default keeps "
859 "them connected while reclaiming silent or abandoned sessions.",
860 std::chrono::duration_cast<std::chrono::seconds>(
861 chronik::DEFAULT_ELECTRUM_IDLE_TIMEOUT)
868 "Maximum number of simultaneous Chronik subscriptions (WebSocket "
869 "and Electrum) across all clients (default: %u).",
870 chronik::DEFAULT_MAX_SUBS),
874 "-chronikmaxsubsperip",
876 "Maximum number of simultaneous Chronik subscriptions (WebSocket "
877 "and Electrum) per client IP address (default: %u).",
878 chronik::DEFAULT_MAX_SUBS_PER_IP),
882 "-chroniksubsmaxscriptsize",
883 strprintf(
"Maximum script size in bytes for Chronik WebSocket script "
884 "subscriptions (default: %u).",
885 chronik::DEFAULT_SUBSCRIPTION_MAX_SCRIPT_SIZE),
889 "-chroniksubsmaxpluginsize",
890 strprintf(
"Maximum plugin group size in bytes for Chronik WebSocket "
891 "plugin subscriptions (default: %u).",
892 chronik::DEFAULT_SUBSCRIPTION_MAX_PLUGIN_SIZE),
897 "-blockfilterindex=<type>",
898 strprintf(
"Maintain an index of compact filters by block "
899 "(default: %s, values: %s).",
901 " If <type> is not supplied or if <type> = 1, indexes for "
902 "all known types are enabled.",
906 strprintf(
"Use Cash Address for destination encoding instead of legacy "
907 "base58 addresses (default: %d)",
913 "Add a node to connect to and attempt to keep the connection "
914 "open (see the `addnode` RPC command help for more info)",
917 argsman.
AddArg(
"-asmap=<file>",
918 strprintf(
"Specify asn mapping used for bucketing of the "
919 "peers (default: %s). Relative paths will be "
920 "prefixed by the net-specific datadir location.",
923 argsman.
AddArg(
"-bantime=<n>",
924 strprintf(
"Default duration (in seconds) of manually "
925 "configured bans (default: %u)",
929 "-bind=<addr>[:<port>][=onion]",
930 strprintf(
"Bind to given address and always listen on it (default: "
931 "0.0.0.0). Use [host]:port notation for IPv6. Append =onion "
932 "to tag any incoming connections to that address and port as "
933 "incoming Tor connections (default: 127.0.0.1:%u=onion, "
934 "testnet: 127.0.0.1:%u=onion, regtest: 127.0.0.1:%u=onion)",
935 defaultBaseParams->OnionServiceTargetPort(),
936 testnetBaseParams->OnionServiceTargetPort(),
937 regtestBaseParams->OnionServiceTargetPort()),
942 "Connect only to the specified node(s); -noconnect disables automatic "
943 "connections (the rules for this peer are the same as for -addnode)",
948 "Discover own IP addresses (default: 1 when listening and no "
949 "-externalip or -proxy)",
952 strprintf(
"Allow DNS lookups for -addnode, -seednode and "
953 "-connect (default: %d)",
959 "Query for peer addresses via DNS lookup, if low on addresses "
960 "(default: %u unless -connect used)",
963 argsman.
AddArg(
"-externalip=<ip>",
"Specify your own public address",
968 "Allow fixed seeds if DNS seeds don't provide peers (default: %u)",
974 "Always query for peer addresses via DNS lookup (default: %d)",
977 argsman.
AddArg(
"-overridednsseed",
978 "If set, only use the specified DNS seed when "
979 "querying for peer addresses via DNS lookup.",
983 "Accept connections from outside (default: 1 if no -proxy or -connect)",
987 strprintf(
"Automatically create Tor onion service (default: %d)",
991 "-maxconnections=<n>",
992 strprintf(
"Maintain at most <n> connections to peers. The effective "
993 "limit depends on system limitations and might be lower than "
994 "the specified value (default: %u)",
997 argsman.
AddArg(
"-maxreceivebuffer=<n>",
998 strprintf(
"Maximum per-connection receive buffer, <n>*1000 "
999 "bytes (default: %u)",
1003 "-maxsendbuffer=<n>",
1005 "Maximum per-connection send buffer, <n>*1000 bytes (default: %u)",
1009 "-maxtimeadjustment",
1010 strprintf(
"Maximum allowed median peer time offset adjustment. Local "
1011 "perspective of time may be influenced by peers forward or "
1012 "backward by this amount. (default: %u seconds)",
1016 argsman.
AddArg(
"-onion=<ip:port|path>",
1017 "Use separate SOCKS5 proxy to reach peers via Tor onion "
1018 "services, set -noonion to disable (default: -proxy). May "
1019 "be a local file path prefixed with 'unix:'.",
1024 strprintf(
"Use separate SOCKS5 proxy to reach peers via Tor "
1025 "onion services, set -noonion to disable (default: %s)",
1029 argsman.
AddArg(
"-i2psam=<ip:port>",
1030 "I2P SAM proxy to reach I2P peers and accept I2P "
1031 "connections (default: none)",
1034 "-i2pacceptincoming",
1035 "If set and -i2psam is also set then incoming I2P connections are "
1036 "accepted via the SAM proxy. If this is not set but -i2psam is set "
1037 "then only outgoing connections will be made to the I2P network. "
1038 "Ignored if -i2psam is not set. Listening for incoming I2P connections "
1039 "is done through the SAM proxy, not by binding to a local address and "
1040 "port (default: 1)",
1045 "Make outgoing connections only through network <net> (" +
1047 "). Incoming connections are not affected by this option. This "
1048 "option can be specified multiple times to allow multiple "
1051 argsman.
AddArg(
"-peerbloomfilters",
1052 strprintf(
"Support filtering of blocks and transaction with "
1053 "bloom filters (default: %d)",
1057 "-peerblockfilters",
1059 "Serve compact block filters to peers per BIP 157 (default: %u)",
1062 argsman.
AddArg(
"-permitbaremultisig",
1063 strprintf(
"Relay non-P2SH multisig (default: %d)",
1069 argsman.
AddArg(
"-port=<port>",
1070 strprintf(
"Listen for connections on <port>. Nodes not "
1071 "using the default ports (default: %u, "
1072 "testnet: %u, regtest: %u) are unlikely to get "
1073 "incoming connections. Not relevant for I2P (see "
1075 defaultChainParams->GetDefaultPort(),
1076 testnetChainParams->GetDefaultPort(),
1077 regtestChainParams->GetDefaultPort()),
1081 argsman.
AddArg(
"-proxy=<ip:port|path>",
1082 "Connect through SOCKS5 proxy, set -noproxy to disable "
1083 "(default: disabled). May be a local file path prefixed "
1084 "with 'unix:' if the proxy supports it.",
1088 argsman.
AddArg(
"-proxy=<ip:port>",
1089 "Connect through SOCKS5 proxy, set -noproxy to disable "
1090 "(default: disabled)",
1096 strprintf(
"Randomize credentials for every proxy connection. "
1097 "This enables Tor stream isolation (default: %d)",
1102 "Connect to a node to retrieve peer addresses, and disconnect",
1106 "Enable all P2P network activity (default: 1). Can be changed "
1107 "by the setnetworkactive RPC command",
1109 argsman.
AddArg(
"-timeout=<n>",
1110 strprintf(
"Specify connection timeout in milliseconds "
1111 "(minimum: 1, default: %d)",
1116 strprintf(
"Specify p2p connection timeout in seconds. This option "
1117 "determines the amount of time a peer may be inactive before "
1118 "the connection to it is dropped. (minimum: 1, default: %d)",
1122 "-torcontrol=<ip>:<port>",
1124 "Tor control port to use if onion listening enabled (default: %s)",
1127 argsman.
AddArg(
"-torpassword=<pass>",
1128 "Tor control port password (default: empty)",
1138 strprintf(
"Use PCP or NAT-PMP to map the listening port (default: %u)",
1142 "-whitebind=<[permissions@]addr>",
1143 "Bind to the given address and add permission flags to the peers "
1145 "Use [host]:port notation for IPv6. Allowed permissions: " +
1148 "Specify multiple permissions separated by commas (default: "
1149 "download,noban,mempool,relay). Can be specified multiple times.",
1152 argsman.
AddArg(
"-whitelist=<[permissions@]IP address or network>",
1153 "Add permission flags to the peers using the given "
1154 "IP address (e.g. 1.2.3.4) or CIDR-notated network "
1155 "(e.g. 1.2.3.0/24). "
1156 "Uses the same permissions as -whitebind. "
1157 "Additional flags \"in\" and \"out\" control whether "
1158 "permissions apply to incoming connections and/or manual "
1159 "(default: incoming only). "
1160 "Can be specified multiple times.",
1163 "-maxuploadtarget=<n>",
1164 strprintf(
"Tries to keep outbound traffic under the given target (in "
1165 "MiB per 24h). Limit does not apply to peers with 'download' "
1166 "permission. 0 = no limit (default: %d)",
1173 argsman.
AddArg(
"-zmqpubhashblock=<address>",
1174 "Enable publish hash block in <address>",
1176 argsman.
AddArg(
"-zmqpubhashtx=<address>",
1177 "Enable publish hash transaction in <address>",
1179 argsman.
AddArg(
"-zmqpubrawblock=<address>",
1180 "Enable publish raw block in <address>",
1182 argsman.
AddArg(
"-zmqpubrawtx=<address>",
1183 "Enable publish raw transaction in <address>",
1185 argsman.
AddArg(
"-zmqpubsequence=<address>",
1186 "Enable publish hash block and tx sequence in <address>",
1189 "-zmqpubhashblockhwm=<n>",
1190 strprintf(
"Set publish hash block outbound message high water "
1191 "mark (default: %d)",
1195 "-zmqpubhashtxhwm=<n>",
1196 strprintf(
"Set publish hash transaction outbound message high "
1197 "water mark (default: %d)",
1201 "-zmqpubrawblockhwm=<n>",
1202 strprintf(
"Set publish raw block outbound message high water "
1203 "mark (default: %d)",
1207 "-zmqpubrawtxhwm=<n>",
1208 strprintf(
"Set publish raw transaction outbound message high "
1209 "water mark (default: %d)",
1212 argsman.
AddArg(
"-zmqpubsequencehwm=<n>",
1213 strprintf(
"Set publish hash sequence message high water mark"
1218 hidden_args.emplace_back(
"-zmqpubhashblock=<address>");
1219 hidden_args.emplace_back(
"-zmqpubhashtx=<address>");
1220 hidden_args.emplace_back(
"-zmqpubrawblock=<address>");
1221 hidden_args.emplace_back(
"-zmqpubrawtx=<address>");
1222 hidden_args.emplace_back(
"-zmqpubsequence=<n>");
1223 hidden_args.emplace_back(
"-zmqpubhashblockhwm=<n>");
1224 hidden_args.emplace_back(
"-zmqpubhashtxhwm=<n>");
1225 hidden_args.emplace_back(
"-zmqpubrawblockhwm=<n>");
1226 hidden_args.emplace_back(
"-zmqpubrawtxhwm=<n>");
1227 hidden_args.emplace_back(
"-zmqpubsequencehwm=<n>");
1232 strprintf(
"How many blocks to check at startup (default: %u, 0 = all)",
1236 argsman.
AddArg(
"-checklevel=<n>",
1237 strprintf(
"How thorough the block verification of "
1238 "-checkblocks is: %s (0-4, default: %u)",
1242 argsman.
AddArg(
"-checkblockindex",
1243 strprintf(
"Do a consistency check for the block tree, "
1244 "chainstate, and other validation data structures "
1245 " every <n> operations. Use 0 to disable. "
1246 "(default: %u, regtest: %u)",
1247 defaultChainParams->DefaultConsistencyChecks(),
1248 regtestChainParams->DefaultConsistencyChecks()),
1251 argsman.
AddArg(
"-checkaddrman=<n>",
1252 strprintf(
"Run addrman consistency checks every <n> "
1253 "operations. Use 0 to disable. (default: %u)",
1258 "-checkmempool=<n>",
1259 strprintf(
"Run mempool consistency checks every <n> transactions. Use "
1260 "0 to disable. (default: %u, regtest: %u)",
1261 defaultChainParams->DefaultConsistencyChecks(),
1262 regtestChainParams->DefaultConsistencyChecks()),
1265 argsman.
AddArg(
"-checkpoints",
1266 strprintf(
"Only accept block chain matching built-in "
1267 "checkpoints (default: %d)",
1271 argsman.
AddArg(
"-deprecatedrpc=<method>",
1272 "Allows deprecated RPC method(s) to be used",
1276 "-stopafterblockimport",
1277 strprintf(
"Stop running after importing blocks from disk (default: %d)",
1281 argsman.
AddArg(
"-stopatheight",
1282 strprintf(
"Stop running after reaching the given height in "
1283 "the main chain (default: %u)",
1287 argsman.
AddArg(
"-addrmantest",
"Allows to test address relay on localhost",
1290 argsman.
AddArg(
"-capturemessages",
"Capture all P2P messages to disk",
1293 argsman.
AddArg(
"-mocktime=<n>",
1299 "-maxsigcachesize=<n>",
1300 strprintf(
"Limit size of signature cache to <n> MiB (default: %u)",
1305 "-maxscriptcachesize=<n>",
1306 strprintf(
"Limit size of script cache to <n> MiB (default: %u)",
1310 argsman.
AddArg(
"-maxtipage=<n>",
1311 strprintf(
"Maximum tip age in seconds to consider node in "
1312 "initial block download (default: %u)",
1317 argsman.
AddArg(
"-uacomment=<cmt>",
1318 "Append comment to the user agent string",
1320 argsman.
AddArg(
"-uaclientname=<clientname>",
"Set user agent client name",
1322 argsman.
AddArg(
"-uaclientversion=<clientversion>",
1331 "Relay and mine \"non-standard\" transactions (%sdefault: %u)",
1332 "testnet/regtest only; ", defaultChainParams->RequireStandard()),
1335 argsman.
AddArg(
"-excessiveblocksize=<n>",
1336 strprintf(
"Do not accept blocks larger than this limit, in "
1337 "bytes (default: %d)",
1343 "-dustrelayfee=<amt>",
1344 strprintf(
"Fee rate (in %s/kB) used to define dust, the value of an "
1345 "output such that it will cost more than its value in "
1346 "fees at this fee rate to spend it. (default: %s)",
1352 "-bytespersigcheck",
1353 strprintf(
"Equivalent bytes per sigCheck in transactions for relay and "
1354 "mining (default: %u).",
1359 strprintf(
"DEPRECATED: Equivalent bytes per sigCheck in transactions "
1360 "for relay and mining (default: %u). This has been "
1361 "deprecated since v0.26.8 and will be removed in the future, "
1362 "please use -bytespersigcheck instead.",
1367 strprintf(
"Relay and mine data carrier transactions (default: %d)",
1372 strprintf(
"Maximum size of data in data carrier transactions "
1373 "we relay and mine (default: %u)",
1377 "-minrelaytxfee=<amt>",
1378 strprintf(
"Fees (in %s/kB) smaller than this are rejected for "
1379 "relaying, mining and transaction creation (default: %s)",
1384 strprintf(
"Add 'relay' permission to whitelisted peers "
1385 "with default permissions. This will accept relayed "
1386 "transactions even when not relaying transactions "
1391 "-whitelistforcerelay",
1392 strprintf(
"Add 'forcerelay' permission to whitelisted peers "
1393 "with default permissions. This will relay transactions "
1394 "even if the transactions were already in the mempool "
1399 argsman.
AddArg(
"-blockmaxsize=<n>",
1400 strprintf(
"Set maximum block size in bytes (default: %d)",
1404 "-blockmintxfee=<amt>",
1405 strprintf(
"Set lowest fee rate (in %s/kB) for transactions to "
1406 "be included in block creation. (default: %s)",
1409 argsman.
AddArg(
"-simplegbt",
1410 "Use a simplified getblocktemplate output (default: 0)",
1413 argsman.
AddArg(
"-blockversion=<n>",
1414 "Override block version to test forking scenarios",
1418 argsman.
AddArg(
"-server",
"Accept command line and JSON-RPC commands",
1421 strprintf(
"Accept public REST requests (default: %d)",
1425 "-rpcbind=<addr>[:port]",
1426 "Bind to given address to listen for JSON-RPC connections. Do not "
1427 "expose the RPC server to untrusted networks such as the public "
1428 "internet! This option is ignored unless -rpcallowip is also passed. "
1429 "Port is optional and overrides -rpcport. Use [host]:port notation "
1430 "for IPv6. This option can be specified multiple times (default: "
1431 "127.0.0.1 and ::1 i.e., localhost)",
1437 strprintf(
"Throw a non-fatal error at runtime if the documentation for "
1438 "an RPC is incorrect (default: %u)",
1442 "-rpccookiefile=<loc>",
1443 "Location of the auth cookie. Relative paths will be prefixed "
1444 "by a net-specific datadir location. (default: data dir)",
1446 argsman.
AddArg(
"-rpcuser=<user>",
"Username for JSON-RPC connections",
1449 argsman.
AddArg(
"-rpcpassword=<pw>",
"Password for JSON-RPC connections",
1453 "-rpcwhitelist=<whitelist>",
1454 "Set a whitelist to filter incoming RPC calls for a specific user. The "
1455 "field <whitelist> comes in the format: <USERNAME>:<rpc 1>,<rpc "
1456 "2>,...,<rpc n>. If multiple whitelists are set for a given user, they "
1457 "are set-intersected. See -rpcwhitelistdefault documentation for "
1458 "information on default whitelist behavior.",
1461 "-rpcwhitelistdefault",
1462 "Sets default behavior for rpc whitelisting. Unless "
1463 "rpcwhitelistdefault is set to 0, if any -rpcwhitelist is set, the rpc "
1464 "server acts as if all rpc users are subject to "
1465 "empty-unless-otherwise-specified whitelists. If rpcwhitelistdefault "
1466 "is set to 1 and no -rpcwhitelist is set, rpc server acts as if all "
1467 "rpc users are subject to empty whitelists.",
1470 "-rpcauth=<userpw>",
1471 "Username and HMAC-SHA-256 hashed password for JSON-RPC connections. "
1472 "The field <userpw> comes in the format: <USERNAME>:<SALT>$<HASH>. A "
1473 "canonical python script is included in share/rpcauth. The client then "
1474 "connects normally using the rpcuser=<USERNAME>/rpcpassword=<PASSWORD> "
1475 "pair of arguments. This option can be specified multiple times",
1477 argsman.
AddArg(
"-rpcport=<port>",
1478 strprintf(
"Listen for JSON-RPC connections on <port> "
1479 "(default: %u, testnet: %u, regtest: %u)",
1480 defaultBaseParams->RPCPort(),
1481 testnetBaseParams->RPCPort(),
1482 regtestBaseParams->RPCPort()),
1487 "Allow JSON-RPC connections from specified source. Valid for "
1488 "<ip> are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. "
1489 "1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). "
1490 "This option can be specified multiple times",
1495 "Set the number of threads to service RPC calls (default: %d)",
1499 "-rpccorsdomain=value",
1500 "Domain from which to accept cross origin requests (browser enforced)",
1503 argsman.
AddArg(
"-rpcworkqueue=<n>",
1504 strprintf(
"Set the depth of the work queue to service RPC "
1505 "calls (default: %d)",
1509 argsman.
AddArg(
"-rpcservertimeout=<n>",
1510 strprintf(
"Timeout during HTTP requests (default: %d)",
1516 argsman.
AddArg(
"-daemon",
1517 strprintf(
"Run in the background as a daemon and accept "
1518 "commands (default: %d)",
1521 argsman.
AddArg(
"-daemonwait",
1522 strprintf(
"Wait for initialization to be finished before "
1523 "exiting. This implies -daemon (default: %d)",
1527 hidden_args.emplace_back(
"-daemon");
1528 hidden_args.emplace_back(
"-daemonwait");
1532 argsman.
AddArg(
"-avalanche",
1533 strprintf(
"Enable the avalanche feature (default: %u)",
1537 "-avalanchestakingrewards",
1538 strprintf(
"Enable the avalanche staking rewards feature (default: %u, "
1539 "testnet: %u, regtest: %u)",
1540 defaultChainParams->GetConsensus().enableStakingRewards,
1541 testnetChainParams->GetConsensus().enableStakingRewards,
1542 regtestChainParams->GetConsensus().enableStakingRewards),
1544 argsman.
AddArg(
"-avalanchestakingpreconsensus",
1545 strprintf(
"Enable the avalanche staking rewards "
1546 "preconsensus feature (default: %u)",
1550 "-avalanchepreconsensus",
1551 strprintf(
"Enable the avalanche preconsensus feature (default: %u)",
1554 argsman.
AddArg(
"-avalanchepreconsensusmining",
1555 strprintf(
"Enable mining only the avalanche finalized "
1556 "transactions (default: %u)",
1559 argsman.
AddArg(
"-avalancheconflictingproofcooldown",
1560 strprintf(
"Mandatory cooldown before a proof conflicting "
1561 "with an already registered one can be considered "
1562 "in seconds (default: %u)",
1566 argsman.
AddArg(
"-avalanchepeerreplacementcooldown",
1567 strprintf(
"Mandatory cooldown before a peer can be replaced "
1568 "in seconds (default: %u)",
1573 "-avaminquorumstake",
1575 "Minimum amount of known stake for a usable quorum (default: %s)",
1579 "-avaminquorumconnectedstakeratio",
1580 strprintf(
"Minimum proportion of known stake we"
1581 " need nodes for to have a usable quorum (default: %s). "
1582 "This parameter is parsed with a maximum precision of "
1588 "-avaminavaproofsnodecount",
1589 strprintf(
"Minimum number of node that needs to send us an avaproofs"
1590 " message before we consider we have a usable quorum"
1596 "-avastalevotethreshold",
1597 strprintf(
"Number of avalanche votes before a voted item goes stale "
1598 "when voting confidence is low (default: %u)",
1603 "-avastalevotefactor",
1605 "Factor affecting the number of avalanche votes before a voted "
1606 "item goes stale when voting confidence is high (default: %u)",
1610 argsman.
AddArg(
"-avacooldown",
1611 strprintf(
"Mandatory cooldown between two avapoll in "
1612 "milliseconds (default: %u)",
1617 strprintf(
"Avalanche query timeout in milliseconds (default: %u)",
1621 "-avamaxelementpoll",
1622 strprintf(
"Maximum number of elements to include and accept in an "
1623 "avapoll (default: %u)",
1628 "Avalanche proof delegation to the master key used by this node "
1629 "(default: none). Should be used in conjunction with -avaproof and "
1632 argsman.
AddArg(
"-avaproof",
1633 "Avalanche proof to be used by this node (default: none)",
1636 "-avaproofstakeutxoconfirmations",
1638 "Minimum number of confirmations before a stake utxo is mature"
1639 " enough to be included into a proof. Utxos in the mempool are not "
1640 "accepted (i.e this value must be greater than 0) (default: %s)",
1644 argsman.
AddArg(
"-avaproofstakeutxodustthreshold",
1645 strprintf(
"Minimum value each stake utxo must have to be "
1646 "considered valid (default: %s)",
1649 argsman.
AddArg(
"-avamasterkey",
1650 "Master key associated with the proof. If a proof is "
1651 "required, this is mandatory.",
1654 argsman.
AddArg(
"-avasessionkey",
"Avalanche session key (default: random)",
1657 argsman.
AddArg(
"-enablertt",
1658 strprintf(
"Whether to enforce Real Time Targeting via "
1659 "Avalanche, default (%u)",
1663 "-maxavalancheoutbound",
1665 "Set the maximum number of avalanche outbound peers to connect to. "
1666 "Note that this option takes precedence over the -maxconnections "
1667 "option (default: %u).",
1673 strprintf(
"Whether to save the avalanche peers upon shutdown and load "
1674 "them upon startup (default: %u).",
1687 if (pBlockIndex !=
nullptr) {
1697static void StartupNotify(
const ArgsManager &args) {
1698 std::string cmd = args.
GetArg(
"-startupnotify",
"");
1700 std::thread t(runCommand, cmd);
1738 "%s: parameter interaction: -bind set -> setting -listen=1\n",
1744 LogPrintf(
"%s: parameter interaction: -whitebind set -> setting "
1754 LogPrintf(
"%s: parameter interaction: -connect set -> setting "
1759 LogPrintf(
"%s: parameter interaction: -connect set -> setting "
1770 "%s: parameter interaction: -proxy set -> setting -listen=0\n",
1778 "%s: parameter interaction: -proxy set -> setting -natpmp=0\n",
1783 LogPrintf(
"%s: parameter interaction: -proxy set -> setting "
1794 "%s: parameter interaction: -listen=0 -> setting -natpmp=0\n",
1799 "%s: parameter interaction: -listen=0 -> setting -discover=0\n",
1803 LogPrintf(
"%s: parameter interaction: -listen=0 -> setting "
1808 LogPrintf(
"%s: parameter interaction: -listen=0 -> setting "
1809 "-i2pacceptincoming=0\n",
1814 if (args.
IsArgSet(
"-externalip")) {
1817 LogPrintf(
"%s: parameter interaction: -externalip set -> setting "
1826 LogPrintf(
"%s: parameter interaction: -blocksonly=1 -> setting "
1827 "-whitelistrelay=0\n",
1836 LogPrintf(
"%s: parameter interaction: -whitelistforcerelay=1 -> "
1837 "setting -whitelistrelay=1\n",
1844 const bool fAvalanche =
1864int nUserMaxConnections;
1867int64_t peer_connect_timeout;
1868std::set<BlockFilterType> g_enabled_filter_types;
1876 std::set_new_handler(std::terminate);
1877 LogPrintf(
"Error: Out of memory. Terminating.\n");
1887 _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
1888 _CrtSetReportFile(_CRT_WARN, CreateFileA(
"NUL", GENERIC_WRITE, 0,
nullptr,
1889 OPEN_EXISTING, 0, 0));
1891 _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
1895 SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
1915 signal(SIGPIPE, SIG_IGN);
1917 SetConsoleCtrlHandler(consoleCtrlHandler,
true);
1938 strprintf(
_(
"Config setting for %s only applied on %s "
1939 "network when in [%s] section.") +
1944 if (!errors.
empty()) {
1952 _(
"Section [%s] is not recognized.") +
1954 section.m_file, section.m_line, section.m_name);
1957 if (!warnings.
empty()) {
1963 strprintf(
_(
"Specified blocks directory \"%s\" does not exist."),
1964 args.
GetArg(
"-blocksdir",
"")));
1968 std::string blockfilterindex_value =
1970 if (blockfilterindex_value ==
"" || blockfilterindex_value ==
"1") {
1972 }
else if (blockfilterindex_value !=
"0") {
1973 const std::vector<std::string> names =
1974 args.
GetArgs(
"-blockfilterindex");
1975 for (
const auto &
name : names) {
1981 g_enabled_filter_types.insert(filter_type);
1990 _(
"Cannot set -peerblockfilters without -blockfilterindex."));
1998 return InitError(
_(
"Prune mode is incompatible with -txindex."));
2000 if (args.
GetBoolArg(
"-reindex-chainstate",
false)) {
2002 _(
"Prune mode is incompatible with -reindex-chainstate. Use "
2003 "full -reindex instead."));
2006 return InitError(
_(
"Prune mode is incompatible with -chronik."));
2012 args.
GetArgs(
"-bind").size() + args.
GetArgs(
"-whitebind").size();
2015 "Cannot set -bind or -whitebind together with -listen=0"));
2019 int nBind = std::max(nUserBind,
size_t(1));
2020 nUserMaxConnections =
2022 nMaxConnections = std::max(nUserMaxConnections, 0);
2025 const int maxAvalancheOutbound = args.
GetIntArg(
2027 const bool fAvalanche =
2029 if (fAvalanche && maxAvalancheOutbound > nMaxConnections) {
2030 nMaxConnections = std::max(maxAvalancheOutbound, nMaxConnections);
2032 LogPrintf(
"Increasing -maxconnections from %d to %d to comply with "
2033 "-maxavalancheoutbound\n",
2034 nUserMaxConnections, nMaxConnections);
2046 int fd_max = FD_SETSIZE;
2048 nMaxConnections = std::max(
2049 std::min<int>(nMaxConnections,
2054 return InitError(
_(
"Not enough file descriptors available."));
2060 if (nMaxConnections < nUserMaxConnections) {
2064 LogPrintf(
"Reducing -maxconnections from %d to %d, because of system "
2066 nUserMaxConnections, nMaxConnections);
2074 const int64_t nProposedExcessiveBlockSize =
2076 if (nProposedExcessiveBlockSize <= 0 ||
2079 _(
"Excessive block size must be > 1,000,000 bytes (1MB)"));
2083 const int64_t nProposedMaxGeneratedBlockSize =
2085 if (nProposedMaxGeneratedBlockSize <= 0) {
2086 return InitError(
_(
"Max generated block size must be greater than 0"));
2088 if (uint64_t(nProposedMaxGeneratedBlockSize) > config.
GetMaxBlockSize()) {
2089 return InitError(
_(
"Max generated block size (blockmaxsize) cannot "
2090 "exceed the excessive block size "
2091 "(excessiveblocksize)"));
2099 peer_connect_timeout =
2101 if (peer_connect_timeout <= 0) {
2103 "peertimeout cannot be configured with a negative value."));
2109 if (args.
IsArgSet(
"-blockmintxfee")) {
2113 args.
GetArg(
"-blockmintxfee",
"")));
2134 const int64_t stakeUtxoMinConfirmations =
2135 args.
GetIntArg(
"-avaproofstakeutxoconfirmations",
2139 stakeUtxoMinConfirmations !=
2141 return InitError(
_(
"Avalanche stake UTXO minimum confirmations can "
2142 "only be set on test chains."));
2145 if (stakeUtxoMinConfirmations <= 0) {
2146 return InitError(
_(
"Avalanche stake UTXO minimum confirmations must be "
2147 "a positive integer."));
2150 if (args.
IsArgSet(
"-avaproofstakeutxodustthreshold")) {
2153 args.
GetArg(
"-avaproofstakeutxodustthreshold",
""), amount);
2156 "avaproofstakeutxodustthreshold",
2157 args.
GetArg(
"-avaproofstakeutxodustthreshold",
"")));
2162 return InitError(
_(
"Avalanche stake UTXO dust threshold can "
2163 "only be set on test chains."));
2168 if (fAvalanche && args.
IsArgSet(
"-avaproof")) {
2170 return InitError(
_(
"Running a staking node requires accepting "
2171 "inbound connections. Please enable -listen."));
2174 return InitError(
_(
"Running a staking node behind a proxy is not "
2175 "supported. Please disable -proxy."));
2178 return InitError(
_(
"Running a staking node behind I2P is not "
2179 "supported. Please disable -i2psam."));
2183 _(
"Restricting the outbound network is not supported when "
2184 "running a staking node. Please disable -onlynet."));
2188 _(
"Running a staking node in -blocksonly mode is not "
2189 "supported. Please disable -blocksonly."));
2199 .notifications = notifications,
2204 BlockManager::Options blockman_opts_dummy{
2205 .chainparams = chainman_opts_dummy.config.GetChainParams(),
2207 .notifications = chainman_opts_dummy.notifications,
2223 strprintf(
_(
"Cannot obtain a lock on data directory %s. %s is "
2224 "probably already running."),
2230 _(
"Cannot write to data directory '%s'; check permissions."),
2242 _(
"Initialization sanity check failed. %s is shutting down."),
2291 LogPrintf(
"Using at most %i automatic connections (%i file descriptors "
2293 nMaxConnections, nFD);
2297 !args.
GetPathArg(
"-datadir").is_absolute()) {
2298 LogPrintf(
"Warning: relative datadir option '%s' specified, which will "
2299 "be interpreted relative to the current working directory "
2300 "'%s'. This is fragile, because if bitcoin is started in the "
2301 "future from a different location, it will be unable to "
2302 "locate the current data files. There could also be data "
2303 "loss if bitcoin is started while in a temporary "
2305 args.
GetArg(
"-datadir",
""),
2310 node.scheduler = std::make_unique<CScheduler>();
2311 auto &scheduler = *
node.scheduler;
2314 scheduler.m_service_thread =
2316 [&] {
node.scheduler->serviceQueue(); });
2319 scheduler.scheduleEvery(
2324 std::chrono::minutes{1});
2328 [&scheduler](
auto func,
auto window) {
2329 scheduler.scheduleEvery(std::move(func), window);
2333 LogInfo(
"Log rate limiting disabled\n");
2337 scheduler.scheduleEvery(
2339 constexpr uint64_t min_disk_space = 250_MiB;
2341 LogPrintf(
"Shutting down due to lack of disk space!\n");
2346 std::chrono::minutes{5});
2349 node.validation_signals = std::make_unique<ValidationSignals>(
2350 std::make_unique<SerialTaskRunner>(scheduler));
2351 auto &validation_signals = *
node.validation_signals;
2358 for (
const auto &client :
node.chain_clients) {
2359 client->registerRpcs();
2375 _(
"Unable to start HTTP server. See debug log for details."));
2380 for (
const auto &client :
node.chain_clients) {
2381 if (!client->verify()) {
2401 std::vector<bool> asmap;
2405 if (!asmap_path.is_absolute()) {
2414 if (asmap.size() == 0) {
2420 LogPrintf(
"Using asmap version %s for IP bucketing\n",
2423 LogPrintf(
"Using /16 prefix for IP bucketing\n");
2426 uiInterface.InitMessage(
_(
"Loading P2P addresses...").translated);
2427 auto addrman{
LoadAddrman(chainparams, asmap, args)};
2431 node.addrman = std::move(*addrman);
2436 node.banman = std::make_unique<BanMan>(
2440 node.connman = std::make_unique<CConnman>(
2445 for (
const std::string port_option : {
2450 const std::string port = args.
GetArg(port_option,
"");
2458 for ([[maybe_unused]]
const auto &[arg, supports_unix_socket] :
2459 std::vector<std::pair<std::string, bool>>{
2464 {
"-rpcbind",
false},
2465 {
"-torcontrol",
false},
2466 {
"-whitebind",
false},
2467 {
"-zmqpubhashblock",
true},
2468 {
"-zmqpubhashtx",
true},
2469 {
"-zmqpubrawblock",
true},
2470 {
"-zmqpubrawtx",
true},
2471 {
"-zmqpubsequence",
true},
2473 for (
const std::string &socket_addr : args.
GetArgs(arg)) {
2474 std::string host_out;
2475 uint16_t port_out{0};
2480 if (!supports_unix_socket ||
2491 for (
const std::string &socket_addr : args.
GetArgs(
"-bind")) {
2492 std::string host_out;
2493 uint16_t port_out{0};
2494 std::string bind_socket_addr =
2495 socket_addr.substr(0, socket_addr.rfind(
'='));
2502 std::vector<std::string> uacomments;
2503 for (
const std::string &cmt : args.
GetArgs(
"-uacomment")) {
2506 _(
"User Agent comment (%s) contains unsafe characters."), cmt));
2508 uacomments.push_back(cmt);
2511 const std::string client_version =
2515 _(
"-uaclientname (%s) contains invalid characters."), client_name));
2517 if (client_version !=
2520 strprintf(
_(
"-uaclientversion (%s) contains invalid characters."),
2523 const std::string strSubVersion =
2527 _(
"Total length of network version string (%i) exceeds maximum "
2528 "length (%i). Reduce the number or size of uacomments."),
2533 std::set<enum Network> nets;
2534 for (
const std::string &snet : args.
GetArgs(
"-onlynet")) {
2538 _(
"Unknown network specified in -onlynet: '%s'"), snet));
2542 for (
int n = 0; n <
NET_MAX; n++) {
2545 if (!nets.count(net)) {
2557 bool proxyRandomize =
2562 std::string proxyArg = args.
GetArg(
"-proxy",
"");
2563 if (proxyArg !=
"" && proxyArg !=
"0") {
2566 addrProxy =
Proxy(proxyArg, proxyRandomize);
2568 const std::optional<CService> proxyAddr{
2570 if (!proxyAddr.has_value()) {
2572 _(
"Invalid -proxy address or hostname: '%s'"), proxyArg));
2575 addrProxy =
Proxy(proxyAddr.value(), proxyRandomize);
2580 _(
"Invalid -proxy address or hostname: '%s'"), proxyArg));
2586 onion_proxy = addrProxy;
2589 const bool onlynet_used_with_onion{args.
IsArgSet(
"-onlynet") &&
2597 std::string onionArg = args.
GetArg(
"-onion",
"");
2598 if (onionArg !=
"") {
2599 if (onionArg ==
"0") {
2601 onion_proxy =
Proxy{};
2602 if (onlynet_used_with_onion) {
2603 return InitError(
_(
"Outbound connections restricted to Tor "
2604 "(-onlynet=onion) but the proxy for "
2605 "reaching the Tor network is explicitly "
2606 "forbidden: -onion=0"));
2610 onion_proxy =
Proxy(onionArg, proxyRandomize);
2612 const std::optional<CService> addr{
2614 if (!addr.has_value() || !addr->IsValid()) {
2616 strprintf(
_(
"Invalid -onion address or hostname: '%s'"),
2620 onion_proxy =
Proxy(addr.value(), proxyRandomize);
2631 const bool listenonion_disabled{
2633 if (onlynet_used_with_onion && listenonion_disabled) {
2634 return InitError(
_(
"Outbound connections restricted to Tor "
2635 "(-onlynet=onion) but the proxy for "
2636 "reaching the Tor network is not provided: none "
2637 "of -proxy, -onion or "
2638 "-listenonion is given"));
2643 for (
const std::string &strAddr : args.
GetArgs(
"-externalip")) {
2644 const std::optional<CService> addrLocal{
2646 if (addrLocal.has_value() && addrLocal->IsValid()) {
2657 return chainman->m_blockman.ReadBlock(block, index);
2661 validation_signals.RegisterValidationInterface(
2668 node.notifications =
2669 std::make_unique<KernelNotifications>(
node.exit_status);
2675 .notifications = *
node.notifications,
2676 .signals = &validation_signals,
2681 if (chainman_opts.checkpoints_enabled) {
2682 LogPrintf(
"Checkpoints will be verified.\n");
2684 LogPrintf(
"Skipping checkpoint verification.\n");
2687 BlockManager::Options blockman_opts{
2688 .chainparams = chainman_opts.config.GetChainParams(),
2690 .notifications = chainman_opts.notifications,
2696 const auto [index_cache_sizes, kernel_cache_sizes] =
2699 LogInfo(
"Cache configuration:\n");
2700 LogInfo(
"* Using %.1f MiB for block index database\n",
2701 kernel_cache_sizes.block_tree_db * (1.0 / 1024 / 1024));
2703 LogInfo(
"* Using %.1f MiB for transaction index database\n",
2704 index_cache_sizes.tx_index * (1.0 / 1024 / 1024));
2707 LogInfo(
"* Using %.1f MiB for %s block filter index database\n",
2708 index_cache_sizes.filter_index * (1.0 / 1024 / 1024),
2711 LogInfo(
"* Using %.1f MiB for chain state database\n",
2712 kernel_cache_sizes.coins_db * (1.0 / 1024 / 1024));
2719 .signals = &validation_signals,
2724 mempool_opts.check_ratio =
2725 std::clamp<int>(mempool_opts.check_ratio, 0, 1'000'000);
2731 int64_t nMempoolSizeMin = 101 * 1000 * 40;
2732 if (mempool_opts.max_size_bytes < 0 ||
2734 mempool_opts.max_size_bytes < nMempoolSizeMin)) {
2736 std::ceil(nMempoolSizeMin / 1000000.0)));
2738 LogInfo(
"* Using %.1f MiB for in-memory UTXO set (plus up to %.1f MiB of "
2739 "unused mempool space)\n",
2740 kernel_cache_sizes.coins * (1.0 / 1024 / 1024),
2741 mempool_opts.max_size_bytes * (1.0 / 1024 / 1024));
2743 bool do_reindex{args.
GetBoolArg(
"-reindex",
false)};
2744 const bool do_reindex_chainstate{
2745 args.
GetBoolArg(
"-reindex-chainstate",
false)};
2748 node.mempool = std::make_unique<CTxMemPool>(config, mempool_opts);
2750 node.chainman = std::make_unique<ChainstateManager>(
2751 node.kernel->interrupt, chainman_opts, blockman_opts);
2758 if (!
node.chainman->m_blockman.IsPruneMode()) {
2759 LogPrintf(
"[snapshot] re-enabling NODE_NETWORK services\n");
2763 LogPrintf(
"[snapshot] restarting indexes\n");
2767 Assert(
node.validation_signals)->SyncWithValidationInterfaceQueue();
2769 for (
auto *index :
node.indexes) {
2772 if (!(index->Init() && index->StartBackgroundSync())) {
2773 LogPrintf(
"[snapshot] WARNING failed to restart index %s "
2774 "on snapshot chain\n",
2793 _(
"Error reading from database, shutting down."),
"",
2797 uiInterface.InitMessage(
_(
"Loading block index...").translated);
2799 const int64_t load_block_index_start_time =
GetTimeMillis();
2800 auto catch_exceptions = [](
auto &&f) {
2803 }
catch (
const std::exception &e) {
2806 _(
"Error opening block database"));
2809 auto [status, error] =
2810 catch_exceptions([&, &kernel_cache_sizes_ = kernel_cache_sizes] {
2817 LogWarning(
"pruned datadir may not have more than %d "
2818 "blocks; only checking available blocks\n",
2821 std::tie(status, error) = catch_exceptions(
2825 node.chainman->m_options.datadir /
2845 _(
"Do you want to rebuild the block database now?"),
2846 error.
original +
".\nPlease restart with -reindex or "
2847 "-reindex-chainstate to recover.",
2855 LogPrintf(
"Aborted block database rebuild. Exiting.\n");
2869 LogPrintf(
"Shutdown requested. Exiting.\n");
2879 args, *
node.chain,
node.connman.get(), chainman,
node.mempool.get(),
2880 scheduler, avalancheError);
2881 if (!
node.avalanche) {
2886 if (
node.avalanche->isAvalancheServiceAvailable()) {
2896 node.banman.get(), chainman, *
node.mempool,
2897 node.avalanche.get(), peerman_opts);
2898 validation_signals.RegisterValidationInterface(
node.peerman.get());
2921 for (
const auto &filter_type : g_enabled_filter_types) {
2924 index_cache_sizes.filter_index,
false, do_reindex);
2936 for (
auto index :
node.indexes) {
2937 if (!index->Init()) {
2942 const bool background_sync_in_progress{
WITH_LOCK(
2946 if (background_sync_in_progress) {
2948 _(
"Assumeutxo is incompatible with -chronik. Wait for "
2949 "background sync to complete before enabling Chronik."));
2952 const bool fReindexChronik =
2953 do_reindex || args.
GetBoolArg(
"-chronikreindex",
false);
2954 if (!chronik::Start(args, config,
node, fReindexChronik)) {
2961 for (
const auto &client :
node.chain_clients) {
2962 if (!client->load()) {
2975 uiInterface.InitMessage(
_(
"Pruning blockstore...").translated);
2976 chainstate->PruneAndFlush();
2982 if (!background_sync_in_progress) {
2983 LogPrintf(
"Setting NODE_NETWORK on non-prune mode\n");
2986 LogPrintf(
"Running node in NODE_NETWORK_LIMITED mode until "
2987 "snapshot background sync completes\n");
2994 strprintf(
_(
"Error: Disk space is low for %s"),
3000 strprintf(
_(
"Error: Disk space is low for %s"),
3008 boost::signals2::connection block_notify_genesis_wait_connection;
3011 block_notify_genesis_wait_connection =
3018#if defined(HAVE_SYSTEM)
3019 const std::string block_notify = args.
GetArg(
"-blocknotify",
"");
3020 if (!block_notify.empty()) {
3021 uiInterface.NotifyBlockTip_connect([block_notify](
3027 std::string command = block_notify;
3029 std::thread t(runCommand, command);
3036 std::vector<fs::path> vImportFiles;
3037 for (
const std::string &strFile : args.
GetArgs(
"-loadblock")) {
3042 node.background_init_thread = std::thread(
3048 LogPrintf(
"Stopping after block import\n");
3055 _(
"Failed to start indexes, shutting down..");
3079 block_notify_genesis_wait_connection.disconnect();
3088 int chain_active_height;
3104 if (tip_info && chainman.m_best_header) {
3106 tip_info->
header_time = chainman.m_best_header->GetBlockTime();
3109 LogPrintf(
"nBestHeight = %d\n", chain_active_height);
3111 node.peerman->SetBestHeight(chain_active_height);
3122 ? args.
GetIntArg(
"-maxavalancheoutbound",
3137 if (
node.avalanche) {
3156 const uint16_t default_bind_port =
static_cast<uint16_t
>(
3159 const auto BadPortWarning = [](
const char *
prefix, uint16_t port) {
3160 return strprintf(
_(
"%s request to listen on port %u. This port is "
3161 "considered \"bad\" and "
3162 "thus it is unlikely that any Bitcoin ABC peers "
3163 "connect to it. See "
3164 "doc/p2p-bad-ports.md for details and a full list."),
3168 for (
const std::string &bind_arg : args.
GetArgs(
"-bind")) {
3169 std::optional<CService> bind_addr;
3170 const size_t index = bind_arg.rfind(
'=');
3171 if (index == std::string::npos) {
3173 Lookup(bind_arg, default_bind_port,
false);
3174 if (bind_addr.has_value()) {
3175 connOptions.
vBinds.push_back(bind_addr.value());
3176 if (
IsBadPort(bind_addr.value().GetPort())) {
3178 BadPortWarning(
"-bind", bind_addr.value().GetPort()));
3183 const std::string network_type = bind_arg.substr(index + 1);
3184 if (network_type ==
"onion") {
3185 const std::string truncated_bind_arg =
3186 bind_arg.substr(0, index);
3188 Lookup(truncated_bind_arg,
3189 BaseParams().OnionServiceTargetPort(),
false);
3190 if (bind_addr.has_value()) {
3191 connOptions.
onion_binds.push_back(bind_addr.value());
3199 for (
const std::string &strBind : args.
GetArgs(
"-whitebind")) {
3211 args.
GetArgs(
"-bind").empty() && args.
GetArgs(
"-whitebind").empty();
3216 const uint16_t port_arg = args.
GetIntArg(
"-port", 0);
3224 onion_service_target = connOptions.
onion_binds.front();
3225 }
else if (!connOptions.
vBinds.empty()) {
3226 onion_service_target = connOptions.
vBinds.front();
3229 connOptions.
onion_binds.push_back(onion_service_target);
3235 _(
"More than one onion bind address is provided. Using %s "
3236 "for the automatically created Tor onion service."),
3248 for (
const auto &net : args.
GetArgs(
"-whitelist")) {
3253 connection_direction, error)) {
3269 const auto connect = args.
GetArgs(
"-connect");
3270 if (connect.size() != 1 || connect[0] !=
"0") {
3275 const std::string &i2psam_arg = args.
GetArg(
"-i2psam",
"");
3276 if (!i2psam_arg.empty()) {
3277 const std::optional<CService> addr{
3279 if (!addr.has_value() || !addr->IsValid()) {
3281 _(
"Invalid -i2psam address or hostname: '%s'"), i2psam_arg));
3291 if (!
node.connman->Start(scheduler, connOptions)) {
3311 for (
const auto &client :
node.chain_clients) {
3312 client->start(scheduler);
3316 scheduler.scheduleEvery(
3324 if (
node.avalanche) {
3325 node.avalanche->startEventLoop(scheduler);
3329 node.peerman->StartScheduledTasks(scheduler);
3333 StartupNotify(args);
3344 std::optional<const CBlockIndex *> indexes_start_block;
3345 std::string older_index_name;
3351 for (
auto index :
node.indexes) {
3362 if (!index_chain.
Contains(pindex)) {
3363 pindex = index_chain.
FindFork(pindex);
3366 if (!indexes_start_block || !pindex ||
3367 pindex->
nHeight < indexes_start_block.value()->nHeight) {
3368 indexes_start_block = pindex;
3369 older_index_name = summary.
name;
3378 if (indexes_start_block) {
3380 const CBlockIndex *start_block = *indexes_start_block;
3384 if (!chainman.
m_blockman.CheckBlockDataAvailability(
3385 *index_chain.
Tip(), *
Assert(start_block))) {
3387 Untranslated(
"%s best block of the index goes beyond pruned "
3388 "data. Please disable the index or reindex (which "
3389 "will download the whole blockchain again)"),
3395 for (
auto index :
node.indexes) {
3396 if (!index->StartBackgroundSync()) {
util::Result< std::unique_ptr< AddrMan > > LoadAddrman(const CChainParams &chainparams, const std::vector< bool > &asmap, const ArgsManager &args)
Returns an error string on failure.
static constexpr int32_t DEFAULT_ADDRMAN_CONSISTENCY_CHECKS
Default for -checkaddrman.
void SetupHelpOptions(ArgsManager &args)
Add help options to the args manager.
const char *const BITCOIN_SETTINGS_FILENAME
const char *const BITCOIN_CONF_FILENAME
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...
std::vector< bool > DecodeAsmap(fs::path path)
Read asmap from provided binary file.
static constexpr bool DEFAULT_PERSIST_AVAPEERS
Default for -persistavapeers.
static constexpr double AVALANCHE_DEFAULT_MIN_QUORUM_CONNECTED_STAKE_RATIO
Default minimum percentage of stake-weighted peers we must have a node for to constitute a usable quo...
static constexpr bool DEFAULT_AVALANCHE_STAKING_PRECONSENSUS
Default for -avalanchestakingpreconsensus.
static constexpr size_t AVALANCHE_DEFAULT_PEER_REPLACEMENT_COOLDOWN
Peer replacement cooldown time default value in seconds.
static constexpr double AVALANCHE_DEFAULT_MIN_AVAPROOFS_NODE_COUNT
Default minimum number of nodes that sent us an avaproofs message before we can consider our quorum s...
static constexpr bool DEFAULT_AVALANCHE_PRECONSENSUS
Default for -avalanchepreconsensus.
static constexpr Amount AVALANCHE_DEFAULT_MIN_QUORUM_STAKE
Default minimum cumulative stake of all known peers that constitutes a usable quorum.
static constexpr size_t AVALANCHE_DEFAULT_CONFLICTING_PROOF_COOLDOWN
Conflicting proofs cooldown time default value in seconds.
static constexpr bool DEFAULT_AVALANCHE_MINING_PRECONSENSUS
Default for -avalanchepreconsensusmining.
static constexpr bool AVALANCHE_DEFAULT_ENABLED
Is avalanche enabled by default.
static constexpr size_t AVALANCHE_DEFAULT_COOLDOWN
Avalanche default cooldown in milliseconds.
static constexpr unsigned int DEFAULT_MISBEHAVING_BANTIME
static constexpr std::chrono::minutes DUMP_BANS_INTERVAL
How often to dump banned addresses/subnets to disk.
void RPCNotifyBlockChange(const CBlockIndex *pindex)
Callback for when block tip changed.
const std::string & BlockFilterTypeName(BlockFilterType filter_type)
Get the human-readable name for a filter type.
const std::set< BlockFilterType > & AllBlockFilterTypes()
Get a list of known filter types.
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.
void DestroyAllBlockFilterIndexes()
Destroy all open block filter indexes.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
void ForEachBlockFilterIndex(std::function< void(BlockFilterIndex &)> fn)
Iterate over all running block filter indexes, invoking fn on each.
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
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 CChainParams & Params()
Return the currently selected parameters.
const CBaseChainParams & BaseParams()
Return the currently selected parameters.
std::unique_ptr< CBaseChainParams > CreateBaseChainParams(const ChainType chain)
Port numbers for incoming Tor connections (8334, 18334, 38334, 18445) have been chosen arbitrarily to...
void SetupChainParamsBaseOptions(ArgsManager &argsman)
Set the arguments for chainparams.
static constexpr int DEFAULT_SCRIPTCHECK_THREADS
-par default (number of script-checking threads, 0 = auto)
static constexpr bool DEFAULT_CHECKPOINTS_ENABLED
static constexpr auto DEFAULT_MAX_TIP_AGE
static constexpr bool DEFAULT_STORE_RECENT_HEADERS_TIME
std::string ChainTypeToString(ChainType chain)
#define Assert(val)
Identity function.
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...
std::list< SectionInfo > GetUnrecognizedSections() const
Log warnings for unrecognized section names in the config file.
@ ALLOW_ANY
disable validation
@ DISALLOW_NEGATION
unimplemented, draft implementation in #16545
@ DISALLOW_ELISION
disallow -foo syntax that doesn't assign any value
ChainType GetChainType() const
Looks for -regtest, -testnet and returns the appropriate BIP70 chain name.
std::vector< std::string > GetArgs(const std::string &strArg) const
Return a vector of strings of the given argument.
fs::path GetDataDirNet() const
Get data directory path with appended network identifier.
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
fs::path GetBlocksDirPath() const
Get blocks directory path.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
bool SoftSetBoolArg(const std::string &strArg, bool fValue)
Set a boolean argument if it doesn't already have a value.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
void AddHiddenArgs(const std::vector< std::string > &args)
Add many hidden arguments.
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
fs::path GetPathArg(std::string arg, const fs::path &default_value={}) const
Return path argument or default value.
static std::shared_ptr< LogRateLimiter > Create(SchedulerFunction &&scheduler_func, uint64_t max_bytes, std::chrono::seconds reset_window)
void SetRateLimiting(std::shared_ptr< LogRateLimiter > limiter) EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
std::atomic< bool > m_reopen_file
void Stop()
Stops the instance from staying in sync with blockchain updates.
bool BlockUntilSyncedToCurrentChain() const LOCKS_EXCLUDED(void Interrupt()
Blocks the current thread until the index is caught up to the current state of the block chain.
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
The block chain is a tree shaped structure starting with the genesis block at the root,...
int64_t GetBlockTime() const
BlockHash GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
An in-memory indexed chain of blocks.
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
CBlockIndex * Genesis() const
Returns the index entry for the genesis block of this chain, or nullptr if none.
int Height() const
Return the maximal height in the chain.
const CBlockIndex * FindFork(const CBlockIndex *pindex) const
Find the last common block between this chain and a block index entry.
bool Contains(const CBlockIndex *pindex) const
Efficiently check whether a block is present in this chain.
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
const CBlock & GenesisBlock() const
bool DefaultConsistencyChecks() const
Default value for -checkmempool and -checkblockindex argument.
const ChainTxData & TxData() const
bool IsTestChain() const
If this chain is exclusively used for testing.
uint16_t GetDefaultPort() const
A combination of a network address (CNetAddr) and a (TCP) port.
std::string ToStringAddrPort() const
static const int DEFAULT_ZMQ_SNDHWM
static std::unique_ptr< CZMQNotificationInterface > Create(std::function< bool(CBlock &, const CBlockIndex &)> get_block_by_index)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
CChain m_chain
The current chain of blockheaders we consult and build on.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
node::BlockMap & BlockIndex() EXCLUSIVE_LOCKS_REQUIRED(
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...
kernel::Notifications & GetNotifications() const
RecursiveMutex & GetMutex() const LOCK_RETURNED(
Alias for cs_main.
CBlockIndex * ActiveTip() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
bool BackgroundSyncInProgress() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
The state of a background sync (for net processing)
const util::SignalInterrupt & m_interrupt
std::function< void()> snapshot_download_completed
Function to restart active indexes; set dynamically to avoid a circular dependency on base/index....
const CChainParams & GetParams() const
CChain & ActiveChain() const EXCLUSIVE_LOCKS_REQUIRED(GetMutex())
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
virtual uint64_t GetMaxBlockSize() const =0
virtual const CChainParams & GetChainParams() const =0
virtual bool SetMaxBlockSize(uint64_t maxBlockSize)=0
virtual void SetCashAddrEncoding(bool)=0
uint64_t rand64() noexcept
Generate a random 64-bit integer.
Different type to mark Mutex at global scope.
A writer stream (for serialization) that computes a 256-bit hash.
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, avalanche::Processor *const avalanche, Options opts)
Class for registering and managing all RPC calls.
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.
static std::unique_ptr< Processor > MakeProcessor(const ArgsManager &argsman, interfaces::Chain &chain, CConnman *connman, ChainstateManager &chainman, CTxMemPool *mempoolIn, CScheduler &scheduler, bilingual_str &error)
std::string ToString() const
std::string GetHex() const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
A base class defining functions for notifying about certain kernel events.
virtual void fatalError(const std::string &debug_message, const bilingual_str &user_message={})
The fatal error notification is sent to notify the user when an error occurs in kernel code that can'...
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
bool CheckBlockDataAvailability(const CBlockIndex &upper_block LIFETIMEBOUND, const CBlockIndex &lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, std::function< bool(BlockStatus)> status_test, const CBlockIndex *lower_block=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned)
Check if all blocks in the [upper_block, lower_block] range have data available.
std::atomic_bool m_blockfiles_indexed
Whether all blockfiles have been added to the block tree database.
CBlockIndex * LookupBlockIndex(const BlockHash &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool IsPruneMode() const
Whether running in -prune mode.
std::string FormatVersion(int nVersion)
std::string FormatUserAgent(const std::string &name, const std::string &version, const std::vector< std::string > &comments)
Format the subversion field according to BIP 14 spec.
static constexpr int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
const std::string CLIENT_NAME
std::unique_ptr< CoinStatsIndex > g_coin_stats_index
The global UTXO set hash object.
static constexpr bool DEFAULT_COINSTATSINDEX
static const uint64_t DEFAULT_MAX_BLOCK_SIZE
Default setting for maximum allowed size for a block, in bytes.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
void SetupCurrencyUnitOptions(ArgsManager &argsman)
int RaiseFileDescriptorLimit(int nMinFD)
This function tries to raise the file descriptor limit to the requested number.
bool CheckDiskSpace(const fs::path &dir, uint64_t additional_bytes)
void InterruptHTTPRPC()
Interrupt HTTP RPC subsystem.
void StopHTTPRPC()
Stop HTTP RPC subsystem.
bool StartHTTPRPC(HTTPRPCRequestProcessor &httpRPCRequestProcessor)
Start HTTP RPC subsystem.
void StartREST(const std::any &context)
Start HTTP REST subsystem.
void StopREST()
Stop HTTP REST subsystem.
void InterruptREST()
Interrupt RPC REST subsystem.
void InterruptHTTPServer()
Interrupt HTTP server threads.
void StartHTTPServer()
Start HTTP server.
void StopHTTPServer()
Stop HTTP server.
bool InitHTTPServer(Config &config)
Initialize HTTP server.
static const int DEFAULT_HTTP_SERVER_TIMEOUT
static const int DEFAULT_HTTP_WORKQUEUE
static const int DEFAULT_HTTP_THREADS
Common init functions shared by bitcoin-node, bitcoin-wallet, etc.
static const char * BITCOIN_PID_FILENAME
The PID file facilities.
static bool CreatePidFile(const ArgsManager &args)
static const bool DEFAULT_PROXYRANDOMIZE
void Interrupt(NodeContext &node)
Interrupt threads.
void InitLogging(const ArgsManager &args)
Initialize global loggers.
bool AppInitLockDataDirectory()
Lock bitcoin data directory.
void SetupServerArgs(NodeContext &node)
Register all arguments with the ArgsManager.
static bool AppInitServers(Config &config, HTTPRPCRequestProcessor &httpRPCRequestProcessor, NodeContext &node)
#define MIN_CORE_FILEDESCRIPTORS
void Shutdown(NodeContext &node)
static void HandleSIGTERM(int)
Signal handlers are very limited in what they are allowed to do.
static GlobalMutex g_genesis_wait_mutex
static void OnRPCStarted()
static constexpr bool DEFAULT_USEASHADDR
static void HandleSIGHUP(int)
bool AppInitBasicSetup(const ArgsManager &args, std::atomic< int > &exit_status)
Initialize bitcoin: Basic context setup.
static fs::path GetPidFile(const ArgsManager &args)
static std::condition_variable g_genesis_wait_cv
bool AppInitMain(Config &config, RPCServer &rpcServer, HTTPRPCRequestProcessor &httpRPCRequestProcessor, NodeContext &node, interfaces::BlockAndHeaderTipInfo *tip_info)
Bitcoin main initialization.
static constexpr bool DEFAULT_CHRONIK
bool StartIndexBackgroundSync(NodeContext &node)
Validates requirements to run the indexes and spawns each index initial sync thread.
bool AppInitInterfaces(NodeContext &node)
Initialize node and wallet interface pointers.
static constexpr bool DEFAULT_STOPAFTERBLOCKIMPORT
static const char * DEFAULT_ASMAP_FILENAME
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
static void BlockNotifyGenesisWait(const CBlockIndex *pBlockIndex)
static void OnRPCStopped()
static bool LockDataDirectory(bool probeOnly)
static void registerSignalHandler(int signal, void(*handler)(int))
bool AppInitParameterInteraction(Config &config, const ArgsManager &args)
Initialization: parameter interaction.
static const bool DEFAULT_REST_ENABLE
static boost::signals2::connection rpc_notify_block_change_connection
static void new_handler_terminate()
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
static const std::string HEADERS_TIME_FILE_NAME
static constexpr bool DEFAULT_DAEMON
Default value for -daemon option.
static constexpr bool DEFAULT_DAEMONWAIT
Default value for -daemonwait option.
static constexpr size_t DEFAULT_DB_CACHE_BATCH
Default LevelDB write batch size.
BCLog::Logger & LogInstance()
#define LogDebug(category,...)
void StartMapPort(bool enable)
static constexpr bool DEFAULT_NATPMP
std::optional< bilingual_str > ApplyArgsManOptions(const ArgsManager &argsman, const CChainParams &chainparams, MemPoolOptions &mempool_opts)
Overlay the options set in argsman on top of corresponding members in mempool_opts.
static constexpr unsigned int DEFAULT_MAX_MEMPOOL_SIZE_MB
Default for -maxmempool, maximum megabytes of mempool memory usage.
static constexpr unsigned int DEFAULT_MEMPOOL_EXPIRY_HOURS
Default for -mempoolexpiry, expiration time for mempool transactions in hours.
std::string FormatMoney(const Amount amt)
Do not use these functions to represent or parse monetary amounts to or from JSON but use AmountFromV...
bool ParseMoney(const std::string &money_string, Amount &nRet)
Parse an amount denoted in full coins.
constexpr auto RATELIMIT_WINDOW
constexpr bool DEFAULT_LOGRATELIMIT
constexpr uint64_t RATELIMIT_MAX_BYTES
void OnStarted(std::function< void()> slot)
void OnStopped(std::function< void()> slot)
static constexpr Amount PROOF_DUST_THRESHOLD
Minimum amount per utxo.
bilingual_str AmountErrMsg(const std::string &optname, const std::string &strValue)
bilingual_str ResolveErrMsg(const std::string &optname, const std::string &strBind)
bilingual_str InvalidPortErrMsg(const std::string &optname, const std::string &invalid_value)
static auto quoted(const std::string &s)
static bool exists(const path &p)
static std::string PathToString(const path &path)
Convert path object to byte string.
static path PathFromString(const std::string &string)
Convert byte string to path object.
void AddLoggingArgs(ArgsManager &argsman)
void SetLoggingCategories(const ArgsManager &args)
bool StartLogging(const ArgsManager &args)
void SetLoggingLevel(const ArgsManager &args)
void SetLoggingOptions(const ArgsManager &args)
std::unique_ptr< Chain > MakeChain(node::NodeContext &node, const CChainParams ¶ms)
Return implementation of Chain interface.
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.
@ FAILURE_INCOMPATIBLE_DB
@ FAILURE_FATAL
Fatal error which should not prompt to reindex.
@ FAILURE
Generic failure which reindexing may fix.
@ FAILURE_INSUFFICIENT_DBCACHE
CacheSizes CalculateCacheSizes(const ArgsManager &args, size_t n_indexes)
fs::path MempoolPath(const ArgsManager &argsman)
bool ShouldPersistMempool(const ArgsManager &argsman)
void ReadNotificationArgs(const ArgsManager &args, KernelNotifications ¬ifications)
ChainstateLoadResult LoadChainstate(ChainstateManager &chainman, const CacheSizes &cache_sizes, const ChainstateLoadOptions &options)
ChainstateLoadResult VerifyLoadedChainstate(ChainstateManager &chainman, const ChainstateLoadOptions &options)
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
void ImportBlocks(ChainstateManager &chainman, avalanche::Processor *const avalanche, std::vector< fs::path > vImportFiles)
void ApplyArgsManOptions(const ArgsManager &args, const Config &config, BlockFitter::Options &options)
Apply options from ArgsManager to BlockFitter options.
LockResult LockDirectory(const fs::path &directory, const std::string lockfile_name, bool probe_only)
bilingual_str ErrorString(const Result< T > &result)
auto Join(const std::vector< T > &list, const BaseType &separator, UnaryOp unary_op) -> decltype(unary_op(list.at(0)))
Join a list of items.
void TraceThread(std::string_view thread_name, std::function< void()> thread_func)
A wrapper for do-something-once thread functions.
void ReplaceAll(std::string &in_out, std::string_view search, std::string_view substitute)
Replace every non-overlapping occurrence of search with substitute, treating both literally; the repl...
void ThreadRename(std::string &&)
Rename a thread both in terms of an internal (in-memory) name as well as its system thread name.
void SetReachable(enum Network net, bool reachable)
Mark a network as reachable or unreachable (no automatic connects to it)
bool AddLocal(const CService &addr, int nScore)
void Discover()
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses t...
bool IsReachable(enum Network net)
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS
The maximum number of peer connections to maintain.
static const unsigned int MAX_SUBVERSION_LENGTH
Maximum length of the user agent string in version message.
static const int MAX_ADDNODE_CONNECTIONS
Maximum number of addnode outgoing nodes.
static const size_t DEFAULT_MAXSENDBUFFER
static const int NUM_FDS_MESSAGE_CAPTURE
Number of file descriptors required for message capture.
static const bool DEFAULT_BLOCKSONLY
Default for blocks only.
static const bool DEFAULT_FORCEDNSSEED
static constexpr uint64_t DEFAULT_MAX_UPLOAD_TARGET
The default for -maxuploadtarget.
static const size_t DEFAULT_MAXRECEIVEBUFFER
static const int DEFAULT_MAX_AVALANCHE_OUTBOUND_CONNECTIONS
Maximum number of avalanche enabled outgoing connections by default.
static const bool DEFAULT_FIXEDSEEDS
static const int MAX_FEELER_CONNECTIONS
Maximum number of feeler connections.
static const bool DEFAULT_LISTEN
-listen default
static const int64_t DEFAULT_PEER_CONNECT_TIMEOUT
-peertimeout default
static const bool DEFAULT_DNSSEED
static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
const std::vector< std::string > NET_PERMISSIONS_DOC
static const bool DEFAULT_WHITELISTFORCERELAY
Default for -whitelistforcerelay.
static const 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 const bool DEFAULT_PEERBLOCKFILTERS
@ NET_MAX
Dummy value to indicate the number of NET_* constants.
@ NET_ONION
TOR (v2 or v3)
@ NET_UNROUTABLE
Addresses from these networks are not publicly routable on the global Internet.
bool SetNameProxy(const Proxy &addrProxy)
Set the name proxy to use for all connections to nodes specified by a hostname.
enum Network ParseNetwork(const std::string &net_in)
bool SetProxy(enum Network net, const Proxy &addrProxy)
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.
bool IsUnixSocketPath(const std::string &name)
Check if a string is a valid UNIX domain socket path.
bool IsBadPort(uint16_t port)
Determine if a port is "bad" from the perspective of attempting to connect to a node on that port.
std::vector< std::string > GetNetworkNames(bool append_unroutable)
Return a vector of publicly routable Network names; optionally append NET_UNROUTABLE.
static const int DEFAULT_NAME_LOOKUP
-dns default
const std::string ADDR_PREFIX_UNIX
Prefix for unix domain socket addresses (which are local filesystem paths)
static const int DEFAULT_CONNECT_TIMEOUT
-timeout default
static constexpr size_t MIN_DB_CACHE
min. -dbcache (bytes)
static constexpr size_t DEFAULT_DB_CACHE
-dbcache default (bytes)
uint32_t nBytesPerSigCheck
static constexpr uint64_t DEFAULT_MAX_GENERATED_BLOCK_SIZE
Default for -blockmaxsize, which controls the maximum size of block the mining code will create.
static constexpr unsigned int MAX_OP_RETURN_RELAY
Default setting for nMaxDatacarrierBytes.
static constexpr Amount DUST_RELAY_TX_FEE(3000 *SATOSHI)
Min feerate for defining dust.
static constexpr bool DEFAULT_PERMIT_BAREMULTISIG
Default for -permitbaremultisig.
static constexpr bool DEFAULT_ACCEPT_DATACARRIER
Default for -datacarrier.
static constexpr Amount DEFAULT_MIN_RELAY_TX_FEE_PER_KB(1000 *SATOSHI)
Default for -minrelaytxfee, minimum relay fee for transactions.
static constexpr unsigned int DEFAULT_BYTES_PER_SIGCHECK
Default for -bytespersigcheck .
static constexpr Amount DEFAULT_BLOCK_MIN_TX_FEE_PER_KB(1000 *SATOSHI)
Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by min...
static constexpr size_t DEFAULT_AVALANCHE_MAX_ELEMENT_POLL
Maximum item that can be polled at once.
static constexpr std::chrono::milliseconds AVALANCHE_DEFAULT_QUERY_TIMEOUT
How long before we consider that a query timed out.
static constexpr int AVALANCHE_DEFAULT_STAKE_UTXO_CONFIRMATIONS
Minimum number of confirmations before a stake utxo is mature enough to be included into a proof.
ServiceFlags
nServices flags.
void RandAddPeriodic() noexcept
Gather entropy from various expensive sources, and feed them to the PRNG state.
static void RegisterAllRPCCommands(const Config &config, RPCServer &rpcServer, CRPCTable &rpcTable)
Register all context-sensitive RPC commands.
bool(* handler)(Config &config, const std::any &context, HTTPRequest *req, const std::string &strReq)
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
static constexpr bool DEFAULT_RPC_DOC_CHECK
static constexpr bool DEFAULT_ENABLE_RTT
Default for -enablertt.
static constexpr size_t DEFAULT_SCRIPT_EXECUTION_CACHE_BYTES
void SetRPCWarmupFinished()
Mark warmup as done.
void SetRPCWarmupStatus(const std::string &newStatus)
Set the RPC warmup status.
void RpcInterruptionPoint()
Throw JSONRPCError if RPC is not running.
bool ShutdownRequested()
Returns true if a shutdown is requested, false otherwise.
void StartShutdown()
Request shutdown of the application.
void AbortShutdown()
Clear shutdown flag.
static constexpr size_t DEFAULT_SIGNATURE_CACHE_BYTES
@ SAFE_CHARS_UA_COMMENT
BIP-0014 subset.
static constexpr Amount zero() noexcept
A BlockHash is a unqiue identifier for a block.
int m_max_outbound_block_relay
unsigned int nReceiveFloodSize
int m_max_outbound_full_relay
std::vector< NetWhitebindPermissions > vWhiteBinds
uint64_t nMaxOutboundLimit
CClientUIInterface * uiInterface
std::vector< NetWhitelistPermissions > vWhitelistedRangeIncoming
int m_max_avalanche_outbound
std::vector< CService > onion_binds
std::vector< std::string > m_specified_outgoing
ServiceFlags nLocalServices
std::vector< std::string > m_added_nodes
int64_t m_peer_connect_timeout
std::vector< CService > vBinds
unsigned int nSendBufferMaxSize
bool m_i2p_accept_incoming
std::vector< std::string > vSeedNodes
bool m_use_addrman_outgoing
std::vector< NetEventsInterface * > m_msgproc
bool whitelist_forcerelay
bool bind_on_any
True if the user did not specify -bind= or -whitebind= and thus we should bind on 0....
std::vector< NetWhitelistPermissions > vWhitelistedRangeOutgoing
static std::string getTicker()
BlockHash best_block_hash
Block and header tip information.
double verification_progress
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...
Options struct containing options for constructing a CTxMemPool.
int check_ratio
The ratio used to determine how often sanity checks will run.
bool require_full_verification
std::function< void()> coins_error_cb
std::function< bool()> check_interrupt
NodeContext struct containing references to chain state and connection state.
#define WAIT_LOCK(cs, name)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define TRY_LOCK(cs, name)
std::string SysErrorString(int err)
Return system error string from errno value.
int64_t GetTimeMillis()
Returns the system time (not mockable)
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
NodeClock::time_point GetAdjustedTime()
static const int64_t DEFAULT_MAX_TIME_ADJUSTMENT
CService DefaultOnionServiceTarget()
const std::string DEFAULT_TOR_CONTROL
Default control port.
void InterruptTorControl()
void StartTorControl(CService onion_service_target)
static const bool DEFAULT_LISTEN_ONION
bilingual_str _(const char *psz)
Translation function.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
util::Result< void > CheckLegacyTxindex(CBlockTreeDB &block_tree_db)
std::unique_ptr< TxIndex > g_txindex
The global transaction index, used in GetTransaction. May be null.
static constexpr bool DEFAULT_TXINDEX
CClientUIInterface uiInterface
void InitWarning(const bilingual_str &str)
Show warning message.
bool InitError(const bilingual_str &str)
Show error message.
bool ParseUInt16(std::string_view str, uint16_t *out)
Convert decimal string to unsigned 16-bit integer with strict parse error feedback.
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.
std::condition_variable g_best_block_cv
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess how far we are in the verification process at the given block index require cs_main if pindex h...
const std::vector< std::string > CHECKLEVEL_DOC
Documentation for argument 'checklevel'.
static constexpr int MAX_SCRIPTCHECK_THREADS
Maximum number of dedicated script-checking threads allowed.
static constexpr int DEFAULT_CHECKLEVEL
static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES
Require that user allocate at least 550 MiB for block & undo files (blk???.dat and rev?...
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...
SynchronizationState
Current sync state passed to tip changed callbacks.
static const signed int DEFAULT_CHECKBLOCKS
static const bool DEFAULT_PEERBLOOMFILTERS
static constexpr uint32_t AVALANCHE_VOTE_STALE_FACTOR
Scaling factor applied to confidence to determine staleness threshold.
static constexpr uint32_t AVALANCHE_VOTE_STALE_THRESHOLD
Number of votes before a record may be considered as stale.
const WalletInitInterface & g_wallet_init_interface
std::unique_ptr< CZMQNotificationInterface > g_zmq_notification_interface
void RegisterZMQRPCCommands(CRPCTable &t)