比特币源码研读之五

作者: 菜菜子_forest | 来源:发表于2017-07-16 13:00 被阅读1127次

    本文将继续参数处理其他部分源码的研读。

    本文主要涉及的源码文件包括:

    src/bitcond.cpp、src/util.h、src/util.cpp、src/init.h、src/init.cpp、src/chainparamsbase.h、src/chainparamsbase.cpp

    一、数据目录

    此处的数据目录为比特币中的区块、区块链、交易、交易池、钱包以及P2P网络等数据文件所在目录,该目录涉及我们的比特币核心程序是否可以正确运行,因此其正确设置将是至关重要的。数据目录存储文件信息如图所示。

    其实现代码如下:

    if(!boost::filesystem::is_directory(GetDataDir(false)))

    {

    fprintf(stderr, "Error: Specified datadirectory \"%s\" does not exist.\n", GetArg("-datadir","").c_str());

    return false;

    }

    我们首先看第一行的if语句,在该语句中判断了GetDataDir(false)函数返回的数据路径是否为目录名称,如果不是,则打印指定目录不存在的错误提示信息,并且因为数据目录不正确,而导致比特币核心程序无法正常运行,所以返回false,程序退出。

    所以,数据目录是否正确的关键在于GetDataDir(false)函数获取的目录信息的正确性。那我们来看GetDataDir函数的具体实现。该函数的实现可以在src/util.cpp中找到。

    实现文件src/util.cpp

    const boost::filesystem::path &GetDataDir(bool fNetSpecific)

    该函数的具体实现流程如图所示。

    我们先来看流程图中的第2步和第3步,程序中对GetDataDir(false)函数传入的参数为false,即使用本地文件目录,如果未设置“-datadir”参数,程序将执行流程图中的GetDefaultDataDir函数,该函数的实现也位于src/util.cpp中。

    在该函数中我们可以获得比特币后台进程在Windows、Mac以及unix等操作系统下的默认数据目录。具体如下:

    // Windows < Vista: C:\Documents andSettings\Username\Application Data\Bitcoin

    // Windows >= Vista:C:\Users\Username\AppData\Roaming\Bitcoin

    // Mac: ~/Library/Application Support/Bitcoin

    // Unix: ~/.bitcoin

    第4步中,程序判断是否为网络目录,如果是在执行第5步,在第5步中我们将获得Path中的BaseParams.DataDir()目录,该目录的定义在chainparamsbase.h中有具体实现。

    第6步通过fs::create_directories(path);创建数据目录。

    第7步返回创建的数据目录,此时程序通过GetDataDir(false)函数获得了数据目录路径,如果路径信息正确且存在,程序将继续运行,否则前文所述,程序将停止运行,返回false。

    二、读取配置文件

    完成数据目录的创建后,程序将进入配置文件读取部分,其实现代码如下:

    ReadConfigFile(GetArg("-conf",

    BITCOIN_CONF_FILENAME));

    我们首先来看BITCOIN_CONF_FILENAME宏定义,比特币后台进程的配置文件名为bitcoin.conf,且位于数据目录中。该文件中包含的信息如图所示。

    因此BITCOIN_CONF_FILENAME应该定义为“bitcoin.conf”,通过查找发现其定义位于src/util.cpp中,如图所示。

    再来看GetArg函数,在其实现中首先判断是否存在"-conf"参数,如果存在,则使用我们在比特币源码研读之三中参数解析结果中保存的参数值作为配置文件,否则使用默认的“bitcoin.conf”。

    在获得配置文件名后,我们可以来分析ReadConfigFile函数实现。在该函数实现了配置文件中参数与参数值的读取操作,并将读取的参数信息存入比特币源码研读之三mapArgs与_mapMultiArgs中。

    函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。

    至此,我们完成了参数处理中的数据目录创建与配置文件读取源码与流程的分析,后续我们将继续前行,敬请期待!

    作者:区块链研习社比特币源码研读班 菜菜子


    以下是广告:

    我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。

    目前入圈价格初始定价50元,50人调整一次价格,每次调整幅度为50元!

    相关文章

      网友评论

      • OYohoo:麻烦先把把《if(!boost::filesystem::is_directory(GetDataDir(false)))》这快代码的出处指出一下 ,没有没有搜索到
      • OYohoo:没找到说的 是那个文件。。。
        菜菜子_forest:@OYohoo 要的
        OYohoo:@菜菜子_forest 要收费啊?
        菜菜子_forest:这么热心读源码,加入我们研读班吧

      本文标题:比特币源码研读之五

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