网络上很少有全面详细的区块链系统仿真的代码和讲解,从头开始真的很难。

现在先把叶之秋大神分享的BFT-SMaRt 性能测试实验给复现一下,遇到的困难…不计其数。链接如下:共识和区块链实验-以 BFT-SMaRt 和 Fabric 为例 – 知乎

Ubuntu和docker部分省略。

初始化环境

拉取Ubuntu18.04镜像

docker run -it --rm ubuntu:18.04 bash

安装git和ant

apt update apt install git -y apt install ant -y 
git clone https://github.com/bft-smart/library.git cd library git checkout 0f2d407 ant 

重要步骤:注释掉 /usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security 中的下面这3行,不然会报错。(Java调用ssl异常,javax.net.ssl.SSLHandshakeException: No appropriate protocol)

apt updateapt install vimvim /usr/lib/jvm/java-11-openjdk-amd64/conf/security/java.security#注释下面这三行,记得看清楚内容,行数不一定准确# 704 # jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \# 705 # DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \# 706 # include jdk.disabled.namedCurves

此时网络环境初始化步骤已经结束,笔者建议此时的容器可以保存成镜像,后续使用避免重来。

之后在ubuntu中打开四个终端,进入同一个docker容器的终端作为四个节点。

docker exec -it 7e9117c6bbb2 /bin/bash #容器id自拟

之后在新打开的四个终端内单独配置组网设置:

./runscripts/smartrun.sh bftsmart.demo.counter.CounterServer 0./runscripts/smartrun.sh bftsmart.demo.counter.CounterServer 1./runscripts/smartrun.sh bftsmart.demo.counter.CounterServer 2./runscripts/smartrun.sh bftsmart.demo.counter.CounterServer 3 # 等四个节点都输出Ready to process operations 后,运行 client./runscripts/smartrun.sh bftsmart.demo.counter.CounterClient 1001 2 100

注:四个终端都配置好后才显示— Ready to process operations成功页面

client正常运行:

测试 BFT-SmaRt 的 throughput 和 latency

根据叶之秋大神笔记做

节点配置成功
延迟和吞吐量性能测试
更改节点数量

在config/hosts.config文件中增加一个节点。

4 127.0.0.1 11040 11041

修改config/hosts.config:

############################################### Replication Algorithm Configurations ################################################Number of servers in the group system.servers.num = 5################################################## Reconfiguration Configurations ###################################################Replicas ID for the initial view, separated by a comma.# The number of replicas in this parameter should be equal to that specified in 'system.servers.num'system.initial.view = 0,1,2,3,4##163行

后续未实现