Fisco Bcos学习 - 搭建星形拓扑组网
文章目录
- 一、前言
- 二、环境准备与依赖安装
- 2.1 系统要求
- 2.2 依赖安装
- 三、星形拓扑设计与节点规划
- 四、使用build_chain.sh构建星形拓扑
- 4.1 创建操作目录并获取脚本
- 4.2 生成星形拓扑配置文件
- 4.3 执行构建命令
- 4.4 查看生成的节点文件
- 五、启动节点与共识验证
- 5.1 启动所有节点
- 5.2 查看群组共识状态
- 六、配置控制台与交易验证
- 6.1 获取并配置控制台
- 6.2 配置控制台连接信息
- 6.3 启动控制台并发送交易
- 6.4 查看交易日志
- 七、节点加入群组操作
- 7.1 准备节点配置
- 7.2 获取节点ID
- 7.3 通过控制台添加节点
- 7.4 验证新节点共识情况
- 停止节点
一、前言
在区块链技术的实际应用中,组网拓扑结构的选择直接影响系统的性能、安全性和可扩展性。星形拓扑作为一种常见的组网方式,其核心特点是存在一个中心节点,该节点同时属于多个群组,而其他节点则分别属于不同的群组。这种结构特别适合于存在中心机构的业务场景,例如金融领域中的多方协作系统,其中中心机构需要参与多个业务群组的共识,而其他机构则仅参与各自相关的群组。
FISCO BCOS作为企业级联盟链平台,对星形拓扑提供了良好的支持。本文将详细记录如何使用FISCO BCOS搭建一个典型的星形拓扑区块链网络,包括环境准备、节点配置、启动验证等完整流程。
二、环境准备与依赖安装
在搭建星形拓扑区块链之前,需要先准备好运行环境并安装必要的依赖软件。FISCO BCOS对运行环境的要求如下:
2.1 系统要求
- CentOS/Ubuntu/Mac OS等主流操作系统
- Java 8及以上版本(用于控制台)
- 足够的磁盘空间和内存(根据节点数量和业务需求调整)
2.2 依赖安装
使用以下命令安装必要的依赖软件:
# CentOS系统
$ sudo yum install -y openssl curl# Ubuntu系统
$ sudo apt install -y openssl curl# Mac OS系统
$ brew install openssl curl
三、星形拓扑设计与节点规划
本次实践将搭建一个典型的星形拓扑区块链网络,具体规划如下:
- 中心机构(agencyA):在127.0.0.1上部署2个节点,同时属于group1、group2、group3三个群组
- 机构B(agencyB):在127.0.0.1上部署2个节点,仅属于group1群组
- 机构C(agencyC):在127.0.0.1上部署2个节点,仅属于group2群组
- 机构D(agencyD):在127.0.0.1上部署2个节点,仅属于group3群组
注意:在实际应用场景中,不建议将多个节点部署在同一台机器上,应根据机器负载选择合适的节点部署方式。中心节点由于需要参与多个群组的共识,负载较高,建议单独部署在性能较好的机器上。
四、使用build_chain.sh构建星形拓扑
FISCO BCOS提供了便捷的build_chain.sh脚本,用于快速构建区块链节点配置。以下是构建星形拓扑的详细步骤:
4.1 创建操作目录并获取脚本
# 创建fisco目录并进入
$ mkdir -p ~/fisco && cd ~/fisco# 下载build_chain.sh脚本并赋予执行权限
$ curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.4.1/build_chain.sh && chmod u+x build_chain.sh
4.2 生成星形拓扑配置文件
首先需要创建一个配置文件,定义各个机构的节点分布和所属群组:
# 生成配置文件ipconf
$ 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# 查看配置文件内容
$ cat ipconf
配置文件中的每行参数含义如下:
ip:num
:物理机IP及该机器上的节点数目agency_name
:机构名称group_list
:节点所属的群组列表,多个群组用逗号分隔
4.3 执行构建命令
# 执行build_chain.sh脚本构建星形拓扑
$ bash build_chain.sh -f ipconf -p 30300,20200,8545
执行上述命令后,脚本将自动生成所需的节点配置文件、证书和密钥等。构建过程中会显示各个机构和节点的处理信息,完成后会输出详细的构建结果:
==============================================================
[INFO] FISCO-BCOS Path : ./bin/fisco-bcos
[INFO] IP List File : ipconf
[INFO] Start Port : 30300 20200 8545
[INFO] Server IP : 127.0.0.1:2 127.0.0.1:2 127.0.0.1:2 127.0.0.1:2
[INFO] State Type : storage
[INFO] RPC listen IP : 127.0.0.1
[INFO] Output Dir : /home/ubuntu16/fisco/nodes
[INFO] CA Key Path : /home/ubuntu16/fisco/nodes/cert/ca.key
==============================================================
[INFO] All completed. Files in /home/ubuntu16/fisco/nodes
4.4 查看生成的节点文件
构建完成后,节点文件将存储在nodes
目录下,目录结构如下:
nodes
|-- 127.0.0.1
| |-- fisco-bcos
| |-- node0
| | |-- conf # 节点配置目录
| | | |-- ca.crt
| | | |-- group.1.genesis
| | | |-- group.1.ini
| | | |-- group.2.genesis
| | | |-- group.2.ini
| | | |-- group.3.genesis
| | | |-- group.3.ini
| | | |-- node.crt
| | | |-- node.key
| | | `-- node.nodeid # 节点ID信息
| | |-- config.ini # 节点配置文件
| | |-- start.sh # 节点启动脚本
| | `-- stop.sh # 节点停止脚本
| |-- node1
| | |-- conf
| | ...
五、启动节点与共识验证
5.1 启动所有节点
进入节点目录并使用提供的脚本启动所有节点:
# 进入节点目录
$ cd ~/fisco/nodes/127.0.0.1# 启动所有节点
$ bash start_all.sh# 查看节点进程
$ ps aux | grep fisco-bcos
5.2 查看群组共识状态
节点启动后,可以通过日志查看各个群组的共识情况。正常共识的节点会输出+++
日志,其中包含群组ID、区块高度、交易数量等信息:
# 查看node0在group1的共识情况
$ 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...# 查看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...
六、配置控制台与交易验证
6.1 获取并配置控制台
控制台是FISCO BCOS提供的重要工具,用于与区块链节点交互,实现合约部署、交易发送等功能:
# 回到fisco目录
$ cd ~/fisco# 获取控制台
$ curl -LO https://github.com/FISCO-BCOS/console/releases/download/v1.0.9/download_console.sh && bash download_console.sh# 进入控制台目录
$ cd console# 拷贝节点证书到控制台配置目录
$ cp ~/fisco/nodes/127.0.0.1/sdk/* conf/# 获取节点的channel_listen_port
$ grep "channel_listen_port" ~/fisco/nodes/127.0.0.1/node*/config.ini
6.2 配置控制台连接信息
创建控制台配置文件conf/applicationContext.xml
,配置连接到各个群组的节点信息:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><bean id="encryptType" class="org.fisco.bcos.web3j.crypto.EncryptType"><constructor-arg value="0"/> <!-- 0:standard 1:guomi --></bean><bean id="groupChannelConnectionsConfig" class="org.fisco.bcos.channel.handler.GroupChannelConnectionsConfig"><property name="allChannelConnections"><list><bean id="group1" class="org.fisco.bcos.channel.handler.ChannelConnections"><property name="groupId" value="1" /><property name="connectionsStr"><list><value>127.0.0.1:20200</value></list></property></bean><bean id="group2" class="org.fisco.bcos.channel.handler.ChannelConnections"><property name="groupId" value="2" /><property name="connectionsStr"><list><value>127.0.0.1:20200</value></list></property></bean><bean id="group3" class="org.fisco.bcos.channel.handler.ChannelConnections"><property name="groupId" value="3" /><property name="connectionsStr"><list><value>127.0.0.1:20200</value></list></property></bean></list></property></bean><bean id="channelService" class="org.fisco.bcos.channel.client.Service" depends-on="groupChannelConnectionsConfig"><property name="groupId" value="1" /><property name="orgID" value="fisco" /><property name="allChannelConnections" ref="groupChannelConnectionsConfig"></property></bean>
</beans>
6.3 启动控制台并发送交易
# 启动控制台
$ bash start.sh# 向group1发送交易,部署HelloWorld合约
[group:1]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744# 查看group1区块高度
[group:1]> getBlockNumber
1# 切换到group2并发送交易
[group:1]> switch 2
Switched to group 2.
[group:2]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744
[group:2]> getBlockNumber
1# 切换到group3并发送交易
[group:2]> switch 3
Switched to group 3.
[group:3]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744
[group:3]> getBlockNumber
1
6.4 查看交易日志
通过查看节点日志,可以确认交易是否成功上链:
# 查看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
七、节点加入群组操作
在星形拓扑中,有时需要将新节点加入到已有的群组中。以下是将node2节点加入到group2群组的详细步骤:
7.1 准备节点配置
# 进入节点目录
$ 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
7.2 获取节点ID
# 获取node2的节点ID
$ cat conf/node.nodeid
6dc585319e4cf7d73ede73819c6966ea4bed74aadbbcba1bbb777132f63d355965c3502bed7a04425d99cdcfb7694a1c133079e6d9b0ab080e3b874882b95ff4
7.3 通过控制台添加节点
# 启动控制台并连接到group2
$ cd ~/fisco/console && bash start.sh 2# 查看当前group2的共识节点列表
[group:2]> getSealerList# 添加node2到共识节点
[group:2]> addSealer 6dc585319e4cf7d73ede73819c6966ea4bed74aadbbcba1bbb777132f63d355965c3502bed7a04425d99cdcfb7694a1c133079e6d9b0ab080e3b874882b95ff4# 再次查看共识节点列表,确认node2已加入
[group:2]> getSealerList
7.4 验证新节点共识情况
# 查看node2在group2的共识日志
$ 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=c8a1ed9
停止节点
# 回到节点目录 && 停止节点
$ cd ~/fisco/nodes/127.0.0.1 && bash stop_all.sh