比特币源码分析1

2019-07-17  本文已影响0人  nit小星星

比特币有几个客户端,也就是由几个入口main函数

先从bitcoin.cpp的main函数分析

int main(int argc, char* argv[])

{

#ifdef WIN32

    util::WinCmdLineArgs winArgs;

    std::tie(argc, argv) = winArgs.get();

#endif

    SetupEnvironment();

    // Connect bitcoind signal handlers

    noui_connect();

    return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);

}

非常简短的入口函数:

首先是 SetupEnvironment();

这个函数的作用是设置一下内存申请和释放方式

mallopt(M_ARENA_MAX, 1)是malloc的底层函数。

第一个参数控制内存的行为。比如说你申请一个大于1M空间的数据,malloc会调用操作系统提供的接口申请更大的空间。delete的时候并没有还给操作系统。详细信息查相关文档

第二个函数是 noui_connect();

点进去一看是这样的

void noui_connect()

{

    uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);

    uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);

    uiInterface.InitMessage_connect(noui_InitMessage);

}

这三个boost库中的信号槽机制。先说功能。

用于输出日志的程序运行等错误信息。

当将来调用uiInterface.ThreadSafeQuestion_connect()

的时候这些信号都会触发。

回到入口函数static bool AppInit(int argc, char* argv[])

        InitInterfaces interfaces;

    interfaces.chain = interfaces::MakeChain();

首先初始化一个Initinterfaces里面的chain

struct InitInterfaces

{

    std::unique_ptr<interfaces::Chain> chain;

    std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;

};

这个chain里面有一个lock接口类里还有一个Notifications类。里面有很多很重要的接口。比如说根据hash查找区块等。

然后mainchain()调用makeunique

std::unique_ptr<T> MakeUnique(Args&&... args)

{

    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));

}

ChainClient就是继承chain的子类。返回一个ChainClient的智能指针

总结:就是利用传入的命令行参数作为chainclient的构造函数参数初始化chainclient

接下来到另外一个函数了

SetupServerArgs();

这个函数内容相当大。总的来说就是设置一系列环境。加载配置文件等等。加载之后才进入主函数

bool AppInitMain(InitInterfaces& interfaces)

当然不能调过配置加载啦

上一篇 下一篇

猜你喜欢

热点阅读