比特币源码阅读(六):初始化和启动(5)
2018-02-04 本文已影响0人
沙漠中的猴
AppInitParameterInteraction()
这个函数在/src/init.cpp
文件中,该函数包含了step2和step3两部分内容,我们分开来看。
step2
// src/init.cpp
// ********************************************************* Step 2: parameter interactions
// also see: InitParameterInteraction()
// if using block pruning, then disallow txindex
if (gArgs.GetArg("-prune", 0)) {
if (gArgs.GetBoolArg("-txindex", DEFAULT_TXINDEX))
return InitError(_("Prune mode is incompatible with -txindex."));
}
// -bind and -whitebind can't be set when not listening
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");
}
第一个if语句的意思是,如果设置了-prune
参数,就不能设置-txindex
参数,否则就会报错。
-prune
参数是用来将一些"已经验证过的"数据删除,节约磁盘空间。默认设置为0,也就表示不裁剪数据。
-txindex
参数的作用是建立一个完整的交易索引,可以调用类似gettransaction
等命令来访问所有交易。
由此看来,这两个是不可共存的关系。所以在同时设置的时候报错。
第二个if语句的意思是,当配置了-bind
参数或者-whitebind
参数,就一定要配置-listen
参数,否则报错。
// Make sure enough file descriptors are available
int nBind = std::max(nUserBind, size_t(1));
nUserMaxConnections = gArgs.GetArg("-maxconnections", DEFAULT_MAX_PEER_CONNECTIONS);
nMaxConnections = std::max(nUserMaxConnections, 0);
// Trim requested connection counts, to fit into system limitations
nMaxConnections = std::max(std::min(nMaxConnections, (int)(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, nMax`Connections);
if (nMaxConnections < nUserMaxConnections)
InitWarning(strprintf(_("Reducing -maxconnections from %d to %d, because of system limitations."), nUserMaxConnections, nMaxConnections));
这段代码中出现了几个宏变量,我们来分别解释一下,这些宏变量都是代表什么意思,以及定义的位置。
// src/net.h
/** The maximum number of peer connections to maintain. */
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
DEFAULT_MAX_PEER_CONNECTIONS
表示节点最多连接个数,默认设置为125。
// src/compat.h
#define FD_SETSIZE 1024 // max number of fds in fd_set
FD_SETSIZE
设置文件描述符的最大个数为1024
//src/init.cpp
#ifdef WIN32
// Win32 LevelDB doesn't use filedescriptors, and the ones used for
// accessing block files don't count towards the fd_set size limit
// anyway.
#define MIN_CORE_FILEDESCRIPTORS 0
#else
#define MIN_CORE_FILEDESCRIPTORS 150
#endif
给LevelDB预留的文件描述符个数,因为WIN32系统不使用文件描述符,所以不用预留,所以windows系统就将MIN_CORE_FILEDESCRIPTORS
设置为0,否则设置为150。
// src/net.h
/** Maximum number of addnode outgoing nodes */
static const int MAX_ADDNODE_CONNECTIONS = 8;
设置节点连接个数最多为8个。
所以这段代码是用来确保文件描述符的个数在允许的范围内。下一篇我们再看step3的内容。