FISCO BCOS

环境配置

1
2
3
4
5
6
7
8
apt update
# JAVA环境
apt install -y default-jdk
export JAVA_HOME="/usr/lib/jvm/default-java" # 设置JAVA_HOME
# Mysql
apt install mysql-server
# Python包, 其中3.7.3 已经过测试
python3 -m pip install PyMySQL

Oracle JDK:1.8.0_141、1.8.0_202、11.0.2、14.0.2、15.0.2 Open JDK:11.0.2、14.0.2、15.0.2

要注意的是 FISCO 有 v2 和 v3,二者不兼容。

版本说明

轻便 Air 版本:采用 all-in-one 的封装模式,将所有模块编译成一个二进制(进程),一个进程即为一个区块链节点,包括网络、共识、接入等所有功能模块,采用本地 RocksDB 存储。它适用于初学者入门、功能验证、POC 产品等。

专业 Pro 版本:包括 RPC、Gateway 两个接入层的服务和多个区块链节点 Node 服务组成,其中一个 Node 服务代表一个群组,存储采用本地 RocksDB,所有 Node 共用接入层服务,接入层的两个服务可平行扩展。它适用于容量可控(T 级以内)的生产环境,能够支持多群组扩展。

大容量 Max 版本:由各个层的所有服务构成,每个服务都可独立扩展,存储采用分布式存储 TiKV,管理采用 Tars-Framework 服务。它适用于海量交易上链,需要支持大量数据落盘存储的场景。

WeBASE 子系统

WeBASE 可以看作一种降低 FISCO-BCOS 的操作门槛中间件,采用微服务架构,内部含有多个子系统,可以按需部署,并且真正实现了零耦合。

|500

节点前置服务

节点前置服务是和 FISCO-BCOS 配合使用的一个系统,可以让调用者通过 HTTP 请求和区块链节点进行交互。节点前置服务要和节点同机部署,且只能连接一个区块链节点。

应用层在实际生活中难以和节点保持长连接,因此此时节点前置服务的作用就体现出来了。应用层可以通过节点前置服务订阅链上事件,当事件触发时,可以通过 RabbitMQ 消息队列通知到应用层。

架构如下: |450

节点管理服务

WeBASE-Node-Manager 可以看作一个后端服务,负责处理 WeBASE 前端发来的请求。

WeBase 管理平台

也就是 WeBASE 中间件的前端

|375

WeBase 部署(总套件)

拉取部署脚本并安装:

1
2
3
wget https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/WeBASE/releases/download/v3.1.1/webase-deploy.zip
unzip webase-deploy.zip
cd webase-deploy

修改配置文件  common.properties

  • 修改数据库的用户名和密码
  • webase-signwebase-node-mgr 中的配置文件都要设置 useSSL=false,否则后面验证码会加载不出来。

部署:

1
2
# 部署并启动所有服务
python3 deploy.py installAll

具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 一键部署
部署并启动所有服务 python3 deploy.py installAll
停止一键部署的所有服务 python3 deploy.py stopAll
启动一键部署的所有服务 python3 deploy.py startAll
# 各子服务启停
启动FISCO-BCOS节点: python3 deploy.py startNode
停止FISCO-BCOS节点: python3 deploy.py stopNode
启动WeBASE-Web: python3 deploy.py startWeb
停止WeBASE-Web: python3 deploy.py stopWeb
启动WeBASE-Node-Manager: python3 deploy.py startManager
停止WeBASE-Node-Manager: python3 deploy.py stopManager
启动WeBASE-Sign: python3 deploy.py startSign
停止WeBASE-Sign: python3 deploy.py stopSign
启动WeBASE-Front: python3 deploy.py startFront
停止WeBASE-Front: python3 deploy.py stopFront
# 可视化部署
部署并启动可视化部署的所有服务 python3 deploy.py installWeBASE
停止可视化部署的所有服务 python3 deploy.py stopWeBASE
启动可视化部署的所有服务 python3 deploy.py startWeBASE

然后访问本地的 5000 端口即可。默认用户名 admin,默认密码Abcd1234

官方文档: https://webasedoc.readthedocs.io/zh-cn/latest/docs/WeBASE/install.html

文档地址: https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/index.html

部署 WeBase-Node-Manager

下载源码:

1
2
3
git clone https://github.com/WeBankBlockchain/WeBASE-Node-Manager.git
cd WeBASE-Node-Manager
chmod +x ./gradlew && ./gradlew build -x test

数据库配置:

1
2
3
4
5
#新建数据库:
CREATE DATABASE IF NOT EXISTS webasenodemanager DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# 修改配置文件
mv conf_template conf
cd conf

修改 application.yml

spring. datasource. username-->数据库用户名 spring. datasource. password-->数据库密码 spring. datasource. url-->修改数据库名,以及加上 useSSL=false

启动后端:

1
chmod +x start.sh && ./start.sh

忘记密码参考: https://webasedoc.readthedocs.io/zh-cn/latest/docs/WeBASE-Node-Manager/appendix.html

参考链接: https://webasedoc.readthedocs.io/zh-cn/latest/docs/WeBASE-Web/install.html

仅仅使用前置服务

前面的 WeBase 太过于庞大,事实上,我们可以只使用前置服务。

首先部署节点:

使用 Fisco-BCOS 最新链路 3.6:

1
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v3.6.0/build_chain.sh && chmod u+x build_chain.sh

启动节点:

1
bash nodes/127.0.0.1/start_all.sh

检查是否启动成功:

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

节点部署教程: https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/docs/quick_start/air_installation.html

接下来是WeBase-Front

前端服务: 注意一定是 master-3.0,否则报错

1
git clone -b master-3.0 https://github.com/WeBankBlockchain/WeBASE-Front.git

然后编译前端服务:

1
chmod +x ./gradlew && ./gradlew build -x test

然后修改配置

1
2
3
cd dist
cp -r conf_template conf
cd conf

将节点所在目录 nodes/${ip}/sdk 下的所有文件拷贝到当前 conf 目录

1
2
3
cp nodes/${ip}/sdk/* ./conf/
# 例如
cp ~/Desktop/fisco-node/nodes/127.0.0.1/sdk/* ./

然后启动 WeBase-Front

1
./start_all.sh

在浏览器访问:http://192.168.44.129:5002/WeBASE-Front/#/home

We-BASE教程见:https://webasedoc.readthedocs.io/zh-cn/lab/docs/WeBASE-Front/install.html

Python-SDK 使用

下载 SDK 并配置依赖

1
2
3
git clone https://github.com/FISCO-BCOS/python-sdk
cd python-sdk
pip install -r requirements.txt

下载 C 语言基础库

进入 bcos3sdklib,修改 download_c_libs.py 中的代理设置 (如果需要)

执行如下命令下载相关库文件

1
python download_c_libs.py

初始化环境

1
bash init_env.sh -i

所执行的操作: - 拷贝 client_config.py.template->client_config.py - 下载 solc 编译器

若没有执行以上初始化步骤,需要将 contracts/目录下的 sol 代码手动编译成 bin 和 abi 文件并放置于 contracts 目录,才可以部署和调用相应合约。

然后将下载的 solc 路径进行配置:

client_config.py:

1
2
solc_path = "bin/solc/v0.4.25/solc"
gm_solc_path = "bin/solc/v0.4.25/solc-gm"

配置 bcos3_sdk_config.ini

拷贝 bcos3_sdk_config_sample.ini-->bcos3_sdk_config.ini

拷贝证书

1
cp ~/Desktop/fisco/nodes/127.0.0.1/sdk/* ~/Desktop/python-sdk/bcos3sdklib/

注意这里的 bcos3sdklib 路径和 bcos3_sdk_config.ini 中的路径要保持一致。

测试

部署 HelloWorld.sol:

1
python console3.py deploy HelloWorld

调用 HelloWorld:

1
python console3.py call HelloWorld 0xe16469be7721563d4d6a703932058d12ca2ca94c get

参考: - https://blog.csdn.net/weixin_43491496/article/details/134476274 - https://github.com/FISCO-BCOS/python-sdk

Java-SDK 使用

配置 IDEA

添加如下 Maven 依赖:

1
2
3
4
5
6
7
8
9
10
11
<dependency>  
<groupId>org.fisco-bcos.java-sdk</groupId>
<artifactId>fisco-bcos-java-sdk</artifactId>
<version>3.6.0</version>
</dependency>
<!-- 下面的依赖只是为了去掉警告-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>

拷贝证书

nodes/127.0.0.1/sdk 下的文件拷贝到 resources/conf 目录

创建配置文件

拷贝官网的 config-example.toml 文件到 resource 目录。修改其中的节点 IP。

导出 JAVA 代码

在 WeBASE-Front 界面导出 Java 代码 (单文件)。

调用合约

1
2
3
4
5
6
7
8
9
10
11
12
13
String configFile = "config-example.toml";  
BcosSDK sdk = BcosSDK.build(configFile);
// 为群组group初始化client
Client client = sdk.getClient("group0");
CryptoKeyPair cryptoKeyPair = client.getCryptoSuite().getCryptoKeyPair();
//合约地址
SmartLink sc = new SmartLink("37a44585bf1e9618fdb4c62c4c96189a07dd4b48", client, cryptoKeyPair);
CryptoSuite cryptoSuite = client.getCryptoSuite();
TransactionDecoderInterface decoder = new TransactionDecoderService(cryptoSuite.getHashImpl(), client.isWASM());
String abi = "";
TransactionReceipt transactionReceipt = sc.dispatchRequest("调用参数");
Map<String, List<List<Object>>> events = decoder.decodeEvents(abi, transactionReceipt.getLogEntries());
System.out.println(events);

与 Python-SDK 对比

Java 在小型项目上的灵活度远不如 Python,代码过于臃肿,造成效率低下。例如多线程发送 500 个交易,Python 下只需要两秒多,而 Java 需要七秒多。

附录

WeBASE 端口说明

节点管理子系统:端口 5001

节点前置子系统:端口 5002

签名服务子系统:端口 5004

节点 p2p:端口 30300

节点链上链下:端口 20200

节点 RPC 端口:8545

[[FISCO BCOS/image-20240418123418331.png]]

交易流程

  • 交易生成:当用户的请求给到客户端后,客户端会构建出一笔交易,包括以下信息
    • 接收地址:若是部署合约的交易,则接受地址为空。
    • 交易相关的数据
    • 交易签名:利用用户的私钥进行签名 然后客户端会向交易填充一些必要字段,如防重放的交易 ID 等。然后客户端通过 RPC 信道将交易发给节点。
  • 交易池:节点首先验证交易是否合法,然后验证交易是否重复出现过,最后通过验证则加入到交易池,否则丢弃交易。
  • 交易广播:在将交易缓存在交易池的同时,还会将交易广播至已知的其他节点。为了避免出现广播风暴问题,对于从其它节点转发来的交易,节点会随机选取 25%的节点再次广播。
  • 交易打包:Sealer 线程负责从交易池中按照先进先出的顺序取出一定数量的交易,组装成共识区块,随后待共识区块会被发往各个节点进行处理。
  • 交易执行:节点在收到区块后,会进行执行。若是预编译合约代码,则将直接调用 C++,否则将交易交给 EVM 执行。交易执行的结果 (成功或者失败) 会在交易回执中返回。
  • 交易共识:使用 PMFT 算法,各个节点独立执行相同的区块,随后交换各自的执行结果,若发现 2/3 的节点结果相同,则出块。
  • 交易落盘:共识出块后,节点需要将区块中的交易以及执行结果写入硬盘,并更新区块高度与区块哈希的映射表。用户可以通过交易哈希查询回执信息。

FISCO BCOS
https://d4wnnn.github.io/2024/04/16/Blockchain/FISCO BCOS/
作者
D4wn
发布于
2024年4月16日
许可协议