在本地网络(regtest)挖矿和记账
少壮不囤币,老大徒伤悲。在前面一篇文章我们学习到在测试网络(testnet)发送和接受比特币,不过测试网络需要下载整个区块链数据,不太方便,目前我们了解到比特币主网络(mainnet)是比特币正式使用的,测试网络(testnet)是开发者用来测试的,测试网络的币可以免费领。还有一种是本地网络(regtest),这个更厉害,可以重头开始挖一个区块,进行回归测试,下面我们开始操作使用本地网络(regtest)测试挖矿和记账,启动比特币客户端时添加 -regtest 参数。
1 2 |
/Applications/Bitcoin-Qt.app/Contents/MacOS/Bitcoin-Qt -regtest |
打开成功之后看到本地网络(regtest)显示的是蓝色的,如下图所示。在前面的文章我们看到主网络(mainnet)显示的是黄色,测试网络(testnet)显示的是绿色。
获取当前的区块信息,可以看到当前的区块个数是 0,信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
getblockchaininfo { "chain": "regtest", "blocks": 0, "headers": 0, "bestblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", "difficulty": 4.656542373906925e-10, "mediantime": 1296688602, "verificationprogress": 1, "initialblockdownload": true, "chainwork": "0000000000000000000000000000000000000000000000000000000000000002", ...... |
我们需要挖出一个区块,在控制台上输入命令 generate 1 代表挖一个区块,有可能会提示下面的错误。
1 2 |
has been replaced by the -generate cli option. Refer to -help for more information. (code -32601) |
尝试切换到命令行,调用 bitcoin-cli 创建第一个区块,这时可以成功。
1 2 3 4 5 6 7 8 |
./bitcoin-cli -regtest -generate 1 { "address": "bcrt1qcj6ar25j7hmrr3dh2yplusq9g623ltyymdeudx", "blocks": [ "25277be9c9e5fef3bd48e1af965581933a9b6ae4d6ce096c3086702c12d14d57" ] } |
getblock 命令可以查询这个区块的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
./bitcoin-cli -regtest getblock 25277be9c9e5fef3bd48e1af965581933a9b6ae4d6ce096c3086702c12d14d57 { "hash": "25277be9c9e5fef3bd48e1af965581933a9b6ae4d6ce096c3086702c12d14d57", "confirmations": 1, "strippedsize": 213, "size": 249, "weight": 888, "height": 1, "version": 536870912, "versionHex": "20000000", "merkleroot": "22fbb6c2017927d63ed49941a5b77ead1938a7b37108670fae8eb710c7ca90a7", "tx": [ "22fbb6c2017927d63ed49941a5b77ead1938a7b37108670fae8eb710c7ca90a7" ], "time": 1611489703, "mediantime": 1611489703, "nonce": 1, "bits": "207fffff", "difficulty": 4.656542373906925e-10, "chainwork": "0000000000000000000000000000000000000000000000000000000000000004", "nTx": 1, "previousblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206" } |
这时我们看客户端上显示余额有 50 BTC,如下图所示。
不过在交易记录里可以看到需要 101 个区块确认才可以使用这 50 个 BTC,如下图所示。
gettransaction 命令可以查看该笔交易的详情
1 2 3 4 5 6 7 8 9 10 11 12 |
gettransaction 22fbb6c2017927d63ed49941a5b77ead1938a7b37108670fae8eb710c7ca90a7 { "amount": 0.00000000, "confirmations": 1, "generated": true, "blockhash": "25277be9c9e5fef3bd48e1af965581933a9b6ae4d6ce096c3086702c12d14d57", "blockheight": 1, "blockindex": 0, "blocktime": 1611489703, ...... } |
接下来可以使用 generatetoaddress 再挖 100 个区块并且指定奖励的 BTC 发送到 bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236 地址。
1 2 3 4 5 6 7 8 9 10 |
generatetoaddress 100 bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236 [ "10f219ad2ec202095d74a8627e3d18a3510b0fc2a1144cfaf38d92eb7bf89076", "5076ac1a63acbae6f62798dd2c54bf84a86ac6509c84a8daa06d81b916bab32e", "77fbec09c28a862316e373fd9abd4d21c0061a9c494bbd46511087e0f906666d", "4ad7d6b052758a52efcaf0c80ee4b5178d5ad0f7cd15158a840265979dcbf595", "738d2994eaff7568eb47e32fc44d0c63991a94d3b97049bbc35c9673623e55a7", .... ] |
目前我们的本地网络有 101 个区块,第一个挖出的区块奖励 50个BTC已经可以使用,新挖的 100 个区块的奖励 5000 个BTC还不能使用,如下图所示。
通过 getbalance 可以获取当前钱包的余额,但是一个钱包有可能会有多个地址,我们可以使用 listaddressgroupings 显示所有地址对应的余额。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
getbalance 50.00000000 listaddressgroupings [ [ [ "bcrt1qcj6ar25j7hmrr3dh2yplusq9g623ltyymdeudx", 50.00000000, "" ] ], [ [ "bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236", 0.00000000, "" ] ] ] |
接着我们尝试转账 25 个 BTC,最小的手续费是每 KB 使用 0.00001000,大概一个字节一聪,比特币最小的单元是聪,可以看到该笔交易的体积大于是 0.141 KB,手续费对应的就是 0.00000141 个 BTC,如下图所示。
发送完成之后,查询 txid,可以看到 confirmations 是 0,说明确认数是 0,这笔交易未被确认。
1 2 3 4 5 6 7 8 9 10 |
gettransaction 99d589fdf5a02268b2cef9954e5b3e2a92a38020355916baa0473458f8f79dc2 { "amount": 0.00000000, "fee": -0.00000141, "confirmations": 0, "trusted": true, ...... } |
我们需要挖一个区块才能确认这一笔交易。
1 2 3 4 5 |
generatetoaddress 1 bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236 [ "2b7d13b1d8be18d5a1b99d22c015b12cd973c4e76d7381c8a65cca55fccd3bbd" ] |
此时可以看到 bcrt1qcj6ar25j7hmrr3dh2yplusq9g623ltyymdeudx 地址的余额变成 0,bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236 变成 75,因为还有 50 是挖矿得到的奖励,为什么这里又多了一个 bcrt1q7m6p0s8aq6fn7q4eujuv8wjh0mk2w5c9n6w9y8 呢?里面有 24.99999859 金额是怎么回事?我觉得应该是找零地址,bcrt1qcj6ar25j7hmrr3dh2yplusq9g623ltyymdeudx 把扣除手续费后还剩的 24.99999859 转给了找零地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
listaddressgroupings [ [ [ "bcrt1qcj6ar25j7hmrr3dh2yplusq9g623ltyymdeudx", 0.00000000, "" ], [ "bcrt1q7m6p0s8aq6fn7q4eujuv8wjh0mk2w5c9n6w9y8", 24.99999859 ] ], [ [ "bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236", 75.00000000, "" ] ] ] |
可以看到新挖出的这个区块有两个 tx,说明是有两笔交易。一笔交易是转账 25 BTC,还有一笔是挖矿奖励 50 BTC。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
getblock 2b7d13b1d8be18d5a1b99d22c015b12cd973c4e76d7381c8a65cca55fccd3bbd { "hash": "2b7d13b1d8be18d5a1b99d22c015b12cd973c4e76d7381c8a65cca55fccd3bbd", "confirmations": 1, "strippedsize": 327, "size": 472, "weight": 1453, "height": 102, "version": 536870912, "versionHex": "20000000", "merkleroot": "453e0a5655448a99727e2d1b3015b0465fd1b426b0354cf884ed1ba4222f19b6", "tx": [ "5ab0d6ae833b439d9d1a06ee0002384c8afce1450c8a01c813b148a602f339d9", "99d589fdf5a02268b2cef9954e5b3e2a92a38020355916baa0473458f8f79dc2" ], "time": 1611494585, "mediantime": 1611492039, "nonce": 1, "bits": "207fffff", "difficulty": 4.656542373906925e-10, "chainwork": "00000000000000000000000000000000000000000000000000000000000000ce", "nTx": 2, "previousblockhash": "39af9cf0b60ca07ba780125bc730c4b07ad1683f98a8c079410473abe1c5eda4" } |
区块里的第一笔交易称为 coinbase,是用于挖矿奖励的。可以看到 0.00000141 手续费和 50 BTC 挖矿奖励一起发送到了 bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236,说明矿工除了能得到挖矿奖励还能获取打包该区块的所有手续费。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
gettxout 5ab0d6ae833b439d9d1a06ee0002384c8afce1450c8a01c813b148a602f339d9 0 { "bestblock": "2b7d13b1d8be18d5a1b99d22c015b12cd973c4e76d7381c8a65cca55fccd3bbd", "confirmations": 1, "value": 50.00000141, "scriptPubKey": { "asm": "0 f03939d3e5b9f76593ccc08b7e7592030f2d7229", "hex": "0014f03939d3e5b9f76593ccc08b7e7592030f2d7229", "reqSigs": 1, "type": "witness_v0_keyhash", "addresses": [ "bcrt1q7qunn5l9h8mkty7vcz9huavjqv8j6u3fvn5236" ] }, "coinbase": true } |
转载请注明:exchen's blog » 在本地网络(regtest)挖矿和记账