因为学习的需要,这一年半和接下来更长的时间都会与Bitcoin打交道。不可避免地,需要对Bitcoin的源码进行修改。 网上找过一些Bitcoin源码分析的资源,但大多都是基于C++实现的源码。笔者对C++并不是很熟悉,相反,用Go语言用得更多一些。所以,这个系列的博客会针对Go语言实现的Bitcoin进行分析,也即btcd。因为btcd的实现中将wallet的功能独立了出来,形成一个新的项目btcdwallet,因此我们也会对btcdwallet的代码实现进行分析。
I. 代码及软件版本
有必要明确一下btcd和btcwallet代码版本号,以及Go语言的版本号:
btcd版本:[git commit log] ed77733ec07dfc8a513741138419b8d9d3de9d2dbtcwallet版本:[git commit log] 9ad115360b375a08265d088580606a398202e3acGo版本:go1.11.2
II. 系统运行步骤
考虑到btcd和btcwallet的官方文档描述得不够详细,我们在这里演示一下btcd,btcwallet和btcctl的运行步骤。 我们以运行一个simnet网络为例。
A. 生成挖矿地址
在运行btcd时,需要通过--miningaddr指定一个挖矿的地址。这个挖矿地址我们需要借助btcwallet来生成,但btcwallet生成挖矿地址的过程又需要和btcd通信。这里就形成了一个环,也即:btcd依赖于btcwallet,btcwallet又依赖于btcd。
我们的处理方式是:
- 先不指定
--miningaddr运行btcd:./btcd -u seafooler -P 123456 --simnet - 然后运行
btcwallet连接btcd:./btcwallet -u seafooler -P 123456 --simnet(需要注意的是,在第一次运行btcwallet时,需要首先利用--create选项初始化一个钱包:./btcwallet -u seafooler -P 123456 --simnet --create) - 再运行
btcctl发送指令给btcwallet生成地址:./btcctl -u seafooler -P 123456 --wallet --simnet getnewaddress
B. 指定挖矿地址重启btcd
基于以上步骤生成的挖矿地址,重新启动btcd,如下所示:/btcd -u seafooler -P 123456 --simnet --miningaddr=SN9t3caxhG77Pn7cAitHHz7C9b5Jaadkt6
C. 挖矿操作
使用btcctl运行./btcctl -u seafooler -P 123456 --wallet --simnet generate 1命令即可生成一个新区块。此时通过命令./btcctl -u seafooler -P 123456 --wallet --simnet getbalance查看当前账户余额,会发现余额为0. 这是因为新挖出的区块奖励需要等待100个区块之后才能生效,也即使用./btcctl -u seafooler -P 123456 --wallet --simnet generate 99命令继续挖出99个新区块后,即可查询到当前余额为50.