第二步:初始参数设置
以下内容为系统启动过程中,每一步骤的详细分析。
第2步,应用初始参数交互设置(src/bitcoind.cpp)
src/bitcoind.cpp)AppInitParameterInteraction 函数前半部分。
首先,调用
Params方法,获取前面初始化的globalChainParams区块链对象。const CChainParams& chainparams = Params();根据不同的网络,chainparams 的真实类型可能是
CMainParams,代表主网络;或者是CTestNetParams,代表测试网络;或者是CRegTestParams代表回归测试网络。检查指定的区块目录是否存。如果不存在,则返回初始化错误。
if (!fs::is_directory(GetBlocksDir(false))) { return InitError(strprintf(_("Specified blocks directory \"%s\" does not exist."), gArgs.GetArg("-blocksdir", "").c_str())); }如果同时指定了
prune、txindex,则抛出初始化错误。如果指定了区块修剪
prune,就要禁止交易索引txindex,两者不兼容,只能其一。if (gArgs.GetArg("-prune", 0)) { if (gArgs.GetBoolArg("-txindex", DEFAULT_TXINDEX)) return InitError(_("Prune mode is incompatible with -txindex.")); }检查是否指定了
-bind或-whitebind两者之一,并且同时禁止其他节点连接(listen)。如果是,则抛出初始化错误。size_t nUserBind = gArgs.GetArgs("-bind").size() + gArgs.GetArgs("-whitebind").size(); if (nUserBind != 0 && !gArgs.GetBoolArg("-listen", DEFAULT_LISTEN)) { return InitError("Cannot set -bind or -whitebind together with -listen=0"); }确保有足够的文件符可用。
因为在类 Unix 系统中,每个套接字都是一个文件,都需要一个文件描述符。所以要检查指定的最大连接数
maxconnections是否超过系统可用限制。int nBind = std::max(nUserBind, size_t(1)); nUserMaxConnections = gArgs.GetArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS); nMaxConnections = std::max(nUserMaxConnections, 0); nMaxConnections = std::max(std::min<int>(nMaxConnections, FD_SETSIZE - nBind - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS), 0); nFD = RaiseFileDescriptorLimit(nMaxConnections + MIN_CORE_FILEDESCRIPTORS + MAX_ADDNODE_CONNECTIONS); if (nFD < MIN_CORE_FILEDESCRIPTORS) return InitError(_("Not enough file descriptors available.")); nMaxConnections = std::min(nFD - MIN_CORE_FILEDESCRIPTORS - MAX_ADDNODE_CONNECTIONS, nMaxConnections); if (nMaxConnections < nUserMaxConnections) InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
Last updated
Was this helpful?