美文网首页区块链研习社
比特币源码阅读(六):初始化和启动(5)

比特币源码阅读(六):初始化和启动(5)

作者: 沙漠中的猴 | 来源:发表于2018-02-04 18:14 被阅读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的内容。

    相关文章

      网友评论

        本文标题:比特币源码阅读(六):初始化和启动(5)

        本文链接:https://www.haomeiwen.com/subject/ucodoxtx.html