Allureluoli 二月FEBRUARY

区块链国赛笔记 03|FISCO BCOS 节点扩容:角色、证书与 Air 实操

扩容分成生成节点、建立连接和加入群组三件事。先理解共识节点与观察节点的区别,再看 Air 版本的实际操作。

本文由个人备赛旧笔记整理,整理日期为 2026-11-03。命令、输出和测试记录属于当时的实验环境;本文未重新搭建整套环境验证。

阅读前先确认

新节点要与目标链使用匹配的证书和创世配置;加入群组以后,再核对角色与同步情况。命令拼写以对应控制台的 help 为准。

FISCO 扩容

扩容

比赛题目提到 需要根据要求进行扩容

根据官方文档描述,共存在三种节点

  • 共识节点(Leader/Primary 和 Replica):参与共识的节点,拥有群组的所有数据(搭链时默认都生成共识节点)。

  • 观察者节点Observer:不参与共识,但能实时同步链上数据的节点。

  • 游离节点:已启动,待等待加入群组的节点。处在一种暂时的节点状态,不能获取链上的数据

讲指定节点向这三种节点转化的命令:(传入NodeID)

  • addSealer 改变节点为共识节点

  • addObserver 改变节点为观察节点

  • removeNode 改变节点为游离节点

查看节点的命令

  • getSealer 查看共识节点列表
  • getObserver 查看观察节点列表
  • getNodeIDList 查看已连接的所有其他节点的NodeID

扩容步骤

  1. 为节点生成证书并启动
  2. 将节点加入群组
  • 生成节点的私钥证书

    • 证书生成脚本

      1
      curl -#LO https://raw.githubusercontent.com/FISCO-BCOS/FISCO-BCOS/master-2.0/tools/gen_node_cert.sh
    • 生成证书命令

      1
      2
      3
      4
      # -c指定机构证书及私钥所在路径
      # -o输出到指定文件夹,其中node4/conf中会存在机构agency新签发的证书和私钥
      # 成功会输出 All completed 提示
      bash gen_node_cert.sh -c ../cert/agency -o node4
    • 国密版本命令

      1
      bash gen_node_cert.sh -c ../cert/agency -o node4 -g ../gmcert/agency/

将节点node0 的配置文件和相关启动关闭脚本复制到node4目录

1
cp node0/config.ini node0/start.sh node0/stop.sh node4/
  • 修改node4/config.ini

对于[rpc]模块,修改channel_listen_port=20204和jsonrpc_listen_port=8549;对于[p2p]模块,修改listen_port=30304并在node.中增加自身节点信息;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ vim node4/config.ini
[rpc]
;rpc listen ip
listen_ip=127.0.0.1
;channelserver listen port
channel_listen_port=20204
;jsonrpc listen port
jsonrpc_listen_port=8549
[p2p]
;p2p listen ip
listen_ip=0.0.0.0
;p2p listen port
listen_port=30304
;nodes to connect
node.0=127.0.0.1:30300
node.1=127.0.0.1:30301
node.2=127.0.0.1:30302
node.3=127.0.0.1:30303
node.4=127.0.0.1:30304
  • 两个重要文件
    • group.1.genesis
    • group.1.ini

拷贝节点1的node0/conf/group.1.genesis(内含群组节点初始列表)和node0/conf/group.1.ini到node4/conf目录下(无需改动)

1
cp node0/conf/group.1.genesis node0/conf/group.1.ini node4/conf/

然后运行启动脚本即可bash start.sh

接着,将节点加入群组

先获取nodeid

1
cat node4/conf/node.nodeid

启动控制台

两种节点的加入命令:

  • 将节点加入为群组1的观察节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[group:1]> getObserverList
[]

[group:1]> addObserver 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e
{
"code":1,
"msg":"Success"
}

[group:1]> getObserverList
[
94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e
]

  • 将节点加入作为共识节点加入群组1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[group:1]> getSealerList
[
6c41f7e138051a13a220cb186e934398e37700295ff355b87f113704996b3e03750100e16653cda18b5f954d3b7b08d068ca4a9d65cec5a40db980b697ffb699,
7404cdf7f34f038aba90059ff25dc5f05f538010c55e98976aea6bc954910f34f15a255869751c8fe564bdb0fa1eee8e2db47eeca0fdd1359beaac6adcd37ede,
a7b856e5b59072c809ea963fa45ede72f7d37561affff989fbede6cd61a40137e2146db205434788e61b89a57f08c614cd283e5e915c23714c2fa685237e8bdb,
e5ea1e18717418a57f115bf1cea5168250f86e5b77f74dd15d0c4bf3758ca37002059ba2e54131296d1646a62be5faf85e243dac8d33d452acd63e20428b72ed
]

[group:1]> addSealer 94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e
{
"code":1,
"msg":"Success"
}

[group:1]> getSealerList
[
6c41f7e138051a13a220cb186e934398e37700295ff355b87f113704996b3e03750100e16653cda18b5f954d3b7b08d068ca4a9d65cec5a40db980b697ffb699,
7404cdf7f34f038aba90059ff25dc5f05f538010c55e98976aea6bc954910f34f15a255869751c8fe564bdb0fa1eee8e2db47eeca0fdd1359beaac6adcd37ede,
a7b856e5b59072c809ea963fa45ede72f7d37561affff989fbede6cd61a40137e2146db205434788e61b89a57f08c614cd283e5e915c23714c2fa685237e8bdb,
e5ea1e18717418a57f115bf1cea5168250f86e5b77f74dd15d0c4bf3758ca37002059ba2e54131296d1646a62be5faf85e243dac8d33d452acd63e20428b72ed,
94ae60f93ef9a25a93666e0149b7b4cb0e044a61b7dcd1b00096f2bdb17d1c6853fc81a24e037c9d07803fcaf78f768de2ba56a4f729ef91baeadaa55a8ccd6e
]

区块链扩容完成

FISCO Air版本区块链扩容

Air版本区块链扩容

由于Air版本区块链和Pro版本区块链的扩容方式存在诸多差异性,我们需要单独掌握Air版本区块链的扩容方式。

整体步骤没有区别

  1. 生成节点
  2. 将节点加入群组

但生成方式是有区别的,我们需要先准备配置文件,然后使用build_chain.sh建链脚本来生成新的节点。

  • CA证书和CA私钥: 用于为新扩容的节点颁发节点证书
  • 节点配置文件config.ini: 可从已有的节点目录中拷贝。
  • 节点创世块配置文件config.genesis: 可从已有的节点目录中拷贝。
  • 节点连接配置nodes.json: 配置所有节点连接的IP和端口信息,可从已有的节点目录中拷贝,并加上新节点的IP和端口。

步骤

首先创建一个目录准备存放配置文件

1
2
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ mkdir config

拷贝证书和私钥的文件夹

1
2
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cp -r nodes/ca config

从被扩容节点node0拷贝节点配置文件config.ini,创世块配置文件config.genesis以及节点连接配置文件nodes.json

1
2
3
4
5
6
7
8
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cp nodes/127.0.0.1/node0/config.ini config/

┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cp nodes/127.0.0.1/node0/config.genesis config/

┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cp nodes/127.0.0.1/node0/nodes.json config/nodes.json.tmp

然后修改一下我们的配置

设置P2P监听端口为30304,RPC监听端口为20204

1
2
3
4
5
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ sed -i 's/listen_port=30300/listen_port=30304/g' config/config.ini

┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ sed -i 's/listen_port=20200/listen_port=20204/g' config/config.ini

将新节点连接加入到nodes.json

1
2
3
4
5
6
7
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ sed -e 's/"nodes":\[/"nodes":\["127.0.0.1:30304",/' config/nodes.json.tmp > config/nodes.json

# cat确认一下
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cat config/nodes.json
{"nodes":["127.0.0.1:30304","127.0.0.1:30300","127.0.0.1:30301","127.0.0.1:30302","127.0.0.1:30303"]}

现在直接通过建链脚本生成就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ bash build_chain.sh -C expand -c config -d config/ca -o nodes/127.0.0.1/node4
[INFO] Downloading fisco-bcos binary from https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.11.0/fisco-bcos-linux-x86_64.tar.gz ...
##################################################################################################################################################### 100.0%
[INFO] generate_node_scripts ...
[INFO] generate_node_scripts success...
[INFO] generate_node_cert ...
[INFO] Generate nodes/127.0.0.1/node4/conf cert successful!
[INFO] generate_node_cert success...
[INFO] generate_node_account ...
[INFO] generate_node_account success...
[INFO] copy configurations ...
[INFO] copy configurations success...
==============================================================
[INFO] fisco-bcos Path : bin/fisco-bcos
[INFO] sdk dir : nodes/127.0.0.1/sdk
[INFO] SM Model : false
[INFO] output dir : nodes/127.0.0.1/node4
[INFO] All completed. Files in nodes/127.0.0.1/node4

来看一下目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ tree nodes/127.0.0.1/node4
nodes/127.0.0.1/node4
├── conf
│   ├── ca.crt
│   ├── cert.cnf
│   ├── node.nodeid
│   ├── node.pem
│   ├── ssl.crt
│   ├── ssl.key
│   └── ssl.nodeid
├── config.genesis
├── config.ini
├── nodes.json
├── start.sh
└── stop.sh

2 directories, 12 files

直接启动节点

1
2
3
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ bash nodes/127.0.0.1/node4/start.sh
node4 start successfully pid=43500

nice 启动成功!

下一步加入群组,我们需要使用console控制台 ,命令相同

查看一下节点进程和节点id

1
2
3
4
5
6
7
8
9
10
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ ps aux |grep -v grep |grep fisco-bcos
cure 25655 4.2 0.6 1978252 83340 pts/1 Sl 9月10 29:52 /home/cure/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini -g config.genesis
cure 25657 4.1 0.6 1974160 80380 pts/1 Sl 9月10 29:44 /home/cure/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini -g config.genesis
cure 25659 4.2 0.6 1970064 84496 pts/1 Sl 9月10 30:00 /home/cure/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini -g config.genesis
cure 25661 4.1 0.6 1982360 80360 pts/1 Sl 9月10 29:47 /home/cure/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini -g config.genesis
cure 43500 2.0 0.4 1801480 57904 pts/1 Sl 10:00 0:02 /home/cure/fisco/nodes/127.0.0.1/node4/../fisco-bcos -c config.ini -g config.genesis
┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ cat nodes/127.0.0.1/node4/conf/node.nodeid
3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c593

然后复制id,我们打开控制台

这里有个规定注意!

为了保证新节点加入不影响共识,须先将扩容节点加入为观察节点,当扩容节点同步到最新区块时,再将其加入到共识节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

┌──(cure㉿LAPTOP-CMAM5D0J)-[~/fisco]
└─$ bash console/start.sh
the error = [libproviders.so: 无法打开共享目标文件: 没有那个文件或目录]
=============================================================================================
Welcome to FISCO BCOS console(3.7.0)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
________ ______ ______ ______ ______ _______ ______ ______ ______
| | \/ \ / \ / \ | \ / \ / \ / \
| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\
| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$
| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \
| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\
| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$
| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$
\$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$

=============================================================================================
[group0]: /apps> addObserver 3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c59
3
{
"code":0,
"msg":"Success"
}

这里显示成功了,观察一下确实在里面了

1
2
3
4
[group0]: /apps> getObserverList
[
3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c593
]

然后我们将其加入共识节点,新节点权重设置为1

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
[group0]: /apps> addSealer 3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c593 1
{
"code":0,
"msg":"Success"
}
[group0]: /apps> getSealerList
[
Sealer{
nodeID='2ae72c97e19a93ac3cee2951326bc5daba0ac7db0991bb5b8069d18130e638cb4981aa6f6dec246d0374c1d068d74559b7edef3ce259793e369300e638ba3c07',
weight=1
},
Sealer{
nodeID='3e80932ce833e5e186c293c5ff4982650b1236709fa1fd9ff79db79765900e9bf0ba2ab7dc17aee9c7aed74d9a208e2eb2ad1c2e9fe14cc5d07e8eba9a17aae8',
weight=1
},
Sealer{
nodeID='6a249c4013ab54c5d40ee541d00f831ea27cb3d4e7cb56730882f7780613faadacb698c30b2e0869958e12087554f972da05a103fee3ad0acbc6095927bec879',
weight=1
},
Sealer{
nodeID='ce907b6e4a120a22d0247267f00348cf101f9ca4e8a907dd73d342a851e5d1471a7d4ab0849f17633302242e89c6446df876cf3d051011fd3453dac2adcaafd1',
weight=1
},
Sealer{
nodeID='3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c593',
weight=1
}
]

至此,扩容完成,但是我们可以测试更多内容

我们先部署一下官方自带的HelloWorld.sol 合约

1
2
3
4
[group0]: /apps> deploy HelloWorld
transaction hash: 0x962a606a59384b7e89621ddf0f4a5363a126c2d40dc81d3b85feb4f9f9711c8b
contract address: 0x37a44585bf1e9618fdb4c62c4c96189a07dd4b48
currentAccount: 0xf704de157ffd21966bf07e25edd52d2df01e28fb

可以看到所有节点都到了最新区块

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
36
37
38
[group0]: /apps> getSyncStatus
SyncStatusInfo{
isSyncing='false',
protocolId='null',
genesisHash='acc5052589891054280ea93b94b4868829243c49f251cfedbcca50fd3bb7b91a',
nodeId='2ae72c97e19a93ac3cee2951326bc5daba0ac7db0991bb5b8069d18130e638cb4981aa6f6dec246d0374c1d068d74559b7edef3ce259793e369300e638ba3c07',
blockNumber='5',
latestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4',
knownHighestNumber='5',
txPoolSize='null',
peers=[
PeersInfo{
nodeId='3e80932ce833e5e186c293c5ff4982650b1236709fa1fd9ff79db79765900e9bf0ba2ab7dc17aee9c7aed74d9a208e2eb2ad1c2e9fe14cc5d07e8eba9a17aae8',
genesisHash='acc5052589891054280ea93b94b4868829243c49f251cfedbcca50fd3bb7b91a',
blockNumber='5',
latestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4'
},
PeersInfo{
nodeId='ce907b6e4a120a22d0247267f00348cf101f9ca4e8a907dd73d342a851e5d1471a7d4ab0849f17633302242e89c6446df876cf3d051011fd3453dac2adcaafd1',
genesisHash='acc5052589891054280ea93b94b4868829243c49f251cfedbcca50fd3bb7b91a',
blockNumber='5',
latestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4'
},
PeersInfo{
nodeId='3f6f33d37d45ba143e4a35005997afe9db420f5f6a3e7682dba52564e0a9203682f68b044a62e947fa2af9936b93d1469a33f044fe69c019cffb781ee9b1c593',
genesisHash='acc5052589891054280ea93b94b4868829243c49f251cfedbcca50fd3bb7b91a',
blockNumber='5',
latestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4'
},
PeersInfo{
nodeId='6a249c4013ab54c5d40ee541d00f831ea27cb3d4e7cb56730882f7780613faadacb698c30b2e0869958e12087554f972da05a103fee3ad0acbc6095927bec879',
genesisHash='acc5052589891054280ea93b94b4868829243c49f251cfedbcca50fd3bb7b91a',
blockNumber='5',
latestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4'
}
],
knownLatestHash='5e7fe0f40b6f96d5c11192a0783b6ebdb4de758a05455d28965c470a3068b6d4'
}

复现时的自查

  • 记录自己实际使用的版本、配置和缺失依赖。
  • 对照本篇关键步骤,保存命令或调用结果,并解释结果代表什么。
  • 对失败或与原记录不一致的情况保留错误信息,不把历史输出当成自己的验证结果。

返回系列导读 · 上一篇 · 下一篇

评论COMMENTS