Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501}502return true;503}505common::SettingsValue ArgsManager::GetPersistentSetting(const std::string& name) const506{507LOCK(cs_args);508return common::GetSetting(m_settings, m_network, name, !UseDefaultSection("-" + name),509/*ignore_nonpersistent=*/true, /*get_chain_type=*/false);510}512bool ArgsManager::IsArgNegated(const std::string& strArg) const513{514return GetSetting(strArg).isFalse();515}517std::string ArgsManager::GetArg(const std::string& strArg, const std::string& strDefault) const518{519return GetArg(strArg).value_or(strDefault);520}522std::optional<std::string> ArgsManager::GetArg(const std::string& strArg) const523{524const common::SettingsValue value = GetSetting(strArg);525return SettingToString(value);526}528std::optional<std::string> SettingToString(const common::SettingsValue& value)529{530if (value.isNull()) return std::nullopt;531if (value.isFalse()) return "0";532if (value.isTrue()) return "1";533if (value.isNum()) return value.getValStr();534return value.get_str();535}537std::string SettingToString(const common::SettingsValue& value, const std::string& strDefault)538{539return SettingToString(value).value_or(strDefault);540}542template <std::integral Int>543Int ArgsManager::GetArg(const std::string& strArg, Int nDefault) const544{545return GetArg<Int>(strArg).value_or(nDefault);546}548template <std::integral Int>549std::optional<Int> ArgsManager::GetArg(const std::string& strArg) const550{551const common::SettingsValue value = GetSetting(strArg);552return SettingTo<Int>(value);553}555template <std::integral Int>556std::optional<Int> SettingTo(const common::SettingsValue& value)557{558if (value.isNull()) return std::nullopt;559if (value.isFalse()) return 0;560if (value.isTrue()) return 1;561if (value.isNum()) return value.getInt<Int>();562return LocaleIndependentAtoi<Int>(value.get_str());563}565template <std::integral Int>566Int SettingTo(const common::SettingsValue& value, Int nDefault)567{568return SettingTo<Int>(value).value_or(nDefault);569}571bool ArgsManager::GetBoolArg(const std::string& strArg, bool fDefault) const572{573return GetBoolArg(strArg).value_or(fDefault);574}576std::optional<bool> ArgsManager::GetBoolArg(const std::string& strArg) const577{578const common::SettingsValue value = GetSetting(strArg);579return SettingToBool(value);580}582std::optional<bool> SettingToBool(const common::SettingsValue& value)583{584if (value.isNull()) return std::nullopt;585if (value.isBool()) return value.get_bool();586return InterpretBool(value.get_str());587}589bool SettingToBool(const common::SettingsValue& value, bool fDefault)590{591return SettingToBool(value).value_or(fDefault);592}594#define INSTANTIATE_INT_TYPE(Type) \595template Type ArgsManager::GetArg<Type>(const std::string&, Type) const; \596template std::optional<Type> ArgsManager::GetArg<Type>(const std::string&) const; \597template Type SettingTo<Type>(const common::SettingsValue&, Type); \598template std::optional<Type> SettingTo<Type>(const common::SettingsValue&)600INSTANTIATE_INT_TYPE(int8_t);601INSTANTIATE_INT_TYPE(uint8_t);602INSTANTIATE_INT_TYPE(int16_t);603INSTANTIATE_INT_TYPE(uint16_t);604INSTANTIATE_INT_TYPE(int32_t);605INSTANTIATE_INT_TYPE(uint32_t);606INSTANTIATE_INT_TYPE(int64_t);607INSTANTIATE_INT_TYPE(uint64_t);609#undef INSTANTIATE_INT_TYPE611bool ArgsManager::SoftSetArg(const std::string& strArg, const std::string& strValue)612{613LOCK(cs_args);614if (!GetSetting_(strArg).isNull()) return false;615m_settings.forced_settings[SettingName(strArg)] = strValue;616return true;617}619bool ArgsManager::SoftSetBoolArg(const std::string& strArg, bool fValue)620{621if (fValue)622return SoftSetArg(strArg, std::string("1"));623else624return SoftSetArg(strArg, std::string("0"));625}627void ArgsManager::ForceSetArg(const std::string& strArg, const std::string& strValue)628{629LOCK(cs_args);630m_settings.forced_settings[SettingName(strArg)] = strValue;631}633void ArgsManager::AddCommand(const std::string& cmd, const std::string& help, std::set<std::string> options)634{635Assert(cmd.find('=') == std::string::npos);636Assert(cmd.at(0) != '-');638LOCK(cs_args);639m_accept_any_command = false; // latch to false640std::map<std::string, Arg>& arg_map = m_available_args[OptionsCategory::COMMANDS];641auto ret = arg_map.emplace(cmd, Arg{"", help, ArgsManager::COMMAND});642if (!options.empty()) {643auto& cmdopts = m_available_args[OptionsCategory::COMMAND_OPTIONS];644bool command_has_all_options_defined = true;645for (const auto& opt : options) {646if (!cmdopts.contains(opt)) {647command_has_all_options_defined = false;648}649}650Assert(command_has_all_options_defined);652m_command_args.try_emplace(cmd, std::move(options));653}654Assert(ret.second); // Fail on duplicate commands655}657void ArgsManager::AddArg(const std::string& name, const std::string& help, unsigned int flags, const OptionsCategory& cat)658{659Assert((flags & ArgsManager::COMMAND) == 0); // use AddCommand661// Split arg name from its help param662size_t eq_index = name.find('=');663if (eq_index == std::string::npos) {664eq_index = name.size();665}666std::string arg_name = name.substr(0, eq_index);668LOCK(cs_args);670// Allow duplicates involving HIDDEN — it is used as a placeholder for args671// unavailable in this binary but tolerated for shared config files (see #13441).672for (const auto& arg_map : m_available_args) {673if (arg_map.first == OptionsCategory::HIDDEN || cat == OptionsCategory::HIDDEN) continue;674Assert(!arg_map.second.contains(arg_name));675}677std::map<std::string, Arg>& arg_map = m_available_args[cat];678auto ret = arg_map.emplace(arg_name, Arg{name.substr(eq_index, name.size() - eq_index), help, flags});679assert(ret.second); // Make sure an insertion actually happened681if (flags & ArgsManager::NETWORK_ONLY) {682m_network_only_args.emplace(arg_name);683}684}686void ArgsManager::AddHiddenArgs(const std::vector<std::string>& names)687{688for (const std::string& name : names) {689AddArg(name, "", ArgsManager::ALLOW_ANY, OptionsCategory::HIDDEN);690}691}693void ArgsManager::ClearArgs()694{695LOCK(cs_args);696m_settings = {};697m_available_args.clear();698m_command_args.clear();699m_network_only_args.clear();700m_config_sections.clear();701}703void ArgsManager::CheckMultipleCLIArgs() const704{705LOCK(cs_args);706std::vector<std::string> found{};707auto cmds = m_available_args.find(OptionsCategory::CLI_COMMANDS);708if (cmds != m_available_args.end()) {709for (const auto& [cmd, argspec] : cmds->second) {710if (!GetSetting_(cmd).isNull()) {711found.push_back(cmd);712}713}714if (found.size() > 1) {715throw std::runtime_error(strprintf("Only one of %s may be specified.", util::Join(found, ", ")));716}717}718}720std::string ArgsManager::GetHelpMessage() const721{722const bool show_debug = GetBoolArg("-help-debug", false);724std::string usage;725LOCK(cs_args);727const auto command_options = m_available_args.find(OptionsCategory::COMMAND_OPTIONS);728const auto for_matching_cmd_opts = [&](const std::set<std::string>& select, auto&& fn) EXCLUSIVE_LOCKS_REQUIRED(cs_args) {729if (select.empty()) return;730if (command_options == m_available_args.end()) return;731for (const auto& [name, info] : command_options->second) {732if (!show_debug && (info.m_flags & ArgsManager::DEBUG_ONLY)) continue;733if (!select.contains(name)) continue;734fn(name, info);735}736};738for (const auto& [category, category_args] : m_available_args) {739switch(category) {740case OptionsCategory::OPTIONS:741usage += HelpMessageGroup("Options:");742break;743case OptionsCategory::CONNECTION:744usage += HelpMessageGroup("Connection options:");745break;746case OptionsCategory::ZMQ:747usage += HelpMessageGroup("ZeroMQ notification options:");748break;749case OptionsCategory::DEBUG_TEST:750usage += HelpMessageGroup("Debugging/Testing options:");
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.