搭建第一个区块链网络

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


重要

相关软件和环境版本说明!请查看

本章介绍使用FISCO BCOS底层区块链系统所需要的必要安装和配置。本章通过在单机上部署一条4节点的FISCO BCOS联盟链,帮助用户掌握FISCO BCOS部署流程,请参考硬件和系统要求使用支持的硬件和平台操作。

注解

  • FISCO BCOS 3.0的系统架构,请参考 这里

  • FISCO BCOS 3.0 Air版本搭建和使用教程,请参考 这里

  • FISCO BCOS 3.0 Pro版本搭建和使用教程,请参考 这里

1. 搭建Air版本FISCO BCOS联盟链

本节以搭建单群组FISCO BCOS链为例操作,使用开发部署工具build_chain.sh脚本在本地搭建一条Air版本的4节点的FISCO BCOS链,以Ubuntu 18.04 64bit系统为例操作。

第一步. 安装依赖

安装macOS依赖

# 最新homebrew默认下载的为openssl@3,需要指定版本openssl@1.1下载
brew install openssl@1.1 curl wget

安装ubuntu依赖

sudo apt install -y curl openssl wget

安装centos依赖

sudo yum install -y curl openssl openssl-devel wget

第二步. 创建操作目录,下载安装脚本

注解

如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.0.0-rc4/build_chain.sh && chmod u+x build_chain.sh

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

# 下载建链脚本
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.0.0-rc4/build_chain.sh && chmod u+x build_chain.sh

# Note: 若访问git网速太慢,可尝试如下命令下载建链脚本:
curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v3.0.0-rc4/build_chain.sh && chmod u+x build_chain.sh

第三步. 搭建4节点非国密联盟链

注解

请确保机器的30300~30303,20200~20203,8545~8548端口没有被占用。

在fisco目录下执行下面的指令,生成一条单群组4节点的FISCO链:

bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200

注解

  • 其中-p选项指定起始端口,分别是p2p监听端口、rpc监听端口

  • Air版搭建脚本build_chain.sh介绍文档 参考这里

命令成功后会输出All completed

[INFO] Generate ca cert successfully!
Processing IP:127.0.0.1 Total:4
[INFO] Generate ./nodes/127.0.0.1/sdk cert successful!
[INFO] Generate ./nodes/127.0.0.1/node0/conf cert successful!
[INFO] Generate ./nodes/127.0.0.1/node1/conf cert successful!
[INFO] Generate ./nodes/127.0.0.1/node2/conf cert successful!
[INFO] Generate ./nodes/127.0.0.1/node3/conf cert successful!
==============================================================
[INFO] fisco-bcos Path     : bin/fisco-bcos
[INFO] Auth Mode           : false
[INFO] Start Port          : 30300 20200
[INFO] Server IP           : 127.0.0.1:4
[INFO] SM Model            : false
[INFO] output dir          : ./nodes
[INFO] All completed. Files in ./nodes

第四步. 启动FISCO BCOS链

  • 启动所有节点

bash nodes/127.0.0.1/start_all.sh

启动成功会输出如下信息。否则请使用netstat -an |grep tcp检查机器30300~30303, 20200~20203端口是否被占用。

try to start node0
 node0 start successfully
try to start node1
 node1 start successfully
try to start node2
 node2 start successfully
try to start node3
 node3 start successfully

第五步. 检查节点进程

  • 检查进程是否启动

ps aux |grep -v grep |grep fisco-bcos

正常情况会有类似下面的输出; 如果进程数不为4,则进程没有启动(一般是端口被占用导致的)

fisco        35249   7.1  0.2  5170924  57584 s003  S     2:25下午   0:31.63 /home/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini -g config.genesis
fisco        35218   6.8  0.2  5301996  57708 s003  S     2:25下午   0:31.78 /home/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini -g config.genesis
fisco        35277   6.7  0.2  5301996  57660 s003  S     2:25下午   0:31.85 /home/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini -g config.genesis
fisco        35307   6.6  0.2  5301996  57568 s003  S     2:25下午   0:31.93 /home/fisco/nodes//127.0.0.1/node3/../fisco-bcos -c config.ini -g config.genesis

第六步. 检查日志输出

  • 查看每个节点的网络连接数目

以node0为例:

tail -f nodes/127.0.0.1/node0/log/* |grep -i "heartBeat,connected count"

正常情况下会每间隔10秒输出连接信息,从输出日志可看出node0与另外3个节点均有连接,网络连接正常:

info|2021-11-23 14:36:13.839347|[P2PService][Service]heartBeat,connected count=3
info|2021-11-23 14:36:23.844032|[P2PService][Service]heartBeat,connected count=3
info|2021-11-23 14:36:33.848776|[P2PService][Service]heartBeat,connected count=3
info|2021-11-23 14:36:43.852888|[P2PService][Service]heartBeat,connected count=3

2. 配置和使用控制台

控制台提供了向FISCO BCOS节点部署合约、发起合约调用、查询链状态等功能。

第一步. 安装控制台依赖

控制台运行依赖java环境(推荐使用java 14),安装命令如下:

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

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

第二步. 下载控制台

cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v3.0.0-rc4/download_console.sh && bash download_console.sh

注解

第三步. 配置控制台

  • 拷贝控制台配置文件

cp -n console/conf/config-example.toml console/conf/config.toml

注解

若节点未采用默认端口,请将文件中的20200替换成节点对应的rpc端口,可通过节点config.ini的 ``[rpc].listen_port``配置项获取节点的rpc端口。

  • 配置控制台证书

控制台与节点之间默认开启SSL连接,控制台需要配置证书才可连接节点。开发建链脚本在生成节点的同时,生成了SDK证书,可直接拷贝生成的证书供控制台使用:

cp -r nodes/127.0.0.1/sdk/* console/conf

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

注解

  • 请确保机器的30300~30303,20200~20203,8545~8548端口没有被占用。

  • 控制台的配置方法和命令请参考 这里

  • 启动

cd ~/fisco/console && bash start.sh

输出下述信息表明启动成功 否则请检查conf/config.toml中节点端口配置是否正确

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

=============================================================================================
  • 用控制台获取信息

# 获取节点列表信息
[group0]: /> getGroupPeers
peer0: 48fde62f1d2dc59a65bed2e3bb9bd199de26de6b9894e2201199726d6e9e98d090bb1d7e22c931b412728a832ffacdd2727b34fc808f5a755af6bc623c44aba6
peer1: 8e510d66644a8a6caa7e031f097f604501bc42a3851b817f65a18eede0c539f2d011349d470da74cb84a3cf88dbd64a4cc18369fa09b17dac4eec9f65975ecc2
peer2: 9d7ff3f0d3abd54054a99d17a6af27c839f8f7702a4335bdb502323c87a0d7978534a2479cfedb614e1548a869efe038fc49da442b5770aa52c0cc793ca13602
peer3: f0ffa45cee35dcc1bcf1e1ef7b7c3d96590c25ba75198a28ef5ceb89dc6bec310619cb6850231018c8d5a5d698eaf1e5669118e17ea79379211bd332896aa56a

# 获取共识节点列表信息
[group0]: /> getSealerList
[
    Sealer{
        nodeID='9d7ff3f0d3abd54054a99d17a6af27c839f8f7702a4335bdb502323c87a0d7978534a2479cfedb614e1548a869efe038fc49da442b5770aa52c0cc793ca13602',
        weight=1
    },
    Sealer{
        nodeID='f0ffa45cee35dcc1bcf1e1ef7b7c3d96590c25ba75198a28ef5ceb89dc6bec310619cb6850231018c8d5a5d698eaf1e5669118e17ea79379211bd332896aa56a',
        weight=1
    },
    Sealer{
        nodeID='8e510d66644a8a6caa7e031f097f604501bc42a3851b817f65a18eede0c539f2d011349d470da74cb84a3cf88dbd64a4cc18369fa09b17dac4eec9f65975ecc2',
        weight=1
    },
    Sealer{
        nodeID='48fde62f1d2dc59a65bed2e3bb9bd199de26de6b9894e2201199726d6e9e98d090bb1d7e22c931b412728a832ffacdd2727b34fc808f5a755af6bc623c44aba6',
        weight=1
    }
]

3. 部署和调用合约

第一步. 编写HelloWorld合约

HelloWorld合约提供了两个接口get()set(),用于获取/设置合约变量name,合约内容如下:

pragma solidity>=0.4.24 <0.6.11;
contract HelloWorld {
    string name;

    constructor() public {
        name = "Hello, World!";
    }

    function get() public view returns (string memory) {
        return name;
    }

    function set(string memory n) public {
        name = n;
    }
}

第二步. 部署HelloWorld合约

为了方便用户快速体验,HelloWorld合约已经内置于控制台中,位于控制台目录contracts/solidity/HelloWorld.sol,参考下面命令部署:

# 在控制台输入以下指令 部署成功则返回合约地址
[group0]: /> deploy HelloWorld
transaction hash: 0x796b573aece250bba891b9251b8fb464d22f41cb36e7cae407b2bd0a870f5b72
contract address: 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1
currentAccount: 0x7b047472a4516e9697446576f8c7fcc064f967fa

# 查看当前块高
[group0]: /> getBlockNumber
1

第三步. 调用HelloWorld合约

# 调用get接口获取name变量,此处的合约地址是deploy指令返回的地址
[group0]: /> call HelloWorld 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1 get
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (string)
Return values:(Hello, World!)
---------------------------------------------------------------------------------------------

# 查看当前块高,块高不变,因为get接口不更改账本状态
[group0]: /> getBlockNumber
1

# 调用set方法设置name
[group0]: /> call HelloWorld 0x6849F21D1E455e9f0712b1e99Fa4FCD23758E8F1 set "Hello, FISCO BCOS"
transaction hash: 0x2f7c85c2c59a76ccaad85d95b09497ad05ca7983c5ec79c8f9d102d1c8dddc30
---------------------------------------------------------------------------------------------
transaction status: 0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Receipt message: Success
Return message: Success
Return value size:0
Return types: ()
Return values:()
---------------------------------------------------------------------------------------------
Event logs
Event: {}

# 查看当前块高,因为set接口修改了账本状态,块高增加到2
[group0]: /> getBlockNumber
2

# 退出控制台
[group0]: /> exit

至此,我们完成了第一条FISCO-BCOS链的搭建、控制台的配置和使用,并部署和调用了第一个合约。关于Pro版本FISCO BCOS的搭建、配置和使用请参考这里