Fisco Bcos学习 - 搭建星形拓扑组网

一、前言

在区块链技术的实际应用中,组网拓扑结构的选择直接影响系统的性能、安全性和可扩展性。星形拓扑作为一种常见的组网方式,其核心特点是存在一个中心节点,该节点同时属于多个群组,而其他节点则分别属于不同的群组。这种结构特别适合于存在中心机构的业务场景,例如金融领域中的多方协作系统,其中中心机构需要参与多个业务群组的共识,而其他机构则仅参与各自相关的群组。

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/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
         http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
         http://www.springframework.org/schema/aop
    http://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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自马达加斯加的黑猫杰克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值