本文以比特币 v0.12.1(目前最新为 v0.16.0)为例进行解读,这是内置挖矿功能的最后一个版本。

1. 获取源码

$ git clone https://github.com/bitcoin/bitcoin.git
$ cd bitcoin # 进入根目录
$ git checkout v0.12.1 # 切换到 v0.12.1
$ cd src # 进入源码目录

2. 源码剖析

使用 grep 查看入口函数 main 的所在位置。 比特币核心程序 bitcoind 的入口函数定义在源文件 bitcoind.cpp 中。

int main(int argc, char* argv[])
{
    SetupEnvironment(); // 1. 设置程序运行环境:本地化处理

    // Connect bitcoind signal handlers
    noui_connect(); // 2. 无 UI 连接:连接信号处理函数

    return (AppInit(argc, argv) ? 0 : 1); // 3. 应用程序初始化:初始化并启动
}

比特币 v0.12.1 核心服务程序启动流程:

  1. SetupEnvironment()
    设置程序运行环境:本地化处理
  2. noui_connect()
    无 UI 连接:连接信号处理函数
  3. AppInit(argc, argv)
    应用程序初始化:初始化并启动
    1. ParseParameters(argc, argv)
      解析命令行(控制台传入)参数
    2. help and version info
      版本和帮助信息
    3. GetDataDir(false)
      获取数据目录
    4. ReadConfigFile(mapArgs, mapMultiArgs)
      读取配置文件
    5. SelectParams(ChainNameFromCommandLine())
      选择区块链(网络)参数
    6. command-line arguments sanity check
      命令行参数完整性检查
    7. daemonization
      守护进程化
    8. setup server
      设置服务选项
    9. InitLogging()
      初始化日志记录
    10. InitParameterInteraction()
      初始化参数交互
    11. AppInit2(threadGroup, scheduler)
      应用程序初始化 2
      1. Step 1: setup
        步骤 1:安装
      2. Step 2: parameter interactions
        步骤 2:参数交互
      3. Step 3: parameter-to-internal-flags
        步骤 3:参数转换为内部标志
      4. Step 4: application initialization: dir lock, daemonize, pidfile, debug log
        步骤 4:应用程序初始化:目录锁,守护进程化,进程号文件,调试日志
      5. Step 5: verify wallet database integrity
        步骤 5:验证钱包数据库的完整性
      6. Step 6: network initialization
        步骤 6:网络初始化
      7. Step 7: load block chain
        步骤 7:加载区块链
      8. Step 8: load wallet
        步骤 8:加载钱包
      9. Step 9: data directory maintenance
        步骤 9:数据目录维护
      10. Step 10: import blocks
        步骤 10:导入区块
      11. Step 11: start node
        步骤 11:启动节点
      12. Step 12: finished
        步骤 12:完成
    12. WaitForShutdown(&threadGroup)
      等待关闭:根据启动标志做出相应处理
    13. Shutdown()
      关闭

bitcoind-startup

参考链接