如果不特殊标识, 所有分析都是基于最新的 master branch
编译的第一个历史遗留问题–>Berkeley DB 4.8. 所以要自己去Oracle 下载4.8 代码, 然后自行编译即可. 否则因为这个依赖关系, 编译将失败. 还有就是对于boost的依赖. 缺省安装所有的boost 库即可. zmq 这类的属于可有可无, 不影响我们的分析. level_db/crypto/test 这些目录不做分析(含secp256k1). BTC 适用Berkely DB 存储钱包数据. level DB 存储 主链索引. make ctags; make cscope ; make GTAGS 会生成对应代码索引方便查阅. 分析的主要是核心的BTC逻辑, 第三方库和helper这些不做分析 目录结构 :
├── addrdb.cpp /* 网络节点地址管理模块 */
├── addrdb.h /* 网络节点地址管理模块 */
├── addrman.cpp /* 网络节点地址管理模块 */
├── addrman.h /* 网络节点地址管理模块 */
├── amount.h /* BTC 的量纲定义 */
├── arith_uint256.cpp /* BTC 定制的uint256类含串行化*/
├── arith_uint256.h /* BTC 定制的uint256类含串行化*/
├── base58.cpp /*BTC钱包 地址编码方法类 */
├── base58.h /*BTC钱包 地址编码方法类 */
├── bech32.cpp /*新的BTC钱包 地址编码方法类 */
├── bech32.h /*新的BTC钱包 地址编码方法类 */
├── bench /*剪裁google的微测试框架*/
├── bitcoin-cli.cpp /*BTC RPC 命令行客户端*/
├── bitcoind.cpp /*BTC RPC 服务器端, 程序的入口*/
├── bitcoin-tx.cpp /*BTC transaction 组装 重要! */
├── blockencodings.cpp /*BTC 节点间通信交换Block */
├── blockencodings.h /*BTC 节点间通信交换Block */
├── bloom.cpp /*Bloom filter, SPV node 需要*/
├── bloom.h /*Bloom filter, SPV node 需要*/
├── chain.cpp /*维护Block的索引 */
├── chain.h /*维护Block的索引 */
├── chainparamsbase.cpp /*Chainparams基类*/
├── chainparamsbase.h /*Chainparams基类*/
├── chainparams.cpp /*整个BTC系统的可调整参数!!!!!*/
├── chainparams.h /*整个BTC系统的可调整参数!!!!!*/
├── chainparamsseeds.h /*缺省的node域名*/
├── checkpoints.cpp /*找回最近的checkpoint*/
├── checkpoints.h /*找回最近的checkpoint*/
├── checkqueue.h /*validate queue manager*/
├── clientversion.cpp /* version number */
├── clientversion.h /* version number */
├── coins.cpp /*uxio 含串行化部分逻辑*/
├── coins.h /*uxio 含串行化部分逻辑*/
├── compat /*一些工具及第三方头文件*/
├── compat.h /*跨平台的定义集合*/
├── compressor.cpp /*对script的压缩, 主要是pubkey的几种
压缩模式, 重要!!!!*/
├── compressor.h
├── config
├── consensus /* 共识相关的模块.含隔离见证,
merkle树,各种锁的支持与否*/
├── core_io.h /*transaction parser 相关 */
├── core_memusage.h
├── core_read.cpp /*transaction parser 相关 */
├── core_write.cpp /*transaction parser 相关 */
├── crypto /*相关的密码算法第三方库*/
├── cuckoocache.h /*cuckoo hash cache定义*/
├── dbwrapper.cpp /* level db数据库包装*/
├── dbwrapper.h /* level db 数据库包装 */
├── fs.cpp
├── fs.h
├── hash.cpp /*sha256串行化helper */
├── hash.h /*sha256串行化helper */
├── httprpc.cpp
├── httprpc.h
├── httpserver.cpp
├── httpserver.h
├── indirectmap.h
├── init.cpp /* 系统初始化*/
├── init.h
├── key.cpp /* secp256k1 wrapper*/
├── key.h
├── keystore.cpp /* map address→ pub/priv key*/
├── keystore.h
├── leveldb /* google 第三方库 key/value*/
├── limitedmap.h
├── Makefile
├── Autotools Mythbuster
├── Makefile.bench.include
├── Makefile.in
├── Makefile.leveldb.include
├── Makefile.qt.include
├── Makefile.qttest.include
├── Makefile.test.include
├── memusage.h
├── merkleblock.cpp /*merkle树遍历*/
├── merkleblock.h
├── miner.cpp /*组装新的block 算法*/
├── miner.h
├── netaddress.cpp
├── netaddress.h
├── netbase.cpp
├── netbase.h
├── net.cpp
├── net.h
├── netmessagemaker.h
├── net_processing.cpp /*节点间通信处理模块 重要!!*/
├── net_processing.h
├── noui.cpp
├── noui.h
├── obj
├── obj-test
├── policy /*交易费率策略,选择性加入费用替代*/
├── pow.cpp /*hashcash*/
├── pow.h
├── prevector.h
├── primitives /*transaction, uixo 结构定义*/
├── protocol.cpp /*节点间通信协议*/
├── protocol.h
├── pubkey.cpp /* wallet用pubkey相关*/
├── pubkey.h
├── qt
├── random.cpp /*随机数生成*/
├── random.h
├── rest.cpp
├── reverse_iterator.h
├── reverselock.h
├── rpc
├── scheduler.cpp
├── scheduler.h
├── script /*forth 脚本 解释器*/
├── secp256k1 /* 第三方ECC库*/
├── serialize.h /*串行化helper*/
├── streams.h
├── support
├── sync.cpp /*线程同步helper*/
├── sync.h
├── threadinterrupt.cpp
├── threadinterrupt.h
├── threadsafety.h
├── timedata.cpp
├── timedata.h
├── tinyformat.h
├── torcontrol.cpp
├── torcontrol.h
├── txdb.cpp /*block→leveldb 事务*/
├── txdb.h
├── txmempool.cpp /*节点tx pool的管理 */
├── txmempool.h
├── ui_interface.cpp
├── ui_interface.h
├── uint256.cpp /* uint256 含160 串行化*/
├── uint256.h
├── undo.h
├── univalue /*第三方 json持续层*/
├── util.cpp
├── util.h
├── utilmoneystr.cpp
├── utilmoneystr.h
├── utilstrencodings.cpp
├── utilstrencodings.h
├── utiltime.cpp
├── utiltime.h
├── validation.cpp /* 全局状态的检查,重要!!! */
├── validation.h
├── validationinterface.cpp
├── validationinterface.h
├── versionbits.cpp
├── versionbits.h
├── version.h
├── wallet /*wallet的实现*/
├── warnings.cpp
├── warnings.h
└── zmq
代码的复杂度, 如果简单的以行数来看, 400 line以上代码文件如下
我要说的是 非核心逻辑占了很大一部分, 核心的BTC 区块链逻辑只有一半不到!
4672 ./validation.cpp
3672 ./net_processing.cpp
2876 ./net.cpp
1730 ./init.cpp
1628 ./rpc/blockchain.cpp
1567 ./script/interpreter.cpp
1472 ./chainparamsseeds.h
1068 ./tinyformat.h
1065 ./txmempool.cpp
1044 ./policy/fees.cpp
1033 ./rpc/rawtransaction.cpp
999 ./rpc/mining.cpp
966 ./serialize.h
916 ./util.cpp
878 ./bitcoin-tx.cpp
862 ./net.h
781 ./txmempool.h
776 ./torcontrol.cpp
735 ./utilstrencodings.cpp
735 ./netaddress.cpp
726 ./netbase.cpp
707 ./streams.h
705 ./httpserver.cpp
697 ./script/script.h
653 ./rpc/misc.cpp
648 ./rpc/net.cpp
604 ./addrman.h
602 ./rest.cpp
559 ./rpc/server.cpp
523 ./addrman.cpp
518 ./bitcoin-cli.cpp
517 ./prevector.h
494 ./chain.h
486 ./validation.h
481 ./cuckoocache.h
467 ./random.cpp
459 ./miner.cpp
428 ./config/bitcoin-config.h
426 ./txdb.cpp
424 ./script/sign.cpp
413 ./primitives/transaction.h
401 ./protocol.h
最后, 与其从 bitcoind.cpp 入口开始, 不如 切入核心逻辑(从primitives 开始).
从而避免陷入巨量的非核心逻辑代码.