Fisco Bcos学习 - 搭建并行多组组网
文章目录
- 一、前言
- 二、并行多组与星形拓扑的架构对比
- 三、搭建单群组四节点区块链基础环境
- 3.1 环境准备与脚本获取
- 3.2 构建单群组四节点网络
- 3.3 启动节点并验证共识
- 四、添加group2构建并行多组架构
- 4.1 复制并修改群组配置文件
- 4.2 重启节点并验证新群组共识
- 五、控制台配置与多群组交易验证
- 5.1 获取并配置控制台
- 5.2 配置多群组连接信息
- 5.3 发送跨群组交易并验证
- 5.4 查看多群组出块日志
一、前言
在区块链技术的企业级应用中,多群组架构已成为满足复杂业务需求的重要解决方案。并行多组拓扑作为其中一种典型架构,其核心特点是每个节点均属于多个群组,能够实现不同业务的横向扩展或同一业务的纵向扩展。这种架构在金融、供应链、医疗等需要多方协作但数据隔离的场景中具有显著优势,例如:
- 银行系统中不同业务线(如信贷、结算、理财)的隔离与并行处理
- 供应链金融中不同核心企业主导的供应链网络共存
- 医疗数据共享中不同医疗机构间的隐私保护与数据互通
FISCO BCOS 作为高性能的联盟链平台,对并行多组架构提供了完善的支持。本文将详细记录如何搭建一个四节点两群组的并行多组区块链网络,深入理解其技术原理与实践要点。
二、并行多组与星形拓扑的架构对比
在开展实践前,先明确并行多组与星形拓扑的核心区别:
对比维度 | 星形拓扑 | 并行多组拓扑 |
---|---|---|
节点群组归属 | 存在中心节点归属所有群组,其他节点归属单一群组 | 所有节点均归属多个群组 |
业务场景 | 适合存在中心机构的多方协作 | 适合多业务线并行处理或同业务扩展 |
负载分布 | 中心节点负载较高,其他节点负载较低 | 节点负载相对均衡 |
典型应用 | 金融监管平台(监管机构为中心节点) | 银行多业务线并行处理 |
三、搭建单群组四节点区块链基础环境
3.1 环境准备与脚本获取
首先创建操作目录并获取 build_chain.sh 脚本:
# 创建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
3.2 构建单群组四节点网络
使用 build_chain.sh 脚本构建单群组(group1)四节点区块链:
# 构建本机单群组四节点区块链
$ bash build_chain.sh -l "127.0.0.1:4" -o multi_nodes -p 20000,20100,7545
脚本执行后将输出详细的构建信息,包括节点配置路径、端口分配等:
Generating CA key ...
==============================================================
Generating keys ...
Processing IP: 127.0.0.1 Total: 4 Agency: agency Groups: 1
==============================================================
Generating configurations ...
Processing IP: 127.0.0.1 Total: 4 Agency: agency Groups: 1
==============================================================
[INFO] FISCO-BCOS Path : bin/fisco-bcos
[INFO] Start Port : 20000 20100 7545
[INFO] Server IP : 127.0.0.1:4
[INFO] State Type : storage
[INFO] RPC listen IP : 127.0.0.1
[INFO] Output Dir : /home/ubuntu16/fisco/multi_nodes
[INFO] CA Key Path : /home/ubuntu16/fisco/multi_nodes/cert/ca.key
==============================================================
[INFO] All completed. Files in /home/ubuntu16/fisco/multi_nodes
3.3 启动节点并验证共识
进入节点目录启动所有节点,并通过日志验证共识状态:
# 进入节点目录
$ cd ~/fisco/multi_nodes/127.0.0.1# 启动所有节点
$ bash start_all.sh# 查看节点进程
$ ps aux | grep fisco-bcos# 查看node0在group1的共识日志
$ tail -f node0/log/* | grep "g:1.*++"
info|2019-02-11 20:59:52.065958| [g:1][p:264][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=da72649e...# 查看node1在group1的共识日志
$ tail -f node1/log/* | grep "g:1.*++"
info|2019-02-11 20:59:54.070297| [g:1][p:264][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=11c9354d...
四、添加group2构建并行多组架构
4.1 复制并修改群组配置文件
并行多组架构的核心是为现有节点添加新的群组配置:
# 进入节点目录
$ cd ~/fisco/multi_nodes/127.0.0.1# 复制group1配置文件作为group2基础
$ cp node0/conf/group.1.genesis node0/conf/group.2.genesis# 修改群组ID为2
$ sed -i "s/id=1/id=2/g" node0/conf/group.2.genesis# 验证修改结果
$ cat node0/conf/group.2.genesis | grep "id"
# 输出:id=2# 将group2配置复制到所有节点
$ cp node0/conf/group.2.genesis node1/conf/group.2.genesis
$ cp node0/conf/group.2.genesis node2/conf/group.2.genesis
$ cp node0/conf/group.2.genesis node3/conf/group.2.genesis
4.2 重启节点并验证新群组共识
# 停止并重启所有节点
$ bash stop_all.sh
$ bash start_all.sh# 查看node0在group2的共识日志
$ tail -f node0/log/* | grep "g:2.*++"
info|2019-02-11 21:13:28.541596| [g:2][p:520][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=f3562664...# 查看node1在group2的共识日志
$ tail -f node1/log/* | grep "g:2.*++"
info|2019-02-11 21:13:30.546011| [g:2][p:520][CONSENSUS][SEALER]++++++++Generating seal on,blkNum=1,tx=0,nodeIdx=0,hash=4b17e74f...
五、控制台配置与多群组交易验证
5.1 获取并配置控制台
# 回到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/multi_nodes/127.0.0.1/sdk/* conf/# 获取节点channel端口
$ grep "channel_listen_port" multi_nodes/127.0.0.1/node0/config.ini
# 输出:channel_listen_port=20100
5.2 配置多群组连接信息
创建控制台配置文件,同时连接group1和group2:
<?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:20100</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:20100</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>
5.3 发送跨群组交易并验证
# 启动控制台
$ bash start.sh# 查看group1初始块高
[group:1]> getBlockNumber
0# 向group1部署合约
[group:1]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744# 确认group1块高增加
[group:1]> getBlockNumber
1# 切换到group2
[group:1]> switch 2
Switched to group 2.# 查看group2初始块高
[group:2]> getBlockNumber
0# 向group2部署合约
[group:2]> deploy HelloWorld
contract address:0x8c17cf316c1063ab6c89df875e96c9f0f5b2f744# 确认group2块高增加
[group:2]> getBlockNumber
1
5.4 查看多群组出块日志
# 查看group1出块日志
$ cat node0/log/* | grep "g:1.*Report"
info|2019-02-11 21:14:57.216548| [g:1][p:264][CONSENSUS][PBFT]^^^^^Report:,num=1,sealerIdx=3,hash=be961c98...,next=2,tx=1,nodeIdx=2# 查看group2出块日志
$ cat node0/log/* | grep "g:2.*Report"
info|2019-02-11 21:15:25.310565| [g:2][p:520][CONSENSUS][PBFT]^^^^^Report:,num=1,sealerIdx=3,hash=5d006230...,next=2,tx=1,nodeIdx=2