Docker搭建比特币测试网络
1 安装相关软件
1.1 安装nodejs和npm
1.2 安装RPC支持库kapitalize
kapitalize的源码:https://github.com/shamoons/Kapitalize
$ npm install capitalize
【问题】
npm WARN enoent ENOENT: no such file or directory, open '/home/xx/package.json'
【解决】
切换到/usr/share/npm目录下安装,注意叫上sudo
$ sudo npm install capitalize
1.3 安装Docker
命令
$sudo apt-get install docker.io
创建软连接
$sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
2 安装运行比特币测试网络
2.1 下载比特币测试网络(bitcoin-testnet)的Docker镜像。
$sudo docker pull freewil/bitcoin-testnet-box
2.1 运行Docker镜像。
$sudo docker run -t -i -p 19001:19001 -p 19011:19011 freewil/bitcoin-testnet-box
注意:上述命令中的19001和19011是配置给两个节点提供RPC服务的端口。
2.3 进入Docker运行环境后,输入下面的命令来启动比特币测试网络:
$ make start
启动成功后,将在本机模拟运行两个比特币测试钱包节点,组成一个私有范围的比特币测试网络。
tester@093cb526fe8d:~/bitcoin-testnet-box$ make start
bitcoind -datadir=1 -daemon
Bitcoin server starting
bitcoind -datadir=2 -daemon
Bitcoin server starting
输入下面的命令可以查看测试网络节点状态信息,从中可以了解到比特币测试网络的配置和运行状态,比如协议版本、区块链长度和挖矿计算难度等内容。
$ make getinfo
tester@093cb526fe8d:~/bitcoin-testnet-box$ make getinfo
bitcoin-cli -datadir=1 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 0,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489621,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
bitcoin-cli -datadir=2 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 0,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489621,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
3 初始化和测试区块链数据
在Docker运行窗口里依次输入下面的命令来初始化创建基本的区块链数据,供进一步的程序示例来使用。
注意:在正式的比特币网络环境下,平均是10分钟左右才能产生一个新的区块。但在这里的测试网络(testnet)特殊设定的环境下,区块是通过简单的命令控制就可以即时和批量产生的,方便程序开发测试。
3.1 模拟产生1一个区块记录
tester@093cb526fe8d:~/bitcoin-testnet-box$ make generate
bitcoin-cli -datadir=1 generate 1
[
"6ebc434b410dda5e929d1b805dbc0682f0836835d923f3c9b76cd57ef9623f23"
]
3.2 模拟新产生200个区块记录
tester@093cb526fe8d:~/bitcoin-testnet-box$ make generate BLOCKS=200
bitcoin-cli -datadir=1 generate 200
[
"4b3904d9d4de9286976da3669386a49e450abfebd2d5b63315cf96bc645485af",
"1f01c311ea7afa8d35be9ac002819b60649b38cf19b124e307baa94c7a6d6427",
.
.
中间共有200行
.
.
.
"2dfac1ddf4c4e71352f5fbd1cfc951d4750585de9c7f2f643e8cd3a3a7eb8f0d",
"1ff1c51635aa7477323730a59398a273351f582ab3682779068f0ea3f7e6faf2"
]
3.3 查看最新的钱包状态包括 balance 余额信息,这时可以留意看到第一个钱包节点的账户余额发生了变动,新的余额即通过模拟区块挖矿产生的测试比特币。
bitcoin-cli -datadir=1 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 5050.00000000,
"blocks": 201,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489622,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
bitcoin-cli -datadir=2 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 201,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489621,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
3.4 给作为示例的测试钱包地址转账10个BTC。
tester@093cb526fe8d:~/bitcoin-testnet-box$ make sendfrom1 ADDRESS=mkiytxYA6kxUC8iTnzLPgMfCphnz91zRfZ AMOUNT=10
bitcoin-cli -datadir=1 sendtoaddress mkiytxYA6kxUC8iTnzLPgMfCphnz91zRfZ 10
e39de1cd82dd83526d5424785174ed506f9655c13976d615e83a59561c283a6f
注意:这里的示例地址mkiytxYA6kxUC8iTnzLPgMfCphnz91zRfZ是比特币测试网络下的钱包地址(以字符m起始),与比特币正式网络下的钱包地址(一般以数字1或3起始)是有区别的。
3.5 模拟新产生10个区块记录,让上面的转账交易得到足够有效的确认。
$ make generate BLOCKS=10
bitcoin-cli -datadir=1 generate 10
[
"0e3a09f2e51d4ba6c31205db54bced6bd5930183f5a84c1bafa057cc8802493e",
"2e14f4cbf7698319be5de7ea5e27a4486fc2a2a6b50f824fdb1f4d22cad64041",
"7e2b64ec51597c45cd5ae263e9fdeab409de6d75bf81d9def527decf1c2951cc",
"1757540748c0a771a7dc17038f8730fb36258fa4e31c1d525939bfd40209ff53",
"095c6557f72b947fb2beeac8069d07b9c0867c8bc19b71c56c2e594bc6f69988",
"54932f2a307db0044a3a8af8c4b88c2219c8b70064c03b2a4e689eb6beb727a0",
"073f5daa6ab46d50600fb28150e0013e42f11dad84c21f5ee3f8acbcb4a6d66a",
"2c65b368a18586126b2c0cae0ab6ccc92c525eb470995437d2fe3b3ae309c215",
"45f2d770b0f8ed3a40d298eea056deaf6d0e619e5928bd41ded7a7f8627502bf",
"49603877d4cd7c26ee83d6d76cee27537bf56da37c5028ea606393d73d4f391e"
]
3.6 查看最新的钱包状态包括余额信息, 这时可以留意看到第一个钱包节点的balance 账户余额发生了改变 ,差额部分即已经交易转账支出的10个BTC加上少许的矿工费用。
tester@093cb526fe8d:~/bitcoin-testnet-box$ make getinfo
bitcoin-cli -datadir=1 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 5539.99996180,
"blocks": 211,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489622,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
bitcoin-cli -datadir=2 getinfo
{
"version": 130200,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 211,
"timeoffset": 0,
"connections": 1,
"proxy": "",
"difficulty": 4.656542373906925e-10,
"testnet": false,
"keypoololdest": 1529489621,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
【参考资料】:《区块链技术指南》 邹均,张海宁,唐屹,李磊 著