使用运维部署工具

FISCO BCOS运维部署工具面向于真实的多机构生产环境。为了保证机构的密钥安全,运维部署工具提供了一种机构间相互合作部署联盟链方式。

本章以部署6节点3机构2群组的组网模式,演示运维部署工具的使用方法。更多参数选项说明请参考这里

国密部署教程说明请参考使用运维部署工具部署国密区块链

本章节为多机构对等部署的过程,适用于多机构部署,机构私钥不出内网的情况,由单机构一键生成所有机构节点配置文件的教程可以参考FISCO BCOS运维部署工具一键部署

下载安装

下载

  1. cd ~/ && git clone https://github.com/FISCO-BCOS/generator.git

安装

此操作要求用户具有sudo权限。

  1. cd ~/generator && bash ./scripts/install.sh

检查是否安装成功,若成功,输出 usage: generator xxx

  1. ./generator -h

获取节点二进制

拉取最新fisco-bcos二进制文件到meta中

  1. ./generator --download_fisco ./meta

检查二进制版本

若成功,输出 FISCO-BCOS Version : x.x.x-x

  1. ./meta/fisco-bcos -v

PS源码编译节点二进制的用户,只需要用编译出来的二进制替换掉meta文件夹下的二进制即可。

典型示例

为了保证机构的密钥安全,运维部署工具提供了一种机构间相互合作的的搭链方式。本节以部署6节点3机构2群组的组网模式,演示企业间如何相互配合,搭建区块链。

节点组网拓扑结构

一个如图所示的6节点3机构2群组的组网模式。机构B和机构C分别位于群组1和群组2中。机构A同属于群组1和群组2中。

../../_images/tutorial_step_2.png

机器环境

每个节点的IP,端口号为如下:

机构节点所属群组P2P地址RPC监听地址Channel监听地址
机构A节点0群组1、2127.0.0.1:30300127.0.0.1:85450.0.0.0:20200
节点1群组1、2127.0.0.1:30301127.0.0.1:85460.0.0.0:20201
机构B节点2群组1127.0.0.1:30302127.0.0.1:85470.0.0.0:20202
节点3群组1127.0.0.1:30303127.0.0.1:85480.0.0.0:20203
机构C节点4群组2127.0.0.1:30304127.0.0.1:85490.0.0.0:20204
节点5群组2127.0.0.1:30305127.0.0.1:85500.0.0.0:20205

注解

  • 云主机的公网IP均为虚拟IP,若rpc_ip/p2p_ip/channel_ip填写外网IP,会绑定失败,须填写0.0.0.0
  • RPC/P2P/Channel监听端口必须位于1024-65535范围内,且不能与机器上其他应用监听端口冲突
  • 出于安全性和易用性考虑,FISCO BCOS v2.3.0版本最新节点config.ini配置将listen_ip拆分成jsonrpc_listen_ip和channel_listen_ip,但仍保留对listen_ip的解析功能,详细请参考 这里
  • 为便于开发和体验,channel_listen_ip参考配置是 0.0.0.0 ,出于安全考虑,请根据实际业务网络情况,修改为安全的监听地址,如:内网IP或特定的外网IP

涉及机构

搭链操作涉及多个机构的合作,包括:

  • 证书颁发机构
  • 搭建节点的机构(简称“机构”)

关键流程

本流程简要的给出证书颁发机构节点机构间如何相互配合搭建区块链。

一、初始化链证书

  1. 证书颁发机构操作:
    • 生成链证书

二、生成群组1

  1. 证书颁发机构操作:颁发机构证书
    • 生成机构证书
    • 发送证书
  2. 机构间独立操作
    • 修改配置文件node_deployment.ini
    • 生成节点证书及节点P2P端口地址文件
  3. 选取其中一个机构为群组生成创世块
    • 收集群组内所有节点证书
    • 修改配置文件group_genesis.ini
    • 为群组生成创世块文件
    • 分发创世块文件
  4. 机构间独立操作:生成节点
    • 收集群组其他节点的P2P端口地址文件
    • 生成节点
    • 启动节点

三、初始化新机构

  1. 证书颁发机构操作:颁发新机构证书
    • 生成机构证书
    • 发送证书

四、生成群组2

  1. 新机构独立操作
    • 修改配置文件node_deployment.ini
    • 生成节点证书及节点P2P端口地址文件
  2. 选取其中一个机构为群组生成创世块
    • 收集群组内所有节点证书
    • 修改配置文件group_genesis.ini
    • 为群组生成创世块文件
    • 分发创世块文件
  3. 新机构独立操作:生成节点
    • 收集群组其他节点的P2P端口地址文件
    • 生成节点
    • 启动节点
  4. 已有机构操作:配置新群组
    • 收集群组其他节点的P2P端口地址文件
    • 配置新群组与新增节点的P2P端口地址
    • 重启节点

五、现有节点加入群组1

  1. 群组1原有机构操作:
    • 发送群组1创世区块至现有节点
    • 配置控制台
    • 获取加入节点nodeid
    • 使用控制台将节点加入群组1

联盟链初始化

为了操作简洁,本示例所有操作在同一台机器上进行,用不同的目录模拟不同的机构环境。用文件复制操作来模拟网络的发送。进行了教程中的下载安装后,请将generator复制到对应机构的generator目录中。

机构初始化

我们以教程中下载的generator作为证书颁发机构

初始化机构A

  1. cp -r ~/generator ~/generator-A

初始化机构B

  1. cp -r ~/generator ~/generator-B

初始化链证书

在证书颁发机构上进行操作,一条联盟链拥有唯一的链证书ca.crt

--generate_chain_certificate 命令生成链证书

在证书生成机构目录下操作:

  1. cd ~/generator
  1. ./generator --generate_chain_certificate ./dir_chain_ca

查看链证书及私钥:

  1. ls ./dir_chain_ca
  1. # 上述命令解释
  2. # 从左至右分别为链证书、链私钥
  3. ca.crt ca.key

机构A、B构建群组1

初始化机构A

教程中为了简化操作直接生成了机构证书和私钥,实际应用时应该由机构本地生成私钥agency.key,再生成证书请求文件,向证书签发机构获取机构证书agency.crt

在证书生成机构目录下操作:

  1. cd ~/generator

生成机构A证书:

  1. ./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyA

查看机构证书及私钥:

  1. ls dir_agency_ca/agencyA/
  1. # 上述命令解释
  2. # 从左至右分别为机构证书、机构私钥、链证书
  3. agency.crt agency.key ca.crt

发送链证书、机构证书、机构私钥至机构A,示例是通过文件拷贝的方式,从证书授权机构将机构证书发送给对应的机构,放到机构的工作目录的meta子目录下

  1. cp ./dir_agency_ca/agencyA/* ~/generator-A/meta/

初始化机构B

在证书生成机构目录下操作:

  1. cd ~/generator

生成机构B证书:

  1. ./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyB

发送链证书、机构证书、机构私钥至机构B,示例是通过文件拷贝的方式,从证书授权机构将机构证书发送给对应的机构,放到机构的工作目录的meta子目录下

  1. cp ./dir_agency_ca/agencyB/* ~/generator-B/meta/

重要

一条联盟链中只能用到一个根证书ca.crt,多服务器部署时不要生成多个根证书和私钥。一个群组只能有一个群组创世区块group.x.genesis

机构A修改配置文件

node_deployment.ini为节点配置文件,运维部署工具会根据node_deployment.ini下的配置生成相关节点证书,及生成节点配置文件夹等。

机构A修改conf文件夹下的node_deployment.ini如下图所示:

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A
  1. cat > ./conf/node_deployment.ini << EOF
  2. [group]
  3. group_id=1
  4. [node0]
  5. ; host ip for the communication among peers.
  6. ; Please use your ssh login ip.
  7. p2p_ip=127.0.0.1
  8. ; listen ip for the communication between sdk clients.
  9. ; This ip is the same as p2p_ip for physical host.
  10. ; But for virtual host e.g. vps servers, it is usually different from p2p_ip.
  11. ; You can check accessible addresses of your network card.
  12. ; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
  13. ; for more instructions.
  14. rpc_ip=127.0.0.1
  15. channel_ip=0.0.0.0
  16. p2p_listen_port=30300
  17. channel_listen_port=20200
  18. jsonrpc_listen_port=8545
  19. [node1]
  20. p2p_ip=127.0.0.1
  21. rpc_ip=127.0.0.1
  22. channel_ip=0.0.0.0
  23. p2p_listen_port=30301
  24. channel_listen_port=20201
  25. jsonrpc_listen_port=8546
  26. EOF

机构B修改配置文件

机构B修改conf文件夹下的node_deployment.ini如下图所示:

在~/generator-B目录下执行下述命令

  1. cd ~/generator-B
  1. cat > ./conf/node_deployment.ini << EOF
  2. [group]
  3. group_id=1
  4. [node0]
  5. ; host ip for the communication among peers.
  6. ; Please use your ssh login ip.
  7. p2p_ip=127.0.0.1
  8. ; listen ip for the communication between sdk clients.
  9. ; This ip is the same as p2p_ip for physical host.
  10. ; But for virtual host e.g. vps servers, it is usually different from p2p_ip.
  11. ; You can check accessible addresses of your network card.
  12. ; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
  13. ; for more instructions.
  14. rpc_ip=127.0.0.1
  15. channel_ip=0.0.0.0
  16. p2p_listen_port=30302
  17. channel_listen_port=20202
  18. jsonrpc_listen_port=8547
  19. [node1]
  20. p2p_ip=127.0.0.1
  21. rpc_ip=127.0.0.1
  22. channel_ip=0.0.0.0
  23. p2p_listen_port=30303
  24. channel_listen_port=20203
  25. jsonrpc_listen_port=8548
  26. EOF

机构A生成并发送节点信息

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

机构A生成节点证书及P2P连接信息文件,此步需要用到上述配置的node_deployment.ini,及机构meta文件夹下的机构证书与私钥,机构A生成节点证书及P2P连接信息文件

  1. ./generator --generate_all_certificates ./agencyA_node_info

查看生成文件:

  1. ls ./agencyA_node_info
  1. # 上述命令解释
  2. # 从左至右分别为需要交互给机构A的节点证书,节点P2P连接地址文件(根据node_deployment.ini生成的本机构节点信息)
  3. cert_127.0.0.1_30300.crt cert_127.0.0.1_30301.crt peers.txt

机构生成节点时需要指定其他节点的节点P2P连接地址,因此,A机构需将节点P2P连接地址文件发送至机构B

  1. cp ./agencyA_node_info/peers.txt ~/generator-B/meta/peersA.txt

机构B生成并发送节点信息

在~/generator-B目录下执行下述命令

  1. cd ~/generator-B

机构B生成节点证书及P2P连接信息文件:

  1. ./generator --generate_all_certificates ./agencyB_node_info

生成创世区块的机构需要节点证书,示例中由A机构生成创世区块,因此B机构除了发送节点P2P连接地址文件外,还需发送节点证书至机构A

发送证书

  1. cp ./agencyB_node_info/cert*.crt ~/generator-A/meta/

发送节点P2P连接地址文件

  1. cp ./agencyB_node_info/peers.txt ~/generator-A/meta/peersB.txt

机构A生成群组1创世区块

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

机构A修改conf文件夹下的group_genesis.ini,配置项可参考手册。:

  1. cat > ./conf/group_genesis.ini << EOF
  2. [group]
  3. group_id=1
  4. [nodes]
  5. node0=127.0.0.1:30300
  6. node1=127.0.0.1:30301
  7. node2=127.0.0.1:30302
  8. node3=127.0.0.1:30303
  9. EOF

命令执行之后会修改./conf/group_genesis.ini文件:

  1. ;命令解释
  2. [group]
  3. ;群组id
  4. group_id=1
  5. [nodes]
  6. ;机构A节点p2p地址
  7. node0=127.0.0.1:30300
  8. ;机构A节点p2p地址
  9. node1=127.0.0.1:30301
  10. ;机构B节点p2p地址
  11. node2=127.0.0.1:30302
  12. ;机构B节点p2p地址
  13. node3=127.0.0.1:30303

教程中选择机构A生成群组创世区块,实际生产中可以通过联盟链委员会协商选择。

此步会根据机构A的meta文件夹下配置的节点证书,生成group_genesis.ini配置的群组创世区块,教程中需要机构A的meta下有名为cert_127.0.0.1_30300.crtcert_127.0.0.1_30301.crtcert_127.0.0.1_30302.crtcert_127.0.0.1_30303.crt的节点证书,此步需要用到机构B的节点证书。

  1. ./generator --create_group_genesis ./group

分发群组1创世区块至机构B:

  1. cp ./group/group.1.genesis ~/generator-B/meta

机构A生成所属节点

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

生成机构A所属节点,此命令会根据用户配置的node_deployment.ini文件生成相应的节点配置文件夹:

注意,此步指定的节点P2P连接信息peers.txt为群组内其他节点的链接信息,多个机构组网的情况下需要将其合并。

  1. ./generator --build_install_package ./meta/peersB.txt ./nodeA

查看生成节点配置文件夹:

  1. ls ./nodeA
  1. # 命令解释 此处采用tree风格显示
  2. # 生成的文件夹nodeA信息如下所示,
  3. ├── monitor # monitor脚本
  4. ├── node_127.0.0.1_30300 # 127.0.0.1服务器 端口号30300的节点配置文件夹
  5. ├── node_127.0.0.1_30301
  6. ├── scripts # 节点的相关工具脚本
  7. ├── start_all.sh # 节点批量启动脚本
  8. └── stop_all.sh # 节点批量停止脚本

机构A启动节点:

  1. bash ./nodeA/start_all.sh

查看节点进程:

  1. ps -ef | grep fisco
  1. # 命令解释
  2. # 可以看到如下进程
  3. fisco 15347 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30300/fisco-bcos -c config.ini
  4. fisco 15402 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30301/fisco-bcos -c config.ini

机构B生成所属节点

在~/generator-B目录下执行下述命令

  1. cd ~/generator-B

生成机构B所属节点,此命令会根据用户配置的node_deployment.ini文件生成相应的节点配置文件夹:

  1. ./generator --build_install_package ./meta/peersA.txt ./nodeB

机构B启动节点:

  1. bash ./nodeB/start_all.sh

注解

节点启动只需要推送对应ip的node文件夹即可,如127.0.0.1的服务器,只需node_127.0.0.1_port对应的节点配置文件夹。多机部署时,只需要将生成的节点文件夹推送至对应服务器即可。

查看群组1节点运行状态

查看进程:

  1. ps -ef | grep fisco
  1. # 命令解释
  2. # 可以看到如下所示的进程
  3. fisco 15347 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30300/fisco-bcos -c config.ini
  4. fisco 15402 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30301/fisco-bcos -c config.ini
  5. fisco 15457 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30302/fisco-bcos -c config.ini
  6. fisco 15498 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30303/fisco-bcos -c config.ini

查看节点log:

  1. tail -f ./node*/node*/log/log* | grep +++
  1. # 命令解释
  2. # log中打印的+++即为节点正常共识
  3. info|2019-02-25 17:25:56.028692| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=0,hash=833bd983...
  4. info|2019-02-25 17:25:59.058625| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=0,hash=343b1141...
  5. info|2019-02-25 17:25:57.038284| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=1,hash=ea85c27b...

至此,我们完成了如图所示机构A、B搭建群组1的操作:

../../_images/tutorial_step_1.png

证书授权机构初始化机构C

在证书生成机构目录下操作:

  1. cd ~/generator

初始化机构C,请注意,此时generator目录下有链证书及私钥,实际环境中机构C无法获取链证书及私钥。

  1. cp -r ~/generator ~/generator-C

生成机构C证书:

  1. ./generator --generate_agency_certificate ./dir_agency_ca ./dir_chain_ca agencyC

查看机构证书及私钥:

  1. ls dir_agency_ca/agencyC/
  1. # 上述命令解释
  2. # 从左至右分别为机构证书、机构私钥、链证书
  3. agency.crt agency.key ca.crt

发送链证书、机构证书、机构私钥至机构C,示例是通过文件拷贝的方式,从证书授权机构将机构证书发送给对应的机构,放到机构的工作目录的meta子目录下

  1. cp ./dir_agency_ca/agencyC/* ~/generator-C/meta/

机构A、C构建群组2

接下来,机构C需要与A进行新群组建立操作,示例中以C生成创世区块为例。

机构A发送节点信息

由于机构A已经生成过节点证书及peers文件,只需将之前生成的节点P2P连接信息以及节点证书发送至机构C,操作如下:

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

示例中由机构C生成群组创世区块,因此需要机构A的节点证书和节点P2P连接地址文件,将上述文件发送至机构C

发送证书

  1. cp ./agencyA_node_info/cert*.crt ~/generator-C/meta/

发送节点P2P连接地址文件

  1. cp ./agencyA_node_info/peers.txt ~/generator-C/meta/peersA.txt

机构C修改配置文件

机构C修改conf文件夹下的node_deployment.ini如下图所示:

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C
  1. cat > ./conf/node_deployment.ini << EOF
  2. [group]
  3. group_id=2
  4. [node0]
  5. ; host ip for the communication among peers.
  6. ; Please use your ssh login ip.
  7. p2p_ip=127.0.0.1
  8. ; listen ip for the communication between sdk clients.
  9. ; This ip is the same as p2p_ip for physical host.
  10. ; But for virtual host e.g. vps servers, it is usually different from p2p_ip.
  11. ; You can check accessible addresses of your network card.
  12. ; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
  13. ; for more instructions.
  14. rpc_ip=127.0.0.1
  15. channel_ip=0.0.0.0
  16. p2p_listen_port=30304
  17. channel_listen_port=20204
  18. jsonrpc_listen_port=8549
  19. [node1]
  20. p2p_ip=127.0.0.1
  21. rpc_ip=127.0.0.1
  22. channel_ip=0.0.0.0
  23. p2p_listen_port=30305
  24. channel_listen_port=20205
  25. jsonrpc_listen_port=8550
  26. EOF

机构C生成并发送节点信息

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C

机构C生成节点证书及P2P连接信息文件:

  1. ./generator --generate_all_certificates ./agencyC_node_info

查看生成文件:

  1. ls ./agencyC_node_info
  1. # 上述命令解释
  2. # 从左至右分别为需要交互给机构A的节点证书,节点P2P连接地址文件(根据node_deployment.ini生成的本机构节点信息)
  3. cert_127.0.0.1_30304.crt cert_127.0.0.1_30305.crt peers.txt

机构生成节点时需要指定其他节点的节点P2P连接地址,因此,C机构需将节点P2P连接地址文件发送至机构A

  1. cp ./agencyC_node_info/peers.txt ~/generator-A/meta/peersC.txt

机构C生成群组2创世区块

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C

机构C修改conf文件夹下的group_genesis.ini如下图所示:

  1. cat > ./conf/group_genesis.ini << EOF
  2. [group]
  3. group_id=2
  4. [nodes]
  5. node0=127.0.0.1:30300
  6. node1=127.0.0.1:30301
  7. node2=127.0.0.1:30304
  8. node3=127.0.0.1:30305
  9. EOF

命令执行之后会修改./conf/group_genesis.ini文件:

  1. ;命令解释
  2. [group]
  3. group_id=2
  4. [nodes]
  5. node0=127.0.0.1:30300
  6. ;机构A节点p2p地址
  7. node1=127.0.0.1:30301
  8. ;机构A节点p2p地址
  9. node2=127.0.0.1:30304
  10. ;机构C节点p2p地址
  11. node3=127.0.0.1:30305
  12. ;机构C节点p2p地址

教程中选择机构C生成群组创世区块,实际生产中可以通过联盟链委员会协商选择。

此步会根据机构C的meta文件夹下配置的节点证书,生成group_genesis.ini配置的群组创世区块。

  1. ./generator --create_group_genesis ./group

分发群组2创世区块至机构A:

  1. cp ./group/group.2.genesis ~/generator-A/meta/

机构C生成所属节点

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C
  1. ./generator --build_install_package ./meta/peersA.txt ./nodeC

机构C启动节点:

  1. bash ./nodeC/start_all.sh
  1. ps -ef | grep fisco
  1. # 命令解释
  2. # 可以看到如下进程
  3. fisco 15347 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30300/fisco-bcos -c config.ini
  4. fisco 15402 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30301/fisco-bcos -c config.ini
  5. fisco 15457 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30302/fisco-bcos -c config.ini
  6. fisco 15498 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30303/fisco-bcos -c config.ini
  7. fisco 15550 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30304/fisco-bcos -c config.ini
  8. fisco 15589 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30305/fisco-bcos -c config.ini

机构A为现有节点初始化群组2

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

添加群组2配置文件至已有节点,此步将群组2创世区块group.2.genesis添加至./nodeA下的所有节点内:

  1. ./generator --add_group ./meta/group.2.genesis ./nodeA

添加机构C节点连接文件peers至已有节点,此步将peersC.txt的节点P2P连接地址添加至./nodeA下的所有节点内:

  1. ./generator --add_peers ./meta/peersC.txt ./nodeA

重启机构A节点:

  1. bash ./nodeA/stop_all.sh
  1. bash ./nodeA/start_all.sh

查看群组2节点运行状态

查看节点进程:

  1. ps -ef | grep fisco
  1. # 命令解释
  2. # 可以看到如下进程
  3. fisco 15347 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30300/fisco-bcos -c config.ini
  4. fisco 15402 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30301/fisco-bcos -c config.ini
  5. fisco 15457 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30302/fisco-bcos -c config.ini
  6. fisco 15498 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30303/fisco-bcos -c config.ini
  7. fisco 15550 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30304/fisco-bcos -c config.ini
  8. fisco 15589 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30305/fisco-bcos -c config.ini

查看节点log:

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C
  1. tail -f ./node*/node*/log/log* | grep +++
  1. # 命令解释
  2. # log中打印的+++即为节点正常共识
  3. info|2019-02-25 17:25:56.028692| [g:2][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=0,hash=833bd983...
  4. info|2019-02-25 17:25:59.058625| [g:2][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=0,hash=343b1141...
  5. info|2019-02-25 17:25:57.038284| [g:2][p:264][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,myIdx=1,hash=ea85c27b...

至此,我们完成了如图所示的机构A、C搭建群组2构建:

../../_images/tutorial_step_2.png

扩展教程–机构C节点加入群组1

将节点加入已有群组需要用户使用控制台发送指令,将节点加入群组,示例如下:

注解

企业部署工具会根据generator/meta文件夹下的机构证书及私钥生成sdk相应证书,如需手动生成可以参考操作手册中的generate_sdk_certificate命令

此时群组1内有机构A、B的节点,机构C节点加入群组1需要经过群组内节点的准入,示例以机构A节点为例:

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

发送群组1创世区块至机构C

发送群组1配置文件至机构C节点:

  1. ./generator --add_group ./group/group.1.genesis ~/generator-C/nodeC

当前FISCO BCOS暂不支持文件热更新,为机构C节点添加群组1创世区块后需重启节点。

重启机构C节点:

  1. bash ~/generator-C/nodeC/stop_all.sh
  1. bash ~/generator-C/nodeC/start_all.sh

配置控制台

机构A配置控制台或sdk,教程中以控制台为例:

注意:此命令会根据用户配置的node_deployment.ini中节点及群组完成了控制台的配置,用户可以直接启动控制台,启动前请确保已经安装java

国内用户推荐使用cdn下载,如果访问github较快,可以去掉--cdn选项:

  1. ./generator --download_console ./ --cdn

查看机构C节点4信息

机构A使用控制台加入机构C节点4为观察节点,其中参数第二项需要替换为加入节点的nodeid,nodeid在节点文件夹的conf的node.nodeid文件

查看机构C节点nodeid:

  1. cat ~/generator-C/nodeC/node_127.0.0.1_30304/conf/node.nodeid
  1. # 命令解释
  2. # 可以看到类似于如下nodeid,控制台使用时需要传入该参数
  3. ea2ca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123

使用控制台注册观察节点

启动控制台:

  1. cd ~/generator-A/console && bash ./start.sh 1

使用控制台addObserver命令将节点注册为观察节点,此步需要用到cat命令查看得到机构C节点的node.nodeid

  1. addObserver ea2ca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123
  1. # 命令解释
  2. # 执行成功会提示success
  3. $ [group:1]> addObserver ea2ca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123
  4. {
  5. "code":0,
  6. "msg":"success"
  7. }

退出控制台:

  1. exit

查看机构C节点5信息

机构A使用控制台加入机构C的节点5为共识节点,其中参数第二项需要替换为加入节点的nodeid,nodeid在节点文件夹的conf的node.nodeid文件

查看机构C节点nodeid:

  1. cat ~/generator-C/nodeC/node_127.0.0.1_30305/conf/node.nodeid
  1. # 命令解释
  2. # 可以看到类似于如下nodeid,控制台使用时需要传入该参数
  3. 5d70e046047e15a68aff8e32f2d68d1f8d4471953496fd97b26f1fbdc18a76720613a34e3743194bd78aa7acb59b9fa9aec9ec668fa78c54c15031c9e16c9e8d

使用控制台注册共识节点

启动控制台:

  1. cd ~/generator-A/console && bash ./start.sh 1

使用控制台addSealer命令将节点注册为共识节点,此步需要用到cat命令查看得到机构C节点的node.nodeid

  1. addSealer 5d70e046047e15a68aff8e32f2d68d1f8d4471953496fd97b26f1fbdc18a76720613a34e3743194bd78aa7acb59b9fa9aec9ec668fa78c54c15031c9e16c9e8d
  1. # 命令解释
  2. # 执行成功会提示success
  3. $ [group:1]> addSealer 5d70e046047e15a68aff8e32f2d68d1f8d4471953496fd97b26f1fbdc18a76720613a34e3743194bd78aa7acb59b9fa9aec9ec668fa78c54c15031c9e16c9e8d
  4. {
  5. "code":0,
  6. "msg":"success"
  7. }

退出控制台:

  1. exit

查看节点

在~/generator-C目录下执行下述命令

  1. cd ~/generator-C

查看节点log内group1信息:

  1. cat node*/node_127.0.0.1_3030*/log/log* | grep g:1 | grep Report
  1. # 命令解释
  2. # 观察节点只会同步交易数据,不会同步非交易状态的共识信息
  3. # log中的^^^即为节点的交易信息,g:1为群组1打印的信息
  4. info|2019-02-26 16:01:39.914367| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=0,sealerIdx=0,hash=9b76de5d...,next=1,tx=0,nodeIdx=65535
  5. info|2019-02-26 16:01:40.121075| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=3,hash=46b7f17c...,next=2,tx=1,nodeIdx=65535
  6. info|2019-02-26 16:03:44.282927| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=2,sealerIdx=2,hash=fb982013...,next=3,tx=1,nodeIdx=65535
  7. info|2019-02-26 16:01:39.914367| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=0,sealerIdx=0,hash=9b76de5d...,next=1,tx=0,nodeIdx=4
  8. info|2019-02-26 16:01:40.121075| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=3,hash=46b7f17c...,next=2,tx=1,nodeIdx=4
  9. info|2019-02-26 16:03:44.282927| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=2,sealerIdx=2,hash=fb982013...,next=3,tx=1,nodeIdx=4

../../_images/tutorial_step_3.png

通过本节教程,我们在本机生成一个网络拓扑结构为3机构2群组6节点的多群组架构联盟链。

如果使用该教程遇到问题,请查看FAQ

扩展教程2–机构A扩容节点加入群组1

本节中,我们将会为机构A新增节点6,IP、端口号如下:

机构节点所属群组P2P地址RPC监听地址Channel监听地址
机构A节点6群组1127.0.0.1:30306127.0.0.1:85510.0.0.0:20206

在上述过程中,机构A已经生成了自己所属的机构证书及私钥,并且拥有了群组1的创世区块,扩容节点需要进行的操作如下。

将节点加入已有群组需要用户使用控制台发送指令,将节点加入群组,示例如下:

机构A修改配置文件

node_deployment.ini为节点配置文件,运维部署工具会根据node_deployment.ini下的配置生成相关节点证书,及生成节点配置文件夹等。

机构A修改conf文件夹下的node_deployment.ini如下图所示:

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A
  1. cat > ./conf/node_deployment.ini << EOF
  2. [group]
  3. group_id=1
  4. [node0]
  5. ; host ip for the communication among peers.
  6. ; Please use your ssh login ip.
  7. p2p_ip=127.0.0.1
  8. ; listen ip for the communication between sdk clients.
  9. ; This ip is the same as p2p_ip for physical host.
  10. ; But for virtual host e.g. vps servers, it is usually different from p2p_ip.
  11. ; You can check accessible addresses of your network card.
  12. ; Please see https://tecadmin.net/check-ip-address-ubuntu-18-04-desktop/
  13. ; for more instructions.
  14. rpc_ip=127.0.0.1
  15. channel_ip=0.0.0.0
  16. p2p_listen_port=30306
  17. channel_listen_port=20206
  18. jsonrpc_listen_port=8551
  19. EOF

机构A生成节点证书

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

机构A生成节点证书及P2P连接信息文件,此步需要用到上述配置的node_deployment.ini,及机构meta文件夹下的机构证书与私钥,机构A生成节点证书及P2P连接信息文件

  1. ./generator --generate_all_certificates ./agencyA_node_info_new

查看生成文件:

  1. ls ./agencyA_node_info_new
  1. # 上述命令解释
  2. # 从左至右分别为需要交互给机构A的节点证书,节点P2P连接地址文件(根据node_deployment.ini生成的本机构节点信息)
  3. cert_127.0.0.1_30306.crt peers.txt

机构A生成新增节点

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

生成机构A所属节点,此命令会根据用户配置的node_deployment.ini文件生成相应的节点配置文件夹:

注意,此步指定的节点P2P连接信息peers.txt为群组内其他节点的链接信息,多个机构组网的情况下需要将其合并。

合并当前节点的peers.txt

  1. cat ./agencyA_node_info/peers.txt >> ./meta/peersB.txt

生成新增节点:

  1. ./generator --build_install_package ./meta/peersB.txt ./nodeA_new

查看生成节点配置文件夹:

  1. ls ./nodeA_new
  1. # 命令解释 此处采用tree风格显示
  2. # 生成的文件夹nodeA信息如下所示,
  3. ├── monitor # monitor脚本
  4. ├── node_127.0.0.1_30306 # 127.0.0.1服务器 端口号30306的节点配置文件夹
  5. ├── scripts # 节点的相关工具脚本
  6. ├── start_all.sh # 节点批量启动脚本
  7. └── stop_all.sh # 节点批量停止脚本

机构A启动节点:

  1. bash ./nodeA_new/start_all.sh

查看节点进程:

  1. ps -ef | grep fisco
  1. # 命令解释
  2. # 可以看到如下进程
  3. fisco 15347 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30300/fisco-bcos -c config.ini
  4. fisco 15402 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA/node_127.0.0.1_30301/fisco-bcos -c config.ini
  5. fisco 15457 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30302/fisco-bcos -c config.ini
  6. fisco 15498 1 0 17:22 pts/2 00:00:00 ~/generator-B/nodeB/node_127.0.0.1_30303/fisco-bcos -c config.ini
  7. fisco 15550 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30304/fisco-bcos -c config.ini
  8. fisco 15589 1 0 17:22 pts/2 00:00:00 ~/generator-C/nodeC/node_127.0.0.1_30305/fisco-bcos -c config.ini
  9. fisco 15673 1 0 17:22 pts/2 00:00:00 ~/generator-A/nodeA_new/node_127.0.0.1_30306/fisco-bcos -c config.ini

注解

企业部署工具会根据generator/meta文件夹下的机构证书及私钥生成sdk相应证书,如需手动生成可以参考操作手册中的generate_sdk_certificate命令

此时群组1内有机构A、B的节点,机构C节点加入群组1需要经过群组内节点的准入,示例以机构A节点为例:

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

配置控制台

机构A配置控制台或sdk,教程中以控制台为例:

注意:此命令会根据用户配置的node_deployment.ini中节点及群组完成了控制台的配置,用户可以直接启动控制台,启动前请确保已经安装java

国内用户推荐使用cdn下载,如果访问github较快,可以去掉--cdn选项:

如果已经配置过控制台,请忽略此步

  1. ./generator --download_console ./ --cdn

查看机构A节点6信息

机构A使用控制台加入节点6为共识节点,其中参数第二项需要替换为加入节点的nodeid,nodeid在节点文件夹的conf的node.nodeid文件

查看机构A节点nodeid:

  1. cat ~/generator-A/nodeA_new/node_127.0.0.1_30306/conf/node.nodeid
  1. # 命令解释
  2. # 可以看到类似于如下nodeid,控制台使用时需要传入该参数
  3. degca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123

使用控制台注册观察节点

启动控制台:

  1. cd ~/generator-A/console && bash ./start.sh 1

使用控制台addSealer命令将节点注册为共识节点,此步需要用到cat命令查看得到机构A节点的node.nodeid

添加共识节点的过程类似,参考addObserver命令

  1. addSealer degca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123
  1. # 命令解释
  2. # 执行成功会提示success
  3. $ [group:1]> addSealer degca519148cafc3e92c8d9a8572b41ea2f62d0d19e99273ee18cccd34ab50079b4ec82fe5f4ae51bd95dd788811c97153ece8c05eac7a5ae34c96454c4d3123
  4. {
  5. "code":0,
  6. "msg":"success"
  7. }

退出控制台:

  1. exit

查看机构A新增节点

在~/generator-A目录下执行下述命令

  1. cd ~/generator-A

查看节点log内group1信息:

  1. cat nodeA_new/node_127.0.0.1_30306/log/log* | grep g:1 | grep Report
  1. # 命令解释
  2. # 观察节点只会同步交易数据,不会同步非交易状态的共识信息
  3. # log中的^^^即为节点的交易信息,g:1为群组1打印的信息
  4. info|2019-02-26 16:01:39.914367| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=0,sealerIdx=0,hash=9b76de5d...,next=1,tx=0,nodeIdx=65535
  5. info|2019-02-26 16:01:40.121075| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=3,hash=46b7f17c...,next=2,tx=1,nodeIdx=65535
  6. info|2019-02-26 16:03:44.282927| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=2,sealerIdx=2,hash=fb982013...,next=3,tx=1,nodeIdx=65535
  7. info|2019-02-26 16:01:39.914367| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=0,sealerIdx=0,hash=9b76de5d...,next=1,tx=0,nodeIdx=4
  8. info|2019-02-26 16:01:40.121075| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=1,sealerIdx=3,hash=46b7f17c...,next=2,tx=1,nodeIdx=4
  9. info|2019-02-26 16:03:44.282927| [g:1][p:65544][CONSENSUS][PBFT]^^^^^^^^Report,num=2,sealerIdx=2,hash=fb982013...,next=3,tx=1,nodeIdx=4

至此 我们完成了所示构建教程中的所有操作。

如果使用该教程遇到问题,请查看FAQ