区块链研习社

比特币源码阅读(六):初始化和启动(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的内容。

上一篇下一篇

猜你喜欢

热点阅读