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