(本文转载请告知,保留所有权利)

前言

由于有很多新生区块链技术学习者,问我如何入门这些代码,所以打算放一篇文来介绍下。

相较于中文资料各种教程类文章,本系列文章侧重源码架构和分析。

这里所说的三大巨人是指:比特币,以太坊,比特股。其他微创新的代码可以以这些代码为base进行扩展研读,所以只打算介绍这三巨人。

由于本人是CXX工程师,除了模块分析之外,其他源码的介绍主要以CXX的代码为主。

考虑到难度,这里以比特股的代码最为复杂,以太坊的代码其次也最为舒服,

而以上两个工程,都需要以比特币的源码作为支撑,而且比特币的代码算作区块链入门级的,即使对于CXX新手来说,也是可以一窥全貌的。

所以本文主要以比特币的源码作为切入,在后续系列的文章会接续介绍另外两个巨人。

本文的比特币源码主要以bitcoin-core 源码 v0.12 和 v0.8.2两个版本作为参考:https://github.com/bitcoin/bitcoin

v0.8.2在挖矿上有优势,v0.12在代码上有优势,分别体现了0.8=>0.9 hardfork 不同版本之间比较大的差异。

BTC模块图

比特币的源码模块一览:

(图1)

从图中我们可以看出代码的脉络看起来非常清晰,其实不然,在每个模块之间还有很多过渡的小类,模块之间的联系也非常紧密。

比方说Wallet模块就和Transaction模块非常紧密,而P2P网络模块也和Transaction模块很紧密。

从分层的角度来看,所有代码都是以P2P网络协议为基础的事件机制作处理的。

如果要了解整个代码模块,可以先从P2P网络协议开始入手: Net.cpp Netbase.cpp 等类文件

当然入口函数也是需要先行了解的,

这里有我随手画的一张bitcoind启动函数栈调用一览:

(图2)

另外在送一张BTCD (比特币Go语言客户端)的模块图,可以用作参考

(图3)

整体模块划分似乎和bitcoind差别不大,多了websocket,btcwire外面的东西。

如何阅读BTC源码

如果要以代码的角度来分析BTC源码,需要了解一些基础的类,比方基础类型定义,数据流处理相关的类,HASH处理相关的类,BigNum类等等。

结合上面的一些画图思路,读者应当在阅读源码的过程中提炼出类似的模块图,类图,时序图用以分析,也可以借助一些逆向工程工具生成有用的图表。

总体的脉络上来说,BTC的类设计是比较简单的,很多类都几乎接近POD类型,而且充斥着大量的public的成员变量。

因为从v0.8.2版本来看,很多代码混合了C++模板和C语言宏一起使用,充斥着大量的全局变量,这种现象到v0.12版本好了很多。

尤其我前篇文讨论CDataStream类,也可以看出,随着时代的发展,BTC的代码也一直在进化。

如果作为新手,建议两个版本的源码可以看看,因为很多的类未必需要如此设计,看起来比较变扭。

另外一个好玩的地方是0.12版本把挖矿相关的代码削弱了,所以如果不配合如 cpuminer或者bfgminer,很可能几个小时你也挖不到块。

最好的建议是两个版本混合使用v0.8版本的挖矿代码还是很给力的,10分钟一个块不玩虚的,而0.12版本用来测试交易。

随着版本的迭代,很多jsonrpc也是有变化的,最典型的是getwork命令在0.12版本消失了,变成了三个更具体的命令比如getnetworkinfo等。

所以在测试时以及搜索资料时,需要注意不要全信,尽量自己动手测试,因为这些文档很可能都过时了,尤其是好些中文资料,抄来抄去居多。

所以读者应尽量选择google+英文资料进行学习。

另外一个需要注意的地方是,在v0.8版本的挖矿代码中,我们注意到了使用了crypto++库,这是一个有关加密解密哈希相关的C++的库,

对密码学实现感兴趣的读者可以自己找这个库研究一番。