搭建多机区块链网络

标签:搭建多机区块链网络 区块链教程 HelloWorld 控制台调用合约


搭建第一个区块链网络章节详细介绍了如何搭建单机4节点区块链网络,本章以搭建多机4节点区块链网络为例,详细介绍如何在多台机器上部署FISCO BCOS。

1. 搭建多机4节点区块链网络

本节详细介绍如何基于开发部署工具build_chain搭建多机4节点区块链系统,生产环境建议使用运维部署工具进行区块链搭建和部署操作。

本教程,假设四台物理机器的IP分别为196.168.0.1, 196.168.0.3, 196.168.0.4196.168.0.2,每台机器部署一个区块链节点。

注解

  • 请确保每台机器的 30300, 20200, 8545 端口没有被占用。

  • 请确保每台机器开通了 30300, 2020022 端口的网络访问权限

  • 请确保生成区块链节点配置的机器可以访问外网(用于下载建链脚本)

第一步. 生成区块链节点配置

类似于单机区块链节点的部署,部署多机区块链系统之前,首先要生成节点配置,这里假设统一在IP为196.168.0.1机器上生成节点配置,具体操作流程如下:

创建操作路径,下载开发部署工具build_chain

# 创建操作路径~/fisco
mkdir -p ~/fisco && cd ~/fisco

# 下载开发部署工具build_chain
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.11.0/build_chain.sh && chmod u+x build_chain.sh

注解

  • 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 curl -#LO https://gitee.com/FISCO-BCOS/FISCO-BCOS/raw/master-2.0/tools/build_chain.sh && chmod u+x build_chain.sh

生成区块链网络配置文件

# 这里所有区块链节点均属于agencyA,并仅启动了群组1
# (注: 下面的ip信息需要根据真实的机器IP填写)
cat >> ipconf << EOF
196.168.0.1 agencyA 1
196.168.0.3 agencyA 1
196.168.0.4 agencyA 1
196.168.0.2 agencyA 1
EOF

基于配置文件生成区块链节点配置

bash build_chain.sh -f ipconf -p 30300,20200,8545

命令执行成功会输出All completed。如果执行出错,请检查nodes/build.log文件中的错误信息。

Checking fisco-bcos binary...
Binary check passed.
==============================================================
Generating CA key...
==============================================================
Generating keys and certificates ...
Processing IP=196.168.0.1 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.3 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.4 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.2 Total=1 Agency=agencyA Groups=1
==============================================================
Generating configuration files ...
Processing IP=196.168.0.1 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.3 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.4 Total=1 Agency=agencyA Groups=1
Processing IP=196.168.0.2 Total=1 Agency=agencyA Groups=1
==============================================================
Group:1 has 4 nodes
==============================================================
[INFO] FISCO-BCOS Path : bin/fisco-bcos
[INFO] IP List File    : ipconf
[INFO] Start Port      : 30300 20200 8545
[INFO] Server IP       : 196.168.0.1 196.168.0.3 196.168.0.4 196.168.0.2
[INFO] Output Dir      : /home/ubuntu/fisco/nodes
[INFO] CA Path         : /home/ubuntu/nodes/cert/
==============================================================
[INFO] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console.
e.g.  bash /home/ubuntu/fisco/nodes/196.168.0.1/download_console.sh -f
==============================================================
[INFO] All completed. Files in /root/fisco/nodes

至此,成功生成了多机4节点配置,每台机器的区块链节点配置均位于nodes文件夹下,如下:

$ ls nodes/
196.168.0.1  196.168.0.2  196.168.0.3  196.168.0.4  cert

第二步. 拷贝区块链节点配置

生成区块链节点配置后,需要将每个节点配置拷贝到对应机器上,可通过scp命令执行拷贝,具体如下:

# 为每台机器创建操作目录~/fisco
# (注: 这里使用fisco用户进行操作; 实际操作时,可使用自己的账户进行类似操作, IP也需要替换成自己的机器IP)
ssh fisco@196.168.0.1 "mkdir -p ~/fisco"
ssh fisco@196.168.0.2 "mkdir -p ~/fisco"
ssh fisco@196.168.0.3 "mkdir -p ~/fisco"
ssh fisco@196.168.0.4 "mkdir -p ~/fisco"

# 拷贝节点配置
# 拷贝节点配置到196.168.0.1的~/fisco路径
scp -r nodes/196.168.0.1/ fisco@196.168.0.1:~/fisco/196.168.0.1
# 拷贝节点配置到196.168.0.2的~/fisco路径
scp -r nodes/196.168.0.2/ fisco@196.168.0.2:~/fisco/196.168.0.2
# 拷贝节点配置到196.168.0.3的~/fisco路径
scp -r nodes/196.168.0.3/ fisco@196.168.0.3:~/fisco/196.168.0.3
# 拷贝节点配置到196.168.0.4的~/fisco路径
scp -r nodes/196.168.0.4/ fisco@196.168.0.4:~/fisco/196.168.0.4

第三步. 启动多机4节点区块链系统

区块链节点配置拷贝成功后,需要启动所有节点,可通过某台机器发起ssh操作远程启动区块链节点,也可登录上所有物理机后,在对应的物理机上启动区块链节点。

方法一: 远程启动区块链节点

这里同样从196.168.0.1发起节点启动命令,具体如下:

# (注: 这里使用fisco用户进行操作; 实际操作时,可使用自己的账户进行类似操作, IP也需要替换成自己的机器IP)
# 启动196.168.0.1机器上部署的区块链节点
$ ssh fisco@196.168.0.1 "bash ~/fisco/196.168.0.1/start_all.sh"
try to start node0
 node0 start successfully

# 启动196.168.0.2机器上部署的区块链节点
$ ssh fisco@196.168.0.2 "bash ~/fisco/196.168.0.2/start_all.sh"
try to start node0
 node0 start successfully

# 启动196.168.0.3机器上部署的区块链节点
$ ssh fisco@196.168.0.3 "bash ~/fisco/196.168.0.3/start_all.sh"
try to start node0
 node0 start successfully

# 启动196.168.0.4机器上部署的区块链节点
$ ssh fisco@196.168.0.4 "bash ~/fisco/196.168.0.4/start_all.sh"
try to start node0
 node0 start successfully

方法二: 直接登录机器启动区块链节点

# (注: 这里使用fisco用户进行操作; 实际操作时,可使用自己的账户进行类似操作, IP也需要替换成自己的机器IP)
# 登录196.168.0.1并启动区块链节点
$ ssh fisco@196.168.0.1
$ bash ~/fisco/196.168.0.1/start_all.sh

# 登录196.168.0.2并启动区块链节点
$ ssh fisco@196.168.0.2
$ bash ~/fisco/196.168.0.2/start_all.sh

# 登录196.168.0.3并启动区块链节点
$ ssh fisco@196.168.0.3
$ bash ~/fisco/196.168.0.3/start_all.sh

# 登录196.168.0.4并启动区块链节点
$ ssh fisco@196.168.0.4
$ bash ~/fisco/196.168.0.4/start_all.sh

至此,已经搭建了一条多机4节点区块链系统,接下来需要检查区块链节点是否正常工作。

第四步. 检查区块链节点

检查进程是否启动成功

登录每台机器,执行如下命令判断进程是否启动成功:

ps aux | grep fisco | grep -v grep

正常情况,每台机器都会有类似下面的输出;

fisco     29306  0.8  0.1 747008 31488 ?        Sl   17:08   0:05 /home/ubuntu/fisco/196.168.0.1/node0/../fisco-bcos -c config.ini

若某些机器没有类似以上的输出,请检查机器的30300, 20200, 8545端口是否被占用。

检查网络连接是否正常

登录每台机器,执行如下命令判断节点网络连接是否正常:

tail -f ~/fisco/*/node0/log/* |grep -i connected

正常情况会不停地输出连接信息,从输出可以看出该节点与其他机器节点连接正常。

info|2019-01-21 17:30:58.316769| [P2P][Service] heartBeat,connected count=3
info|2019-01-21 17:31:08.316922| [P2P][Service] heartBeat,connected count=3
info|2019-01-21 17:31:18.317105| [P2P][Service] heartBeat,connected count=3

检查区块链共识是否正常

登录每台机器,进入操作目录,执行如下命令判断节点共识是否正常:

tail -f ~/fisco/*/node0/log/* |grep -i +++

正常情况会不停输出带有++++Generating seal的日志,即表示共识正常。

info|2020-12-22 17:24:43.729402|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2e133146...
info|2020-12-22 17:24:47.740603|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=eb199760...

若以上检查均正常,说明多机4节点区块链系统部署成功,可通过控制台对其发起交易。

2. 配置和使用控制台

本章介绍如何为多机4节点区块链系统配置控制台,并使用控制台对多机区块链系统发起交易。

第一步. 准备依赖

  • 安装java (推荐使用java 14).

# ubuntu系统安装java
sudo apt install -y default-jdk

#centos系统安装java
sudo yum install -y java java-devel

第二步. 下载并配置控制台

下载控制台

# 创建操作目录
mkdir -p ~/fisco && cd ~/fisco

curl -#LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh

# 若因为网络问题导致长时间无法下载,请尝试以下命令:
curl -#LO  https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh

bash download_console.sh

配置控制台: 拷贝SDK证书

这里选择从196.168.0.1拷贝SDK证书,具体操作如下:

# 从196.168.0.1拷贝证书到conf目录下
$ scp 196.168.0.1:~/fisco/196.168.0.1/sdk/* ~/fisco/console/conf

配置控制台: 修改控制台配置

# 拷贝控制台配置
$ cp -n ~/fisco/console/conf/config-example.toml ~/fisco/console/conf/config.toml

# 修改控制台连接信息(操作中,控制台连接的IP信息请根据实际情况填写)
sed -i 's/peers=\["127.0.0.1:20200", "127.0.0.1:20201"\]/peers=["196.168.0.1:20200", "196.168.0.2:20200", "196.168.0.3:20200", "196.168.0.4:20200"]/g' ~/fisco/console/conf/config.toml

第三步. 启动并使用控制台

启动控制台

bash ~/fisco/console/start.sh

控制台启动成功后,会输出如下信息:

=============================================================================================
Welcome to FISCO BCOS console(2.7.0)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.
 ________ ______  ______   ______   ______       _______   ______   ______   ______
|        |      \/      \ /      \ /      \     |       \ /      \ /      \ /      \
| $$$$$$$$\$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\    | $$$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\
| $$__     | $$ | $$___\$| $$   \$| $$  | $$    | $$__/ $| $$   \$| $$  | $| $$___\$$
| $$  \    | $$  \$$    \| $$     | $$  | $$    | $$    $| $$     | $$  | $$\$$    \
| $$$$$    | $$  _\$$$$$$| $$   __| $$  | $$    | $$$$$$$| $$   __| $$  | $$_\$$$$$$\
| $$      _| $$_|  \__| $| $$__/  | $$__/ $$    | $$__/ $| $$__/  | $$__/ $|  \__| $$
| $$     |   $$ \\$$    $$\$$    $$\$$    $$    | $$    $$\$$    $$\$$    $$\$$    $$
 \$$      \$$$$$$ \$$$$$$  \$$$$$$  \$$$$$$      \$$$$$$$  \$$$$$$  \$$$$$$  \$$$$$$

=============================================================================================

若控制台启动失败,请参考控制台FAQ连接问题进行排查。

使用控制台发送交易

# 获取节点信息
[group:1]> getNodeVersion
ClientVersion{
    version='2.6.0',
    supportedVersion='2.6.0',
    chainId='1',
    buildTime='20200819 15:47:59',
    buildType='Darwin/appleclang/RelWithDebInfo',
    gitBranch='HEAD',
    gitCommitHash='e4a5ef2ef64d1943fccc4ebc61467a91779fb1c0'
}

# 获取当前块高
[group:1]> getBlockNumber
0

# 部署和调用HelloWorld合约
[group:1]> deploy HelloWorld
transaction hash: 0x0e1f192c97a625471597a3483ec230604ff4bb3d22826d118e606ba64bdb0bf9
contract address: 0x302b771c6e7525dc16f945510c210bae0976ad64

[group:1]> call HelloWorld 0x302b771c6e7525dc16f945510c210bae0976ad64 get
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return values:
[
    "Hello,World!"
]
---------------------------------------------------------------------------------------------

# 获取当前块高(块高增加1)
[group:1]> getBlockNumber
1

# 修改HelloWorld合约状态变量的值
[group:1]> call HelloWorld 0x302b771c6e7525dc16f945510c210bae0976ad64 set "hello, fisco"
transaction hash: 0xaa318a24b8a049778c7167bc2631eedadaeaba326a6cf17c79772036a0edc239
---------------------------------------------------------------------------------------------
transaction status: 0x0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Output
Receipt message: Success
Return message: Success
Return value: []
---------------------------------------------------------------------------------------------
Event logs
Event: {}

# 获取HelloWorld合约状态变量的值
[group:1]>  call HelloWorld 0x302b771c6e7525dc16f945510c210bae0976ad64 get
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return values:
[
    "hello,fisco"
]
---------------------------------------------------------------------------------------------

# 获取当前块高
[group:1]> getBlockNumber
2