因为学习的需要,这一年半和接下来更长的时间都会与Bitcoin
打交道。不可避免地,需要对Bitcoin
的源码进行修改。
网上找过一些Bitcoin
源码分析的资源,但大多都是基于C++
实现的源码。笔者对C++
并不是很熟悉,相反,用Go
语言用得更多一些。所以,这个系列的博客会针对Go
语言实现的Bitcoin
进行分析,也即btcd。因为btcd
的实现中将wallet
的功能独立了出来,形成一个新的项目btcdwallet,因此我们也会对btcdwallet
的代码实现进行分析。
有必要明确一下btcd
和btcwallet
代码版本号,以及Go
语言的版本号:
btcd
版本:[git commit log] ed77733ec07dfc8a513741138419b8d9d3de9d2dbtcwallet
版本:[git commit log] 9ad115360b375a08265d088580606a398202e3acGo
版本:go1.11.2考虑到btcd
和btcwallet
的官方文档描述得不够详细,我们在这里演示一下btcd
,btcwallet
和btcctl
的运行步骤。
我们以运行一个simnet
网络为例。
在运行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
基于以上步骤生成的挖矿地址,重新启动btcd
,如下所示:/btcd -u seafooler -P 123456 --simnet --miningaddr=SN9t3caxhG77Pn7cAitHHz7C9b5Jaadkt6
使用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.