实验2 利用回归测试网络实现挖矿与交易

三葉Leaves Author

上一章节实验1 初步熟悉比特币客户端中我们新建了单个回归测试网络节点并且测试性挖矿,这次我们新建三个,并且尝试让他们相互连接起来,最后实现交易即证明成功。

创建节点配置并运行

我们找到比特币客户端应用数据路径,一般在 C 盘,上一章节已经提到过。然后我们新建三个文件夹,用于生成三个测试节点:

1
mkdir alice; mkdir bob; mkdir network

现在你的应用数据文件夹应该差不多长这样:

接着,我们为其分步创建数据目录,因为不这样做,他们就会去用根目录下的配置文件,导致冲突:

1
mkdir alice\datadir; mkdir bob\datadir; mkdir network\datadir

现在我们可以为每一个节点创建配置了:
alice\bitcoin.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Alice 节点配置
regtest=1
datadir=C:\Users\26646\AppData\Local\Bitcoin\alice\datadir
server=1
listen=1
fallbackfee=0.0001
txindex=1

[regtest]
port=18444
rpcport=18445
rpcuser=alice
rpcpassword=alicepwd
bind=127.0.0.1
addnode=127.0.0.1:18446 # Bob's port
addnode=127.0.0.1:18448 # Network's port

bob\bitcoin.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Bob 节点配置
regtest=1
datadir=C:\Users\26646\AppData\Local\Bitcoin\bob\datadir
server=1
listen=1
fallbackfee=0.0001
txindex=1

[regtest]
port=18446
rpcport=18447
rpcuser=bob
rpcpassword=bobpwd
bind=127.0.0.1
addnode=127.0.0.1:18444 # Alice's port
addnode=127.0.0.1:18448 # Network's port

network\bitcoin.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Network 节点配置
regtest=1
datadir=C:\Users\26646\AppData\Local\Bitcoin\network\datadir
server=1
listen=1
fallbackfee=0.0001
txindex=1

[regtest]
port=18448
rpcport=18449
rpcuser=network
rpcpassword=networkpwd
bind=127.0.0.1
addnode=127.0.0.1:18444 # Alice's port
addnode=127.0.0.1:18446 # Bob's port

打开三个单独的命令提示符窗口来运行这三个节点。每个窗口运行一个节点:

窗口 1(Alice 节点):

1
bitcoind -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf"

窗口 2(Bob 节点):

1
bitcoind -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf"

窗口 3(Network 节点):

1
bitcoind -conf="C:\Users\26646\AppData\Local\Bitcoin\network\bitcoin.conf"

我截取了部分 Alice 的守护进程输出如下:

1
2
3
4
5
6
7
8
9
10
11
2025-03-24T08:36:28Z opencon thread start  
2025-03-24T08:36:28Z Loading addresses from DNS seed dummySeed.invalid.
2025-03-24T08:36:28Z addcon thread start
2025-03-24T08:36:28Z 0 addresses found from DNS seeds
2025-03-24T08:36:28Z dnsseed thread exit
2025-03-24T08:36:30Z connect() to 127.0.0.1:18446 failed after wait: 由于目标计算机积极拒绝,无法连接。 (10061)
2025-03-24T08:36:33Z connect() to 127.0.0.1:18448 failed after wait: 由于目标计算机积极拒绝,无法连接。 (10061)
2025-03-24T08:37:29Z Adding fixed seeds as 60 seconds have passed and addrman is empty for at least one reachable network
2025-03-24T08:37:29Z Added 0 fixed seeds from reachable networks.
2025-03-24T08:37:33Z New manual v2 peer connected: version: 70016, blocks=0, peer=2
2025-03-24T08:37:34Z New manual v2 peer connected: version: 70016, blocks=0, peer=3

分析日志,能看出以下关键点:

  1. 启动过程:
  • 每个节点都显示了 init message: Done loading,表示节点初始化成功
  • 各个功能线程(opencon、addcon、msghand、dnsseed)都正常启动
  1. 节点连接状态:
  • 所有节点都尝试通过 DNS 种子(dummySeed.invalid)寻找其他节点,这是正常的,因为我们在回归测试网络中
  • 出现了一些连接错误(错误码 10061),这是因为节点启动的时间差导致的,不用担心
  • 最后都看到 New manual v2 peer connected 的信息,说明节点之间已经成功建立了连接
  1. 连接成功的标志:
  • version: 70016 表示节点使用的协议版本
  • blocks=0 表示当前区块高度为 0,这是正常的,因为我们刚刚启动回归测试网络

为三者分别创建钱包并获得钱包地址

以 Alice 为例,其他的节点也都要操作:

创建钱包

1
bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" createwallet "alice_wallet"

获得地址

1
bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" getnewaddress

获取节点信息,验证连接状态

以 Alice 的为例:

1
bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" getpeerinfo

生成一些区块来测试网络

这里用 Alice 的账户挖 101 个区块,请注意用上面 Alice 的地址替换命令中的 YOUR_ADDRESS

1
bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" generatetoaddress 101 "YOUR_ADDRESS"

这里我们依然可以查看 Alice 的余额,来验证挖矿奖励:

1
2
3
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" getbalance

50.00000000

终端输出 50,符合我们在实验1 初步熟悉比特币客户端末尾的论述。
请注意,如果你查看余额的时候遭遇报错,可见在查看余额前需要先加载已存在的钱包章节的说明。

验证其他节点是否同步了这些区块

我们在 Bob 的节点查看区块高度:

1
2
3
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf" getblockcount

101

可以看到终端输出 101,正好是 Alice 挖出来的区块,证明同步信息成功。

进行测试交易

我们试着完成如下两个任务:

  1. 生成交易,由alice分别支付给bob 10BTC,network 20BTC,并使交易入块获得确认;
  2. 获取bob和network 的余额,并展示承载上述关键交易的区块原始数据。
    我们需要先获得 Bob 和 network 的钱包地址,获得方法请见 获得比特币钱包地址

发币

用 Alice 的钱包给 Bob 的地址发 10 个币:

1
2
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" sendtoaddress "bcrt1qqxk70049u9xwqn0a9f364anxd2vk2curmjq7kl" 10
c680577dcc24a07ca90e3be6e9bb664277c52d830deb3e5de96c5a20c5b54800

同理,给 network 发 20 个币:

1
2
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" sendtoaddress "bcrt1qasuaztqa0upmqc2j3qzzys2c003ae5p4k6aj0l" 20
808a7c3a21293fdd5edb9d48ca9b6299847293e5e9a8a163981732c4b4460239

值得注意的是,我们只是指定了接收方的地址。但是仔细思考:Alice 也有多个钱包地址,那到底会选择哪一个呢?这里涉及 未花费输出(UTXO) 的概念:

bitcoin core 的输出选择:“币选择算法”(Coin Selection Algorithm)

  1. 有效性:UTXO 必须已经确认(除非特别允许使用未确认的)
  2. 金额:选择足够支付交易金额加手续费的 UTXO
  3. 年龄:优先使用较旧的 UTXO
  4. 大小:尽量减少使用的 UTXO 数量,以降低交易费用
  5. 隐私:尽量避免创建过多的零钱

检验余额

发送之后,我们可以来到 Bob 的账户查看一下余额:

1
2
3
PS C:\Users\26646> bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf" getbalance

0.00000000

发现余额居然是 0,这其实是因为交易还没有被确认。我们可以查看一下未确认余额:

1
2
3
4
5
6
7
8
9
10
11
12
13
PS C:\Users\26646> bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf" getbalances

{
"mine": {
"trusted": 0.00000000,
"untrusted_pending": 10.00000000,
"immature": 0.00000000
},
"lastprocessedblock": {
"hash": "052db2df341f9f637cf7a923ec7eb0a8ad8d091d32f57b6e70717f21dd242fb8",
"height": 101
}
}

发现确实有 10 个在 untrusted_pending 里。
要确认交易,只要任意一方挖一个区块来确认交易即可,这里我用 Bob 的地址挖一个区块:

1
PS C:\Users\26646> bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf" generatetoaddress 1 "bcrt1qgjuev982let0hr59yxxf9nma0f658lhhayp5m5"

再次查看余额:

1
2
3
PS C:\Users\26646> bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\bob\bitcoin.conf" getbalance

10.00000000

可以看到余额已经显示出来了。

查看交易详细数据

我们再来查看一下 Alice 的余额:

1
2
3
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" getbalance

69.99997180

发现居然不是预想的 70。这其实是因为交易中产生了手续费,我们可以来查看一下交易的详细数据:

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
27
28
29
30
31
32
33
34
35
C:\Users\26646>bitcoin-cli -conf="C:\Users\26646\AppData\Local\Bitcoin\alice\bitcoin.conf" gettransaction "c680577dcc24a07ca90e3be6e9bb664277c52d830deb3e5de96c5a20c5b54800"

{
"amount": -10.00000000,
"fee": -0.00001410,
"confirmations": 3,
"blockhash": "62c3de913c7b75c0744f0d4df0bcadb6480e219c9600dc2b527be27295e315ea",
"blockheight": 102,
"blockindex": 1,
"blocktime": 1742885039,
"txid": "c680577dcc24a07ca90e3be6e9bb664277c52d830deb3e5de96c5a20c5b54800",
"wtxid": "d1f71e1c5ea5ff7091193d0ce2fab5099684b1272ad38bd91fc25c3906a89d32",
"walletconflicts": [
],
"mempoolconflicts": [
],
"time": 1742883173,
"timereceived": 1742883173,
"bip125-replaceable": "no",
"details": [
{
"address": "bcrt1qqxk70049u9xwqn0a9f364anxd2vk2curmjq7kl",
"category": "send",
"amount": -10.00000000,
"vout": 1,
"fee": -0.00001410,
"abandoned": false
}
],
"hex": "0200000000010184a41942d0d99b8e9b3c52d9a14d2bcfa5f1d9fd72e02c29c9365b01f69db3990000000000fdffffff027e226bee00000000160014b03be694f7e8800781bf58f4f7bcf19dd8f02ec800ca9a3b0000000016001401ade7bea5e14ce04dfd2a63aaf6666a99656383024730440220266b0c2604f7e451e8f74304a150774b9029d2f4457b3dd4b4da93178ce4ad78022074e88f7a5524aab9cc26ecf15f0a9fa64411f5fb65251d5c48ed48ae9c55fdc001210222f53c3a4ceae416de3be7eb0dd569b7829928969f2fe75d44e6a80e8f26baff00000000",
"lastprocessedblock": {
"hash": "2c70e1151fb44f3dfb6cd9dd3a5db7135dcdbde896463543f7612482712156a0",
"height": 104
}
}

可以看到 "fee": -0.00001410 即展示了手续费。

  • 标题: 实验2 利用回归测试网络实现挖矿与交易
  • 作者: 三葉Leaves
  • 创建于 : 2025-03-25 00:00:00
  • 更新于 : 2025-04-12 09:44:22
  • 链接: https://blog.oksanye.com/8a3a6923d5f9/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论