一 搭建单群组FISCO BCOS联盟链

在进行以下所有操作前,请先检查自己虚拟机的硬件和系统要求。

硬性要求

  • FISCO BCOS支持x86_64和aarch64(ARM)架构的CPU

  • 由于节点多群组共享网络带宽、CPU和内存资源,因此为了保证服务的稳定性,一台机器上不推荐配置过多节点。

下表是单群组单节点推荐的配置,节点耗费资源与群组个数呈线性关系,您可根据实际的业务需求和机器资源,合理地配置节点数目。

我们可以使用开发部署工具 build_chain.sh去搭链,这个脚本依赖于openssl、curl

openssl 和 curl 都是常用的命令行工具,它们都可以用于加密、解密、传输数据等操作,但它们的作用和使用场景略有不同。 openssl 是一个强大的命令行工具,提供了丰富的加密和解密功能,可以用于生成密钥、加密数据、签名、验证签名、解密数据等操作。

openssl 可以用于生成 RSA、DSA、ECDSA 等多种密钥,并且支持多种加密算法和哈希算法。此外,openssl 还可以用于生成 X.509 证书、PKCS#12 证书等。使用 openssl 需要了解相关的加密知识和算法,否则不太容易上手。

curl 的作用是发送 HTTP 请求和接收 HTTP 响应,它也可以用于加密和解密数据,但它的加密功能比较简单,通常只用于基本的 HTTP 身份验证和 SSL/TLS 加密。curl 支持多种 HTTP 方法和协议,如 HTTP/1.0、HTTP/1.1、HTTP/2 等。此外,curl 还支持 FTP、FTPS、SMB、SMBS 等多种协议。使用 curl 可以方便地测试和调试 HTTP 请求和响应,也可以用于自动化脚本中。

总的来说,openssl 更适合加密和解密数据操作,需要更多的加密知识和算法知识,而 curl 更适合发送 HTTP 请求和接收 HTTP 响应操作,适合测试和调试 HTTP 请求和响应。

首先我们需要指定一个根目录,这里我指定的是fisco

检查是否安装openssl、java

fisco$ openssl version

若输出以下内容则表示openssl依赖存在
OpenSSL 1.1.1n 15 Mar 2022

若没有这个依赖则需要自己手动去下载

centos系统
sudo yum install -y openssl openssl-devel

  • sudo表示以管理员权限运行命令(需要输入管理员密码);
  • yum是 YUM 软件包管理器;
  • install是安装命令;
  • -y表示在安装时自动确认,即不要求用户输入确认;

ubuntu系统
sudo apt install -y openssl curl

  • sudo表示以管理员权限运行命令(需要输入管理员密码);
  • apt是 APT 软件包管理器;
  • install是安装命令;
  • -y表示在安装时自动确认,即不要求用户输入确认;

fisco$ java -verison

若输出以下内容则表示jdk存在
java version “1.8.0_291”
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

搭建一条4节点的FISCO BCOS链

执行下面命令前,请确保build_chain.sh脚本在当前目录下、机器的30300~30303,20200~20203,8545~8548端口没有被占用。

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

执行成功后会输出以下内容
Checking fisco-bcos binary…
Binary check passed.
==============================================================
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] Execute the download_console.sh script in directory named by IP to get FISCO-BCOS console.
e.g. bash /home/ubuntu/fisco/nodes/127.0.0.1/download_console.sh
==============================================================
[INFO] FISCO-BCOS Path: bin/fisco-bcos
[INFO] Start Port: 30300 20200 8545
[INFO] Server IP : 127.0.0.1:4
[INFO] Output Dir: /home/ubuntu/fisco/nodes
[INFO] CA Key Path: /home/ubuntu/fisco/nodes/cert/ca.key
==============================================================
[INFO] All completed. Files in /home/ubuntu/fisco/nodes

如果没有build_chian.sh脚本则需要自己手动去下载

## 下载脚本
fisoc$ curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh

Bash:Shell解释器。build_chain.sh是一个Bash脚本,所以我们需要用到这个Shell去解释执行这个脚本

build_chain.sh: 是一个用于快速搭建 FISCO BCOS 联盟链的开发部署工具。使用该工具可以帮助用户快速生成一条链中节点的配置文件。

-l:指定IP地址(这里指定的是127.0.0.1)

“:4”:表示搭建四个节点

-p 30300,20200,8545:表示区块链节点的监听端口号,多个端口号之间用逗号分隔。在本例中,它指定了三个端口号,分别是 30300(链的监听端口号)、20200 (数据库的连接端口号)和 8545(WebSocket的监听端口号)。这些端口号是用于区块链节点之间的通信和交互的。在实际使用中,需要根据实际情况修改这些端口号。

节点搭完之后,会在当前的目录下生成一个nodes文件,我们需要进入到nodes/127.0.0.1/目录下输入下面命令去启动所有节点

fisco/nodes/127.0.0.1$ bash start_all.sh

启动成功会输出类似下面的内容
try to start node0
try to start node1
try to start node2
try to start node3
node1 start successfully
node2 start successfully
node0 start successfully
node3 start successfully

start_all.sh:启动所有节点的Bash脚本,它会遍历并启动同时有config.ini和start的脚本文件

检查进程是否启动

fisco/nodes/127.0.0.1$ ps -ef | grep -v grep | grep fisco-bcos

执行成功后会输出以下内容
fisco5453 1 1 17:11 pts/000:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini
fisco5459 1 1 17:11 pts/000:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini
fisco5464 1 1 17:11 pts/000:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini
fisco5476 1 1 17:11 pts/000:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini

ps -ef是 Linux 系统中用于列出当前运行进程信息的命令。

|是管道符,用于将前一个命令的输出作为后一个命令的输入。

grep -v grep是过滤命令,用于去除包含 “grep” 关键字的行。

grep fisco-bcos是关键字搜索命令,用于查找包含 “fisco-bcos” 关键字的行。

因此,整个命令ps -ef | grep -v grep | grep fisco-bcos将列出所有当前运行进程的信息,并去除包含 “grep” 关键字的行,然后仅显示包含 “fisco-bcos” 关键字的行。

检查日志输出

fisco/nodes/127.0.0.1$ tail -f nodes/127.0.0.1/node0/log/log* | grep connected

正常情况会不停地输出连接信息,从输出可以看出node0与另外3个节点有连接
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:tail命令的选项,表示追踪文件并实时输出文件末尾的内容。

nodes/127.0.0.1/node0/log/log*:指定要追踪的文件路径和文件名,表示追踪该目录下以“log”结尾的所有文件。

|:管道符,用于将前一个命令的输出作为后一个命令的输入。

grep connected:表示过滤出包含“connected”字符串的行。

检查是否存在共识

fisco/nodes/127.0.0.1$ tail -f nodes/127.0.0.1/node0/log/log* | grep +++

正常情况会不停输出++++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…

在 FISCOBCOS 中,共识进程会不断地输出 “+++”, 这表示进程正在运行并且能够与其他节点通信。因此,如果这个符号不停地输出,就表示共识进程正在正常运转并且能够与其他节点通信。这个符号通常被用来检查共识进程是否正常工作,以及是否能够与其他节点通信。需要注意的是,如果这个符号没有输出,可能表示共识进程没有正常工作,需要进一步排查问题。

二 配置及使用控制台

准备依赖

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

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

获取控制台

fisco$ curl -LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh

下载完成后就可以对控制台压缩包进行解压
fisco$ tar -zxvf console.tar.gz

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

拷贝控制台配置文件、证书

拷贝配置文件
fisco$ cp -n console/conf/config-example.toml console/conf/config.toml

拷贝sdk证书
fisoc$ cp -r nodes/127.0.0.1/sdk/* console/conf/

在Linux中,cp是一个命令行工具,用于复制文件和目录。而-n是一个选项,用于表示“不覆盖”。

具体地说,当使用cp命令复制文件时,如果目标文件已经存在,那么覆盖目标文件将是一个潜在的问题。通过使用-n选项,可以防止覆盖已经存在的目标文件,而是仅仅打印出一个错误消息,并提示用户是否需要覆盖。

-rcp命令的一个选项,用于递归地复制整个目录树。这意味着,它将复制指定的目录及其所有子目录和文件,包括所有文件和目录的权限、所有权、时间戳等。当使用cp -r选项时,它会自动处理目录和文件的复制,并且不会询问是否要覆盖已存在的文件。

启动控制台

fisco/console$ bash start.sh

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

用控制台获取信息

# 获取客户端版本[group:1]> getNodeVersionClientVersion{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]> getPeers[PeerInfo{nodeID='c1bd77e188cd0783256ee06838020f24a697f9af785438403d3620967a4a3612e3abc4bbe986d1e9dddf62d4236bff0b7d19a935a3cd44889f681409d5bf8692',ipAndPort='127.0.0.1:30302',agency='agency',topic=[],node='node2'},PeerInfo{nodeID='7f27f5d67f104eacf689790f09313e4343e7887a1a7b79c31cd151be33c7c8dd57c895a66086c3c8e0b54d2fa493407e0d9646b2bd9fc29a94fd3663a5332e6a',ipAndPort='127.0.0.1:57266',agency='agency',topic=[_block_notify_1],node='node1'},PeerInfo{nodeID='862f26d9681ed4c12681bf81a50d0b8c66dd5b6ee7b0b42a4af12bb37b1ad2442f7dcfe8dac4e737ce9fa46aa94d904e8c474659eabf575d6715995553245be5',ipAndPort='127.0.0.1:30303',agency='agency',topic=[],node='node3'}]
[group:1]>

部署及调用合约

为了方便用户快速体验,控制台console中给内置了一些简单的合约示例,我的根目录是fisco,所以我这里的路径是:fisco/console/contracts/solidity,我们把这里面的HelloWorld.sol作为本章的示例

HelloWorld的合约内容如下:

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;
}
}

部署合约

# 在控制台输入以下指令 部署成功则返回合约地址[group:1]> deploy HelloWorldtransaction hash: 0xd0305411e36d2ca9c1a4df93e761c820f0a464367b8feb9e3fa40b0f68eb23facontract address:0xb3c223fc0bf6646959f254ac4e4a7e355b50a344

调用合约

# 查看当前块高[group:1]> getBlockNumber1# 调用get接口获取name变量 此处的合约地址是deploy指令返回的地址[group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get---------------------------------------------------------------------------------------------Return code: 0description: transaction executed successfullyReturn message: Success---------------------------------------------------------------------------------------------Return values:["Hello,World!"]---------------------------------------------------------------------------------------------# 查看当前块高,块高不变,因为get接口不更改账本状态[group:1]> getBlockNumber1# 调用set设置name[group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 set "Hello, FISCO BCOS"transaction hash: 0x7e742c44091e0d6e4e1df666d957d123116622ab90b718699ce50f54ed791f6e---------------------------------------------------------------------------------------------transaction status: 0x0description: transaction executed successfully---------------------------------------------------------------------------------------------OutputReceipt message: SuccessReturn message: Success---------------------------------------------------------------------------------------------Event logsEvent: {}# 再次查看当前块高,块高增加表示已出块,账本状态已更改[group:1]> getBlockNumber2# 调用get接口获取name变量,检查设置是否生效[group:1]> call HelloWorld 0xb3c223fc0bf6646959f254ac4e4a7e355b50a344 get---------------------------------------------------------------------------------------------Return code: 0description: transaction executed successfullyReturn message: Success---------------------------------------------------------------------------------------------Return values:["Hello,FISCO BCOS"]---------------------------------------------------------------------------------------------# 退出控制台[group:1]> quit