比特币源码分析1

比特币有几个客户端,也就是由几个入口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)

当然不能调过配置加载啦

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 其实对于我来说,我是特别认可区块链的发展的,之前也玩过ETH,EOS,但是我还是觉得需要从根源去了解区块链,...
    freelands阅读 1,403评论 2 3
  • 上一篇文章我们大致分析了一下比特币源码src文件夹的目录结构以及数据目录结构,接下来我们将进入源码的分析。本篇涉及...
    自如致知阅读 1,564评论 2 1
  • C++裸指针的内存问题有:1、空悬指针/野指针2、重复释放3、内存泄漏4、不配对的申请与释放 使用智能指针可以有效...
    WalkeR_ZG阅读 3,158评论 0 5
  • 简述 如何启动线程因启动性程需要一个callable type,可以有函数指针,类重载(),lambda三种形式。...
    传说中的水牛阅读 515评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,731评论 0 3