区块链的搭建与测试
这个开源区块链相关产品的 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.crt
、sdk.crt
和sdk.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"]
- 将节点sdk目录下的
启动控制台:
/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,可以通过交互式控制台查看。 添加节点,添加一个其实就能显示同组的其他节点了,注意端口号的问题:
- 如果显示节点添加失败,第一件事应该想想,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.sh
或stop_all.sh
。 - 区块链浏览器 Server:1台服务器上
/data
目录下的bsil-browser/server
中的脚本:start.sh
或stop.sh
。此服务依赖该服务器上的 MySQL 服务与 Nginx 服务。
以上提到的资源,有些也通过百度网盘共享:
- fisco-bcos-browser-dist-20210223-MySQL8-NoWeBank:链接: https://pan.baidu.com/s/1iSVQJnpxwVL_qujwzu1coA?pwd=pnff 提取码: pnff
- console-2.7.1:链接: https://pan.baidu.com/s/10L0qG0hAIm_38aW08kr4gA?pwd=gqkz 提取码: gqkz
- bsil-bench-0.3.2:链接: https://pan.baidu.com/s/1lzcX1B7MQY03DdnEV58NeQ?pwd=3b7h 提取码: 3b7h
- 其余的好像就没什么了。