本章主要以星形组网和并行多组组网拓扑为例,指导您了解如下内容:
-
了解如何使用build_chain.sh
创建多群组区块链安装包;
-
了解build_chain.sh
创建的多群组区块链安装包目录组织形式;
-
学习如何启动该区块链节点,并通过日志查看各群组共识状态;
-
学习如何向各群组发送交易,并通过日志查看群组出块状态;
-
了解群组内节点管理,包括节点入网、退网等;
-
了解如何新建群组。
星形拓扑和并行多组
如下图,星形组网拓扑和并行多组组网拓扑是区块链应用中使用较广泛的两种组网方式。
安装依赖(我这里用的是ubuntu)
部署FISCO BCOS区块链节点前,需安装openssl, curl
等依赖软件,具体命令如下:
# CentOS
$ sudo yum install -y openssl curl
# Ubuntu
$ sudo apt install -y openssl curl
# Mac OS
# 最新homebrew默认下载的为openssl@3,需要指定版本openssl@1.1下载
$ brew install openssl@1.1 curl
星形拓扑
本章以构建上图所示的单机、四机构、三群组、八节点的星形组网拓扑为例,介绍多群组使用方法。
星形区块链组网如下:
-
agencyA
:在127.0.0.1
上有2个节点,同时属于group1、group2、group3
;
-
agencyB
:在127.0.0.1
上有2个节点,属于group1
;
-
agencyC
:在127.0.0.1
上有2个节点,属于group2
;
-
agencyD
:在127.0.0.1
上有2个节点,属于group3
。
构建星形区块链节点配置文件夹
build_chain.sh支持任意拓扑多群组区块链构建,可使用该脚本构建星形拓扑区块链节点配置文件夹:
准备依赖
mkdir -p ~/fisco && cd ~/fisco
curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/build_chain.sh && chmod u+x build_chain.sh
生成星形区块链系统配置文件
# 生成区块链配置文件ip_list
$ cat > ipconf << EOF
127.0.0.1:2 agencyA 1,2,3
127.0.0.1:2 agencyB 1
127.0.0.1:2 agencyC 2
127.0.0.1:2 agencyD 3
EOF
# 查看配置文件ip_list内容
$ cat ipconf
# 空格分隔的参数分别表示如下含义:
# ip:num: 物理机IP以及物理机上的节点数目
# agency_name: 机构名称
# group_list: 节点所属的群组列表,不同群组以逗号分隔
127.0.0.1:2 agencyA 1,2,3
127.0.0.1:2 agencyB 1
127.0.0.1:2 agencyC 2
127.0.0.1:2 agencyD 3
使用build_chain脚本构建星形区块链节点配置文件夹
# 根据配置生成星形区块链 需要保证机器的30300~30301,20200~20201,8545~8546端口没有被占用
$ bash build_chain.sh -f ipconf -p 30300,20200,8545
启动节点
节点提供start_all.sh
和stop_all.sh
脚本启动和停止节点。
# 进入节点目录
$ cd ~/fisco/nodes/127.0.0.1
# 启动节点
$ bash start_all.sh
# 查看节点进程
$ ps aux | grep fisco-bcos
ubuntu16 301 0.8 0.0 986644 7452 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node5/../fisco-bcos -c config.ini
ubuntu16 306 0.9 0.0 986644 6928 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node6/../fisco-bcos -c config.ini
ubuntu16 311 0.9 0.0 986644 7184 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node7/../fisco-bcos -c config.ini
ubuntu16 131048 2.1 0.0 1429036 7452 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
ubuntu16 131053 2.1 0.0 1429032 7180 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
ubuntu16 131058 0.8 0.0 986644 7928 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini
ubuntu16 131063 0.8 0.0 986644 7452 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini
ubuntu16 131068 0.8 0.0 986644 7672 pts/0 Sl 15:21 0:00 /home/ubuntu16/fisco/nodes/127.0.0.1/node4/../fisco-bcos -c config.ini
查看群组共识状态
不发交易时,共识正常的节点会输出+++
日志,本例中,node0
、node1
同时属于group1
、group2
和group3
;node2
、node3
属于group1
;node4
、node5
属于group2
;node6
、node7
属于group3
,可通过tail -f node*/log/* | grep "++"
查看各节点是否正常。
注意!!!
节点正常共识打印 +++
日志, +++
日志字段含义:
-
g:
:群组ID
-
blkNum
:Leader节点产生的新区块高度;
-
tx
: 新区块中包含的交易数目;
-
nodeIdx
: 本节点索引;
-
hash
: 共识节点产生的最新区块哈希。
# 查看node0 group1是否正常共识(Ctrl+c退回命令行)
$ tail -f node0/log/* | grep "g:1.*++"
info|2019-02-11 15:33:09.914042| [g:1][p:264][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=72254a42....
# 查看node0 group2是否正常共识
$ tail -f node0/log/* | grep "g:2.*++"
info|2019-02-11 15:33:31.021697| [g:2][p:520][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=ef59cf17...
# ... 查看node1, node2节点每个群组是否正常可参考以上操作方法...
# 查看node3 group1是否正常共识
$ tail -f node3/log/*| grep "g:1.*++"
info|2019-02-11 15:39:43.927167| [g:1][p:264][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=3,hash=5e94bf63...
# 查看node5 group2是否正常共识
$ tail -f node5/log/* | grep "g:2.*++"
info|2019-02-11 15:39:42.922510| [g:2][p:520][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=b80a724d...
配置控制台
控制台通过Java SDK连接FISCO BCOS节点,实现查询区块链状态、部署调用合约等功能,能够快速获取到所需要的信息(这里就不过多介绍了,不会的可以去看这里)
#回到fisco目录
$ cd ~/fisco
# 获取控制台
$ curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh
# 若因为网络问题导致长时间无法执行上面的命令,请尝试以下命令:
$ https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/console/releases/v2.9.2/download_console.sh && bash download_console.sh
# 进入控制台操作目录
$ cd console
# 拷贝group2节点证书到控制台配置目录
$ cp ~/fisco/nodes/127.0.0.1/sdk/* conf/
# 获取node0的channel_listen_port
$ grep "channel_listen_port" ~/fisco/nodes/127.0.0.1/node*/config.ini
/home/ubuntu16/fisco/nodes/127.0.0.1/node0/config.ini: channel_listen_port=20200
/home/ubuntu16/fisco/nodes/127.0.0.1/node1/config.ini: channel_listen_port=20201
/home/ubuntu16/fisco/nodes/127.0.0.1/node2/config.ini: channel_listen_port=20202
/home/ubuntu16/fisco/nodes/127.0.0.1/node3/config.ini: channel_listen_port=20203
/home/ubuntu16/fisco/nodes/127.0.0.1/node4/config.ini: channel_listen_port=20204
/home/ubuntu16/fisco/nodes/127.0.0.1/node5/config.ini: channel_listen_port=20205
/home/ubuntu16/fisco/nodes/127.0.0.1/node6/config.ini: channel_listen_port=20206
/home/ubuntu16/fisco/nodes/127.0.0.1/node7/config.ini: channel_listen_port=20207
# 拷贝控制台配置
$ cp ~/fisco/console/conf/config-example.toml ~/fisco/console/conf/config.toml
启动控制台
$ bash start.sh
# 输出如下信息表明控制台启动成功,若启动失败,请检查是否配置证书、channel listen port配置是否正确
=====================================================================================
Welcome to FISCO BCOS console(2.6.1)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
________ ______ ______ ______ ______ _______ ______ ______ ______
| | \/ \ / \ / \ | \ / \ / \ / \
| $$$$$$$$\$$$$$| $$$$$$| $$$$$$| $$$$$$\ | $$$$$$$| $$$$$$| $$$$$$| $$$$$$\
| $$__ | $$ | $$___\$| $$ \$| $$ | $$ | $$__/ $| $$ \$| $$ | $| $$___\$$
| $$ \ | $$ \$$ \| $$ | $$ | $$ | $$ $| $$ | $$ | $$\$$ \
| $$$$$ | $$ _\$$$$$$| $$ __| $$ | $$ | $$$$$$$| $$ __| $$ | $$_\$$$$$$\
| $$ _| $$_| \__| $| $$__/ | $$__/ $$ | $$__/ $| $$__/ | $$__/ $| \__| $$
| $$ | $$ \\$$ $$\$$ $$\$$ $$ | $$ $$\$$ $$\$$ $$\$$ $$
\$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$$ \$$$$$$ \$$$$$$ \$$$$$$
=====================================================================================
[group:1]>
向群组发交易
多群组架构中,群组间账本相互独立,向某个群组发交易仅会导致本群组区块高度增加,不会增加其他群组区块高度
控制台发送交易
# ... 向group1发交易...
$ [group:1]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744
# 查看group1当前块高,块高增加为1表明出块正常,否则请检查group1是否共识正常
$ [group:1]> getBlockNumber
1
# ... 向group2发交易...
# 切换到group2
$ [group:1]> switch 2
Switched to group 2.
# 向group2发交易,返回交易哈希表明交易部署成功,否则请检查group2是否共识正常
$ [group:2]> deploy HelloWorld
transaction hash: 0xd0305411e36d2ca9c1a4df93e761c820f0a464367b8feb9e3fa40b0f68eb23fa
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744
# 查看group2当前块高,块高增加为1表明出块正常,否则请检查group2是否共识正常
$ [group:2]> getBlockNumber
1
# ... 向group3发交易...
# 切换到group3
$ [group:2]> switch 3
Switched to group 3.
# 向group3发交易,返回交易哈希表明交易部署成功
$ [group:3]> deploy HelloWorld
transaction hash: 0xd0305411e36d2ca9c1a4df93e761c820f0a464367b8feb9e3fa40b0f68eb23fa
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744
# 查看group3当前块高,块高为1表明出块正常,否则请检查group3是否共识正常
$ [group:3]> getBlockNumber
1
# ... 切换到不存在的组4,控制台提示group4不存在,并输出当前的group列表 ...
$ [group:3]> switch 4
Group 4 does not exist. The group list is [1, 2, 3].
# 退出控制台
$ [group:3]> exit
查看日志
节点出块后,会输出Report
日志,日志各个字段含义如下
# 进入节点目录
$ cd ~/fisco/nodes/127.0.0.1
# 查看group1出块情况:有新区块产生
$ cat node0/log/* |grep "g:1.*Report"
info|2019-02-11 16:08:45.077484| [g:1][p:264][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=1,hash=9b5487a6...,next=2,tx=1,nodeIdx=2
# 查看group2出块情况:有新区块产生
$ cat node0/log/* |grep "g:2.*Report"
info|2019-02-11 16:11:55.354881| [g:2][p:520][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=0,hash=434b6e07...,next=2,tx=1,nodeIdx=0
# 查看group3出块情况:有新区块产生
$ cat node0/log/* |grep "g:3.*Report"
info|2019-02-11 16:14:33.930978| [g:3][p:776][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=1,hash=3a42fcd1...,next=2,tx=1,nodeIdx=2
节点加入群组
通过控制台,FISCO BCOS可将指定节点加入到指定群组,也可将节点从指定群组删除,详细介绍请参考节点准入管理手册,控制台配置参考控制台操作手册。
本章以将node2加入group2为例,介绍如何在已有的群组中,加入新节点。
拷贝group2群组配置到node2
# 进入节点目录
$ cd ~/fisco/nodes/127.0.0.1
# ... 从node0拷贝group2的配置到node2...
$ cp node0/conf/group.2.* node2/conf
# ...重启node2(重启后请确定节点正常共识)...
$ cd node2 && bash stop.sh && bash start.sh
获取node2的节点ID
# 请记住node2的node ID,将node2加入到group2需用到该node ID
$ cat conf/node.nodeid
6dc585319e4cf7d73ede73819c6966ea4bed74aadbbcba1bbb777132f63d355965c3502bed7a04425d99cdcfb7694a1c133079e6d9b0ab080e3b874882b95ff4
通过控制台向group2发送命令,将node2加入到group2
# ...回到控制台目录,并启动控制台(直接启动到group2)...
$ cd ~/fisco/console && bash start.sh 2
# ...通过控制台将node2加入为共识节点...
# 1. 查看当前共识节点列表
$ [group:2]> getSealerList
[
9217e87c6b76184cf70a5a77930ad5886ea68aefbcce1909bdb799e45b520baa53d5bb9a5edddeab94751df179d54d41e6e5b83c338af0a19c0611200b830442,
227c600c2e52d8ec37aa9f8de8db016ddc1c8a30bb77ec7608b99ee2233480d4c06337d2461e24c26617b6fd53acfa6124ca23a8aa98cb090a675f9b40a9b106,
7a50b646fcd9ac7dd0b87299f79ccaa2a4b3af875bd0947221ba6dec1c1ba4add7f7f690c95cf3e796296cf4adc989f4c7ae7c8a37f4505229922fb6df13bb9e,
8b2c4204982d2a2937261e648c20fe80d256dfb47bda27b420e76697897b0b0ebb42c140b4e8bf0f27dfee64c946039739467b073cf60d923a12c4f96d1c7da6
]
# 2. 将node2加入到共识节点
# addSealer后面的参数是上步获取的node ID
$ [group:2]> addSealer 6dc585319e4cf7d73ede73819c6966ea4bed74aadbbcba1bbb777132f63d355965c3502bed7a04425d99cdcfb7694a1c133079e6d9b0ab080e3b874882b95ff4
{
"code":0,
"msg":"success"
}
# 3. 查看共识节点列表
$ [group:2]> getSealerList
[
9217e87c6b76184cf70a5a77930ad5886ea68aefbcce1909bdb799e45b520baa53d5bb9a5edddeab94751df179d54d41e6e5b83c338af0a19c0611200b830442,
227c600c2e52d8ec37aa9f8de8db016ddc1c8a30bb77ec7608b99ee2233480d4c06337d2461e24c26617b6fd53acfa6124ca23a8aa98cb090a675f9b40a9b106,
7a50b646fcd9ac7dd0b87299f79ccaa2a4b3af875bd0947221ba6dec1c1ba4add7f7f690c95cf3e796296cf4adc989f4c7ae7c8a37f4505229922fb6df13bb9e,
8b2c4204982d2a2937261e648c20fe80d256dfb47bda27b420e76697897b0b0ebb42c140b4e8bf0f27dfee64c946039739467b073cf60d923a12c4f96d1c7da6,
6dc585319e4cf7d73ede73819c6966ea4bed74aadbbcba1bbb777132f63d355965c3502bed7a04425d99cdcfb7694a1c133079e6d9b0ab080e3b874882b95ff4 # 新加入节点
]
# 获取group2当前块高
$ [group:2]> getBlockNumber
2
#... 向group2发交易
# 部署HelloWorld合约,输出合约地址,若合约部署失败,请检查group2共识情况
$ [group:2] deploy HelloWorld
contract address:0xdfdd3ada340d7346c40254600ae4bb7a6cd8e660
# 获取group2当前块高,块高增加为3,若块高不变,请检查group2共识情况
$ [group:2]> getBlockNumber
3
# 退出控制台
$ [group:2]> exit
通过日志查看新加入节点出块情况
# 进入节点所在目录
cd ~/fisco/nodes/127.0.0.1
# 查看节点共识情况(Ctrl+c退回命令行)
$ tail -f node2/log/* | grep "g:2.*++"
info|2019-02-11 18:41:31.625599| [g:2][p:520][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=4,tx=0,nodeIdx=1,hash=c8a1ed9c...
......此处省略其他输出......
# 查看node2 group2出块情况:有新区块产生
$ cat node2/log/* | grep "g:2.*Report"
info|2019-02-11 18:53:20.708366| [g:2][p:520][CONSENSUS][PBFT]^^^^^Report:,num=3,idx=3,hash=80c98d31...,next=10,tx=1,nodeIdx=1
# node2也Report了块高为3的区块,说明node2已经加入group2
注意:上述代码是官方提供的,下面的图片是我实际操作的。操作命令是一样的,但是输出内容不一样!!!!!!
停止节点
# 回到节点目录 && 停止节点
$ cd ~/fisco/nodes/127.0.0.1 && bash stop_all.sh
到这里多群组部署以及新节点加入群组的操作就结束了。