目录

区块链的搭建与测试

目录

这个开源区块链相关产品的 bug 可真的多……

[toc]

  • lspci | grep -i nvidia
  • cat /proc/cpuinfo | grep model\ name
  • cat /proc/meminfo | grep MemTotal
Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz   (48)
MemTotal:       98622476 kB    98.622476 GB
NVIDIA Corporation TU104GL [Tesla T4]    (2)
Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz    (64)
MemTotal:       527751008 kB    527.751008 GB
NVIDIA Corporation TU104GL [Tesla T4]    (2)
Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz    (40)
MemTotal:       263572068 kB    263.572068 GB
NVIDIA Corporation Device 2204    GeForce RTX 3090
Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz    (40)
MemTotal:       263571400 kB    263.5714 GB
NVIDIA Corporation Device 2204    GeForce RTX 3090
Intel(R) Core(TM) i9-10980XE CPU @ 3.00GHz    (36)
MemTotal:       263602228 kB    263.602228 GB
NVIDIA Corporation Device 2204    GeForce RTX 3090  (2)
  • 10.130.159.219:2个节点
  • 10.130.159.221:1个节点
  • 10.130.159.222:1个节点
  • 10.130.159.223:1个节点

共计5个节点,4台服务器。

  • 10.130.159.220:用于测试TPS、交互式控制台、区块链浏览器。

ipconf:

10.130.159.219:2 BUAA 1 30300,20200,8545
10.130.159.221:1 BUAA 1 30300,20200,8545
10.130.159.222:1 BUAA 1 30300,20200,8545
10.130.159.223:1 BUAA 1 30300,20200,8545

./build_chain.sh -f ipconf -i -v 2.6.0-i参数非常关键:If set -i, listen 0.0.0.0】

  • 我把版本降级了,曾经的版本用着没啥大问题,现在的嘛,不确定

所有区块链相关文件,均存放在每台服务器的:/data 目录下。

对每台服务器,启动其上的所有节点。

启动节点,例如服务器1的2个节点:/data/10.130.159.219/start_all.sh

可使用命令检查进程:ps -ef | grep -v grep | grep fisco-bcos

可使用命令查看某个节点连接了其他多少个节点,如服务器1上的node0连接到了多少个节点(结果是4,加它自己总共是5):tail -f /data/10.130.159.219/node0/log/log* | grep connected

使用区块链交互式控制台 bsil-console 。

改了个 LOGO,这个是我之前就改好了的,版本2.7.1,幸好找到原来的文件了,就不用重新弄了。

  • 区块链节点和证书的配置:

    • 将节点sdk目录下的ca.crtsdk.crtsdk.key文件拷贝到conf目录下。
    • conf目录下的config-example.toml文件重命名为config.toml文件。配置config.toml文件,其中添加注释的内容根据区块链节点配置做相应修改。提示:如果搭链时设置的channel_listen_ip(若节点版本小于v2.3.0,查看配置项listen_ip)为127.0.0.1或者0.0.0.0,channel_port为20200, 则config.toml配置不用修改。
    • FISCO-BCOS 2.5及之后的版本,添加了SDK只能连本机构节点的限制,操作时需确认拷贝证书的路径,否则建联报错。

    配置文件修改为:

    peers=["10.130.159.219:20200", "10.130.159.219:20201", "10.130.159.221:20200", "10.130.159.222:20200", "10.130.159.223:20200"]

启动控制台:

/data/bsil-console/start.sh

然后就可以输入命令交互,如getPeers 会显示其他四个节点,控制台本身会与某个节点连接。

这个也坑的不行,bug特特特多。

2021.3.23: 关于 Server 端:

  • 我发现在 git 的这个Revision Number :5c9a4cc9275c6b086d998187660058200e8e6493 ,之后添加了 webank 的依赖,也就是微众银行的一个依赖包,这个包里面有个 BlockCheckService 类,里面有个方法 checkTimeOut 会导致咱们的程序出现 ERROR ,提示什么 “Block {} sync block timeout!!, the depot_time is {}, and the threshold time is {}"。
  • 因此,我决定再降低版本,就用 5c9a4cc9275c6b086d998187660058200e8e6493 这个版本重新编译,最终的编译版本有这样几个特性,一是2021年2月23日的版本,二是支持MySQL 8.0,三是没有引入 WeBank 依赖而产生错误。

2021.3.22: 关于 Server 端:

  • 我把版本降级了,使用的 v2.2.3 (2021年4月8日)的版本,也就是添加 mysql 8.0 支持的第一个版本,这个编译好的版本从哪里下载呢,需要看它一键部署的脚本,从那个里面拿到地址,就是:https://github.com/FISCO-BCOS/fisco-bcos-browser/blob/master/deploy/common.properties ,找到了,修改后访问:https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/fisco-bcos-browser/releases/download/v2.2.3/fisco-bcos-browser.zip 。【这个版本出现了问题,引入了 WeBank 依赖造成】
  • 此外,并不需要按他说的执行 script 里面的啥啥啥,建个空的数据库就可以啦,其余的事情后端会做。
  • 前端页面添加节点的问题,有人说(某个issue)添加多个会出现问题,所以我最后还是只添加了一个节点

手动搭建。

在 localhost 上登录 MySQL服务器,输入sudo mysql即可,因为这是 MySQL 8.0 的新规定。

然后,我创建了一个新的超级用户用以远程登录,用户名 dell 密码 Passw0rd!

CREATE USER 'dell'@'%' IDENTIFIED BY 'Passw0rd!';
GRANT ALL PRIVILEGES ON *.* TO 'dell'@'%';
flush privileges;

然后创建bsil数据库:

CREATE DATABASE IF NOT EXISTS bsil DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

然后进入 /data/bsil-browser/server/script/browser.sh修改配置:

DBUSER="dell"
PASSWD="Passw0rd!"
DBNAME="bsil"

然后运行数据库脚本:bash browser.sh 127.0.0.1 3306。(不管新旧版本都不需要……)

修改配置 /data/bsil-browser/server/conf/application.yml

    url: jdbc:mysql://127.0.0.1:3306/bsil?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
    username: "dell"
    password: "Passw0rd!"

服务的启动与停止:

cd /data/bsil-browser/server
sh start.sh
sh stop.sh
sh status.sh

它这个版本(2.2.5)的java程序中sql语句写的就有问题,在 TransactionMapper 中更改(你看 SELECT 里面根本没有ORDER BY的字段,而且返回类型跟 SELECT 都不一致……),我都改不过来了,还是降低版本吧。

<select id="getTransFormByGroup" parameterType="java.lang.Integer"
            resultType="org.bcos.browser.entity.dto.Transaction">
        SELECT  DISTINCT t.`from` as transFrom FROM tx_raw_data_#{groupId} t
        WHERE NOT EXISTS (
        SELECT 1 FROM tb_chain_user WHERE group_id = #{groupId} AND address = t.`from`
        ) ORDER BY t.block_height DESC,t.tx_index DESC
    </select>

换了 LOGO,删除无关页面,注意重新编译的时候,先使用 dev 开发会报错但有提示如何解决,如果直接build则没有任何提示。

部署的话,就是 Nginx 部署一个网站,不多说。

 server {
  listen       5100 default_server; 
  server_name  10.130.159.220; 
  location / {
    root    /data/bsil-browser/web; 
    index  index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

  location /api {
    proxy_pass    http://127.0.0.1:5101/; 
    proxy_set_header		Host				$host;
    proxy_set_header		X-Real-IP			$remote_addr;
    proxy_set_header		X-Forwarded-For		$proxy_add_x_forwarded_for;
  }
}

然后,访问:10.130.159.220:5100 即可。

添加群组,注意我们这里群组的 ID 是1,可以通过交互式控制台查看。 添加节点,添加一个其实就能显示同组的其他节点了,注意端口号的问题:

https://cdn.jsdelivr.net/gh/dfface/img0@master/2022/03-21-gEzCnp.png

  • 如果显示节点添加失败,第一件事应该想想,rpc监听是否为 0.0.0.0 ?

这个就非常坑了,版本不匹配就根本做不出来,会出奇奇怪怪的bug,这一点即使是官方也会犯错,比如这个issue就承认了这个愚蠢的bug:“secp256k1”: “^3.8.0”

现在 hyperledger 已经出了到 0.4.x 的版本了,但出于之前用 0.3.2 的版本没有任何问题,于是继续使用老版本,可以参考这篇文章:压力测试指南

安装过程:

cd /data/bsil-bench
npm install --only=prod @hyperledger/caliper-cli@0.3.2
npm install
npx caliper bind --caliper-bind-sut fisco-bcos --caliper-bind-sdk latest

安装的时候可能会安装不上,那是因为服务器没法连上外网,被墙了。

我一般会开启 git 的代理:

git config --global http.proxy 'socks5://10.130.158.145:7890'
git config --global https.proxy 'socks5://10.130.158.145:7890'

测试:

npx caliper launch master \
    --caliper-workspace . \
    --caliper-benchconfig benchmarks/transfer/solidity/config.yaml \
    --caliper-networkconfig network/fisco-bcos.json

出结果啦,同时访问区块链浏览器也有有一定的展现:

2022.03.21-23:23:14.547 info  [caliper] [report-builder] 
+----------+-------+------+-----------------+-----------------+-----------------+-----------------+------------------+
| Name     | Succ  | Fail | Send Rate (TPS) | Max Latency (s) | Min Latency (s) | Avg Latency (s) | Throughput (TPS) |
|----------|-------|------|-----------------|-----------------|-----------------|-----------------|------------------|
| addUser  | 10000 | 0    | 4972.7          | 0.51            | 0.10            | 0.30            | 4484.3           |
|----------|-------|------|-----------------|-----------------|-----------------|-----------------|------------------|
| transfer | 10000 | 0    | 5000.0          | 0.62            | 0.14            | 0.33            | 4401.4           |
+----------+-------+------+-----------------+-----------------+-----------------+-----------------+------------------+

一般可以通过 vi benchmarks/transfer/solidity/config.yaml 调整发送的速率,默认可使用 transfer 或 helloworld 两个基准测试。

请看 word 文档。

主要针对重启计算机之后,或者其他情况需要对服务进行启停:

  • 区块链:4台服务器上的 /data 目录下有相关文件,进入并执行脚本 start_all.shstop_all.sh
  • 区块链浏览器 Server:1台服务器上 /data 目录下的 bsil-browser/server 中的脚本:start.shstop.sh。此服务依赖该服务器上的 MySQL 服务与 Nginx 服务。

以上提到的资源,有些也通过百度网盘共享: