大螃嗨

好记性不如烂笔头

用户工具

站点工具


比特币源码

如果不特殊标识, 所有分析都是基于最新的 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 开始).

从而避免陷入巨量的非核心逻辑代码.

比特币源码.txt · 最后更改: 2018/08/11 02:55 由 螃蟹