目录

Caliper:BCOS 性能测试教程及自动化测试编程指南

目录

安装 vmware workstation/fusion 略。

说明:可以安装 桌面版,这样方便复制一下指令、拷贝文件等,也可以利用本地电脑的终端通过 ssh 链接虚拟机。一个虚拟机配置示例如下:

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200928165220552-SJFU1e.png

看官网教程,比较简单: https://docs.docker.com/engine/install/ubuntu/

【多物理机情况下设置】

sudo service docker stop 先停服务。

创建/etc/docker/daemon.json文件:

{
  "hosts" : ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

“unix:///var/run/docker.sock”:UNIX套接字,本地客户端将通过这个来连接Docker Daemon; tcp://0.0.0.0:2375,TCP套接字,表示允许任何远程客户端通过2375端口连接Docker Daemon.

使用sudo systemctl edit docker新建或修改/etc/systemd/system/docker.service.d/override.conf

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

重启服务:

sudo systemctl daemon-reload
sudo systemctl restart docker.service

此时能够在另一台机器上通过远程连接访问本机的Docker Daemon服务,例如:

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200928165131712-stEkHT.png

【本文档不涉及,无需安装】

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

如果出现 sock 文件权限问题,改就好了:sudo chmod 666 /var/run/docker.sock

注意安装 NodeJS 8 (LTS), 9, 或 10 (LTS),Caliper尚未在更高的NodeJS版本中进行过验证。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
source ~/.$(basename $SHELL)rc
nvm install 8
nvm use 8
npm install -g node-gyp

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200928203936183-gBBmbV.png

安装 nvm 可能会遇上无法下载的问题,该脚本我已经下载好了可以复制下保存为 .sh 文件并 bash ./nvm-install.sh (千万别用sudo)运行。

先安装依赖 python2, make, g++ 和git。

sudo apt install python make g++ git
npm install --only=prod @hyperledger/caliper-cli@0.2.0
npx caliper --version
npx caliper bind --caliper-bind-sut fisco-bcos --caliper-bind-sdk latest

注意,这里的版本是:0.2.0 ,有一些bug需要更改caliper源代码解决:https://github.com/hyperledger/caliper/pull/677/files、https://github.com/hyperledger/caliper/pull/647/files,完成之后可以快速体验测试(注意如果基准测试的配置文件有问题可能需将 test.workers 改为 test.clients,如果仍然报错则可能需要删除 monitor 下 process 相关内容,仅保留 docker):

git clone https://github.com/vita-dounai/caliper-benchmarks.git
npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/helloworld/config.yaml  --caliper-networkconfig networks/fisco-bcos/4nodes1group/fisco-bcos.json

这个快速测试脚本会使用docker在本地自动部署及运行4个互连的节点组成的链,–caliper-workspace:用于指定caliper-cli的工作目录,如果没有绑定工作目录,可以通过该选项动态指定工作目录; –caliper-benchconfig:用于指定测试配置文件,测试配置文件中包含测试的具体参数,如交易的发送方式、发送速率控制器类型、性能监视器类型等; –caliper-networkconfig:用于指定网络配置文件,网络配置文件中会指定Caliper与受测系统的连接方式及要部署测试的合约等。

安装 0.2.0 版本进行测试,遇到的问题基本在上面都提到了,最后成功完成测试,附录B给了能在 0.2.0 版本下成功测试的caliper基准测试配置文件和网络配置文件。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200929163137270-vLk2nd.png

这之后可以看看 caliper 0.2.0 基准测试文件的配置


npm install --only=prod @hyperledger/caliper-cli@0.3.2
npx caliper --version
npx caliper bind --caliper-bind-sut fisco-bcos --caliper-bind-sdk latest

此时之前安装的 0.2.0 版本可以删掉。我不太想使用 Caliper 的老旧版本 0.2.0,而想安装最新版本:0.3.2(原因是要改源代码的那些问题都不需要,毕竟最新版可能还做了一些优化)。如果安装的 caliper 是最新的 0.3.2 ,也需要好好读 Caliper 0.3.2 的文档。

测试时,需要对benchmark仓库中提供的基准测试配置文件做些更改才能使用,主要有:

  • test.clients 改为 test.workers
  • rounds.txNumber 后的数组改为数值(去 -
  • rounds.rateControl 后的数组改为层次结构,类似json这种意思(去 -
  • monitor.process 下还增加一个层次 processesmonitor.process.processes
  • monitor.docker.name改为 monitor.docker.containers

改好的基准测试文件可参见 附录C,此例的网络配置文件同 附录B 无需更改。

注意命令改成了 npx caliper launch master,命令的参数不变。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200929180136592-xm49cr.png

目前看到的不足是 process 监控获取不到,可能是 BCOS 还没有对此做更新,我们也并不需要此监控。

手动测试时,尝试了两个版本,测试脚本选择了 0.3.2 的版本(因 0.2.0 还需要在源码上做更改)。

关于节点文件组织结构需要知道:

  • cert文件夹下存放链的根证书和机构证书。
  • 以IP命名的文件夹下存储该服务器所有节点相关配置、fisco-bcos可执行程序、SDK所需的证书文件。
  • 每个IP文件夹下的node*文件夹下存储节点所需的配置文件。其中config.ini为节点的主配置,conf目录下存储证书文件和群组相关配置。配置文件详情,请参考这里。每个节点中还提供start.shstop.sh脚本,用于启动和停止节点。
  • 每个IP文件夹下的提供start_all.shstop_all.sh两个脚本用于启动和停止所有节点。

Fisco BCOS节点使用多个配置文件:

  • config.ini:主配置文件,主要配置RPC、P2P、SSL证书、账本配置文件路径、兼容性等信息。
  • group.group_id.genesis:群组配置文件,群组内所有节点一致,节点启动后,不可手动更改该配置。主要包括群组共识算法、存储类型、最大gas限制等配置项。
  • group.group_id.ini:群组可变配置文件,包括交易池大小等,配置后重启节点生效

关于 build_chain.sh工具(该脚本用于快速生成一条链中节点的配置文件)需要知道:

  • -f选项通过使用一个指定格式的ipconfig配置文件,支持创建各种复杂业务场景FISCO BCOS链。 配置文件按行分割,每一行表示一个服务器,格式为IP:NUM AgencyName GroupList,每行内的项使用空格分割,不可有空行IP:NUM表示机器的IP地址以及该机器上的节点数。AgencyName表示机构名,用于指定使用的机构证书。GroupList表示该行生成的节点所属的组,以,分割。例如192.168.0.1:2 agency1 1,2表示ip192.168.0.1的机器上有两个节点,这两个节点属于机构agency1,属于group1和group2。
  • 建议测试时使用-T-T开启log级别到DEBUG。
  • -d选项使用docker模式搭建FISCO BCOS。docker run -d --rm --name ${nodePath} -v ${nodePath}:/data --network=host -w=/data fiscoorg/fiscobcos:latest -c config.ini
  • -s选项是有参数选项,参数为db名,目前支持RocksDB、mysql(需要在群组ini文件中配置数据库相关信息)、Scalable。默认使用rocks。
  • -c选项是有参数选项,参数为共识算法类型,目前支持PBFT、Raft、rPBFT。默认共识算法是PBFT。

1、使用 build_chain.sh 工具生成节点配置,例如:单机7节点,其 ipconfig 文件内容及使用的命令如下:

127.0.0.1:7 yuhan 1

bash build_chain.sh -T -f ipconfig -d

此处可变参数注意:

  • 共识算法可更改:-c Raft
  • 数据库类型可更改:-s scalable ,mysql 需额外配置参数
  • 节点总数可更改:ipconfig
  • 网络拓扑结构可更改:ipconfig

命令执行完毕之后,生成了nodes文件夹,内部结构如 “关于节点文件组织结构需要知道:”所述:

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200930152420570-CYKIXZ.png

2、这一步可更改共识节点(主要是减少,因为默认就是全部节点参与共识):

群组系统配置一般位于节点的conf目录下.genesis后缀配置文件中,node.idx:共识节点列表,配置了参与共识节点的Node ID,节点的Node ID可通过${data_path}/node.nodeid文件获取(其中${data_path}可通过主配置config.ini[network_security].data_path配置项获取)

/Users/yuhanliu/Library/Application%20Support/typora-user-images/image-20200930152901615.png

在更改了某节点下的群组系统配置文件之后要将其复制到所有节点文件夹中以保持一致(genesis配置要求群组内所有节点一致),例如我删掉了 node4-6 的node id,即node0-3 四个节点为共识节点。

cp node0/conf/group.1.genesis node1/conf/group.1.genesis
cp node0/conf/group.1.genesis node2/conf/group.1.genesis
cp node0/conf/group.1.genesis node3/conf/group.1.genesis
cp node0/conf/group.1.genesis node4/conf/group.1.genesis
cp node0/conf/group.1.genesis node5/conf/group.1.genesis
cp node0/conf/group.1.genesis node6/conf/group.1.genesis

/Users/yuhanliu/Library/Application%20Support/typora-user-images/image-20200930153509645.png

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20200930153703816-ITeh4v.png

此处可变参数注意(凡是 genesis 文件可更改的都可以更改):

  • 指定共识节点的数量:group.1.genesis 配置文件consensus下更改node id
  • 指定使用的共识算法:group.1.genesis 配置文件consensus下更改consensus_type
  • 指定单个块最大交易数:group.1.genesis 配置文件consensus下更改max_trans_num
  • 指定state的类型:group.1.genesis 配置文件state下更改type

此前通过 build_chain.sh 生成了区块链网络配置信息,要使caliper知晓区块链网络情况还需要写一个网络配置文件——fisco-bcos.json,此配置文件描述了节点如何在网络中相互交互以及基准测试使用了哪些智能合约。

附录 B 中对网路配置也给了一个示例文件,其中有一些参数:

  • caliper.command.start:启动Caliper时会首先执行start配置中指定的命令,主要用于初始化SUT。

  • caliper.command.end:Caliper在退出流程的最后会执行end配置指定的命令,主要用于清理环境。

  • network.nodes:一个包含了所有要连接的共识节点的列表,列表中每一项需要指明被连接节点的IP地址、RPC端口及Channel端口号,所有端口号需要和节点的配置文件保持一致。为简单起见,现在只能指定共识节点(负责处理交易并产生新块的节点)。

  • network.authentication:适配器向节点的Channel端口发起请求时需要使用CA根证书等文件,这些文件已在调用build_chain.sh脚本时生成好,使用任一节点配置下的sdk文件夹中的相应文件即可,需要在该配置中写上所有文件的路径(使用相对路径时需要以caliper-cli工作目录为起始目录)。

  • network.smartContracts:指定要测试的合约,Caliper会在启动时向后端区块链系统部署合约。目前FISCO BCOS适配器支持通过language字段指定两种类型的合约——Solidity合约和预编译合约,当测试合约为Solidity合约时,language字段需要指定为solidity,当测试合约为预编译合约时,language字段需要指定为precompiled。当测试合约为预编译合约时,需要在address字段中指定预编译合约的地址,否则需要在path字段中指定Solidity合约的路径。

  • privateKey,用于签署交易以赋予其合法性。 私钥是从第三方工具(如OpenSSL)生成的较大的随机数。 在我们的简化配置示例中,使用了预定义的静态私钥来启动测试。

  • account,是根据privateKey计算得出的,以指出交易的发送者。 同样,我们在适配器中使用预定义的帐户值。

一个典型的 caliper 0.2.0 基准测试配置文件如 附录B 所示。

一个典型的 caliper 0.3.2 基准测试配置文件如 附录C 所示。

这一步,可以更改事务数量和事务速率,但是实际的事务速率还是要看测试结束后的报告。

前面的《测试操作须知》一节涵盖了单机多节点的测试过程需要了解的知识。

单机多节点,顾名思义,就是在本地一台物理机上部署多个区块链节点,默认情况下这些节点都是共识节点。

请先查看《测试脚本编写》一节中《说明》下的《文件结构》以知悉文件结构,本次测试的所有文件都保存在项目的 single-host-test 文件夹下。

  1. 编写 ipconfig ,其中的内容自然是单机网络,如:127.0.0.1:4 dfface 1表示本地部署4个节点,机构名称为 dfface,组号为1。注意本文档的所有测试都是单一群组。
  2. 生成 nodes 配置文件,bash build_chain.sh -T -f ipconfig -d -i
  3. 编写 fisco-bcos.json 网络配置文件,改动了启动和结束脚本,改动了连接的共识节点,改动了节点的认证文件地址。
  4. 编写 config.yml 基准测试文件。
  5. 开始测试:npx caliper launch master --caliper-benchconfig benchmark/config.yaml --caliper-networkconfig network/fisco-bcos.json
  6. 测试完成,结果如下图所示。可以看到单机测试使用默认参数时比较简单。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20201004215509789-cmv1oE.png

如果有多台物理机,每台物理机上有多个节点,又该如何测试呢?

举个例子,2机各2节点的区块链网络。本节测试所有文件在项目的 multi-host-test 文件夹下。

  1. 编写 ipconfig,其中的内容是多机网络,注意此时不要出现本地回环网络地址。例如2机各2节点这样写:192.168.177.154:2 dfface 1 换行 192.168.177.153:2 dfface 1
  2. 生成 nodes 配置文件,bash -T -f ipconfig -d -i
  3. 更改 nodes 下所有节点的启动脚本的内容,需要增加端口映射及删除网络设置。例如 docker run -p 8546:8546 -p 20201:20201 -p 30301:30301 -d --rm --name ${SHELL_FOLDER//\//} -v ${SHELL_FOLDER}:/data -w=/data fiscoorg/fiscobcos:v2.6.0 -c config.ini。端口要严格与 节点的config.ini 保持一致。
  4. 复制 nodes 文件夹到所有主机上,此时2机上的 nodes 文件夹保持完全一致
  5. 编写 fisco-bcos.json 网络配置文件,改动了启动和结束脚本,改动了连接的共识节点,改动了节点的认证文件地址。
  6. 编写 config.yml 基准测试文件,主要更改了 callback 的文件地址,以及 monitor http://192.168.177.153:2375/all
  7. 手动启动 192.168.177.153 的2个节点(简单起见,这里尚未用到 docker daemon 的远程调用)。
  8. 192.168.177.154 上开始测试,npx caliper launch master --caliper-benchconfig benchmark/config.yaml --caliper-networkconfig network/fisco-bcos.json
  9. 测试完成,结果如下图所示。从监控中可以看到,监控到了两个主机所有节点的docker容器信息。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20201004214446509-uEG0tu.png

如果分别手动启动两台主机上的节点,再查看连接情况,可以看到 192.168.177.153node0 连接上了另外3个节点,如下图所示,这也证实了多机多节点的有效性。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20201004210346428-iualxh-yy0cgT.png

测试中采用预定义的 “helloworld” 智能合约,自动化的测试脚本使用 python 语言编写。

关于 npm scripts(以此反证 在python script 中需要设置环境变量):

npm 脚本的原理非常简单。每当执行npm run,就会自动新建一个 Shell,在这个 Shell 里面执行指定的脚本命令。因此,只要是 Shell(一般是 Bash)可以运行的命令,就可以写在 npm 脚本里面。 比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。 这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。

SCP不用密码传输文件

使用sshpass: sshpass -p password scp /data/scripts/getData.log root@X.X.X.X:/data/python-scripts/inspector/AccountInspector/otherInspector

以非交互方式删除文件:ssh root@hostname "rm -f z100.foo z200.foo",于是:sshpass -p {password} ssh {username}@{host} 'rm -rf /data/nodes'

linux下开启SSH,并且允许root用户远程登录,允许无密码登录

sudo vi /etc/ssh/sshd_config  # 将 PermitRootLogin 改为 yes
sudo passwd root # 修改 root 的密码
sudo service sshd restart

python执行系统命令常用方法(subprocess、os、commands)

  • subprocess模块 (– Python3.x)
  • 使用 subprocess.check_output() 函数
  • 使用 subprocess.call() 函数

python 调用 shell 时 设置环境变量

  • os.putenv(varname, value) 可以设置环境变量,注意:调用此参数不会影响os.environ,但是会让 subprocess模块生效

Python3 正则表达式

  • re.match(pattern, string, flags=0) matchObj.group(1)
  • re.search(pattern, string, flags=0)
  • re.sub(pattern, repl, string, count=0, flags=0)
  • re.compile(pattern[, flags]) pattern.findall(string[, pos[, endpos]])
  • \s 匹配任意空白字符,等价于 [\t\n\r\f]。
  • \S 匹配任意非空字符
  • \d 匹配任意数字,等价于 [0-9]。
  • \D 匹配任意非数字

python-修改文件内容并保存的3种方法

  • 读取原文件,找到要修改的内容并修改,将修改后的所有字符串一次写入新文件
  • 读取源文件,一边找修改的内容一边写入新文件,无需修改的直接写入,需要修改的修改后写入
  • 以上两种都可以加入正则表达式
  • with open(file, "r", encoding="utf-8") as f1,open("%s.bak" % file, "w", encoding="utf-8") as f2:
            for line in f1:
                f2.write(re.sub(old_str,new_str,line))
        os.remove(file)
        os.rename("%s.bak" % file, file)
    

Python格式化字符串的几种方法

  • 有模板字符串比较安全但是功能不强大: templ = Template("$name is $age old") templ.substitute(name=name,age=float(age))
  • % 操作符方式已经落伍了: “%s is %d old” % (name,age)
  • 推荐字符串的 format 方法:"{} is {:f} old".format(name,age)
  • Formatted String Literals(Python3.6):f’{a} + {b} = {a + b};{a} - {b} = {a - b}’ 直接内嵌运算式

python的三种取整方式

向下取整 int(3.75) => 3

四舍五入 round(3.25) => 3

向上取整 math.ceil(3.25) => 4

python中迭代时使用索引

for index, name in enumerate(L):  # 使用 enumerate() 函数
     print(index, '-', name)

python将整数均分成N等分

def split_integer(m, n):
    assert n > 0
    quotient = int(m / n)
    remainder = m % n
    if remainder > 0:
        return [quotient] * (n - remainder) + [quotient + 1] * remainder
    if remainder < 0:
        return [quotient - 1] * -remainder + [quotient] * (n + remainder)
    return [quotient] * n

Python + logging 输出到屏幕,将log日志写入文件

import logging
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level=logging.DEBUG)
logging.debug('debug 信息')
logging.info('info 信息')
logging.warning('warning 信息')
logging.error('error 信息')
logging.critical('critial 信息')

Python的拆包与JavaScript的解构赋值

同样在Python中也有类似的语法,不过自由度稍弱,就是*args和**kwargs了。通常情况下,这两个语法出现在函数的形参中,用于接收不定长传参。事实上,它们还能做更多:

def z(a, b, c=None): …

z(*[1, 2])

z(**{‘a’: 1, ‘b’: 2, ‘c’: 3})

正像上面所展示的,我们可以将这个语法应用到函数调用上。[]是根据位置进行传参,当然,还有(), *{}等等。**{}是根据形参名进行传参。

细枝末节

  • python 多行注释是 """
  • python 获取系统时间:datetime.datetime.now()
  • os.chdir(“目标目录”) #修改当前工作目录 os.getcwd() #获取当前工作目录
  • python 中的 sleep:time.sleep(3) # 停顿3秒
  • python 删除文件: os.remove(path) #删除文件 os.removedirs(path) #删除空文件夹 os.rmdir(path) #删除空文件夹
  • python 删除非空文件夹: shutil.rmtree(path) #递归删除文件夹
  • Python json 库,可以转化字典
  • Tqdm_subprocess.py
  • python 修改全局变量 用 global声明
  • python vene 虚拟环境 使用教程

为了实现自动化实验数据获取,在现有 sample 的基础上我做了哪些改变?

  1. 采用开发部署工具 build_chain.sh ,以利用生成的脚本启动和停止节点,以及更改各种配置。
  2. 修改了 fisco-bcos.json ,为了利用上面1生成的脚本而更改了其中大部分内容,例如更改了 docker-compose.yml 启动等。一个更改后的示例文件如 附录 D 所示(单机7节点)。
  3. 多物理主机时,修改了启动脚本,例如端口映射。(更进一步,增加了全新的启动脚本,利用 docker 远程调用)
  4. 精简了文件结构,如下图所示。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20201004172325030-DBw6YV.png

  • benchmark:包含基准测试文件 config.yml,以及调用智能合约的两个脚本 get.jsset.js
  • network:包含 build_chain.sh 工具,可用于生成区块链的所有节点的配置,运行命令之后会生成一个 nodes 文件夹;fisco-bcos.json 文件是 caliper 测试的网络配置,包含了所有节点的接口及智能合约等配置;ipconfig 描述了生成的区块链网络信息,作为开发部署工具的参数。
  • smart_contracts:包含了智能合约文件。

node_modules 是node本地依赖,venv 是使用 pycharm 时虚拟化的python环境。

测试启动命令为:

npx caliper launch master --caliper-benchconfig benchmark/config.yaml  --caliper-networkconfig network/fisco-bcos.json
  • 编写 ipconfig 描述区块链网络信息【多物理主机时需变更启动方式,还要对物理主机进行scp、docker远程调用配置】
  • 利用 build_chain.sh 生成区块链网络(命令可配置共识算法、数据库类型)
  • 生成 nodes 文件夹之后,可按需要更改其中的配置文件【多物理主机需保持所有主机上该文件夹内容都一致】
  • 编写 caliper 的网络配置文件 fisco-bcos.json 【此处配置的节点仅共识节点】
  • 编写 caliper 的基准测试文件 config.yml
  • 调用 caliper 进行测试,并捕获命令行的输出
  • 将实验结果追加到实验数据 csv 文件
  • 错误处理,对可能产生的错误进行处理
    • 多物理机时,启动节点可能失败
    • 测试时可能因硬件资源不够,测试结果不完整
  • 清理工作,删除生成的一些文件

git 仓库:

请见 git 仓库 README.md。

https://cdn.jsdelivr.net/gh/dfface/img0@master/0/image-20201005204428813-dzsXz9.png

  • 查看节点node0链接的节点数
tail -f nodes/127.0.0.1/node0/log/log*  | grep connected

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

正常情况会不停地输出链接信息,从输出可以看出node0与另外3个节点(count = 3)有链接。

  • 执行下面指令,检查是否在共识
tail -f nodes/127.0.0.1/node0/log/log*  | grep +++

info|2019-01-21 17:23:32.576197| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=13dcd2da...
info|2019-01-21 17:23:36.592280| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=31d21ab7...
info|2019-01-21 17:23:40.612241| [g:1][p:264][CONSENSUS][SEALER]++++++++++++++++Generating seal on,blkNum=1,tx=0,myIdx=2,hash=49d0e830...

正常情况会不停输出++++Generating seal,表示共识正常。

  • 执行指令查看出块情况
cat nodes/127.0.0.1/node0/log/* | grep "g:1.*Report" # 查看group1出块情况,看到Report了属于group1的块高为1的块

info|2019-02-11 21:14:57.216548| [g:1][p:264][CONSENSUS][PBFT]^^^^^Report:,num=1,sealerIdx=3,hash=be961c98...,next=2,tx=1,nodeIdx=2
getNodeVersion # 获取客户端版本
getPeers # 获取节点链接信息
getBlockNumber # 查看当前块高,块高增加表示已出块,账本状态已更改

caliper-benchconfig:

---
test:
  name: Hello World
  description: This is a helloworld benchmark of FISCO BCOS for caliper
  clients:
    type: local
    number: 1
  rounds:
  - label: get
    description: Test performance of getting name
    txNumber:
    - 10000
    rateControl:
    - type: fixed-rate
      opts:
        tps: 1000
    callback: benchmarks/samples/fisco-bcos/helloworld/get.js
  - label: set
    description: Test performance of setting name
    txNumber:
    - 10000
    rateControl:
    - type: fixed-rate
      opts:
        tps: 1000
    callback: benchmarks/samples/fisco-bcos/helloworld/set.js
monitor:
  type:
  - docker
  - process
  docker:
    name:
    - node0
    - node1
    - node2
    - node3
  process:
    - command: node
      arguments: fiscoBcosClientWorker.js
      multiOutput: avg
  interval: 0.5

caliper-networkconfig:

{
    "caliper": {
        "blockchain": "fisco-bcos",
        "command": {
            "start": "docker-compose -f networks/fisco-bcos/4nodes1group/docker-compose.yaml up -d; sleep 3s",
            "end": "docker-compose -f networks/fisco-bcos/4nodes1group/docker-compose.yaml down"
        }
    },
    "fisco-bcos": {
        "config": {
            "privateKey": "bcec428d5205abe0f0cc8a734083908d9eb8563e31f943d760786edf42ad67dd",
            "account": "0x64fa644d2a694681bd6addd6c5e36cccd8dcdde3"
        },
        "network": {
            "nodes": [
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8914",
                    "channelPort": "20914"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8915",
                    "channelPort": "20915"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8916",
                    "channelPort": "20916"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8917",
                    "channelPort": "20917"
                }
            ],
            "authentication": {
                "key": "./networks/fisco-bcos/4nodes1group/sdk/node.key",
                "cert": "./networks/fisco-bcos/4nodes1group/sdk/node.crt",
                "ca": "./networks/fisco-bcos/4nodes1group/sdk/ca.crt"
            },
            "groupID": 1,
            "timeout": 100000
        },
        "smartContracts": [
            {
                "id": "helloworld",
                "path": "src/fisco-bcos/helloworld/HelloWorld.sol",
                "language": "solidity",
                "version": "v0"
            },
            {
                "id": "parallelok",
                "path": "src/fisco-bcos/transfer/ParallelOk.sol",
                "language": "solidity",
                "version": "v0"
            },
            {
                "id": "dagtransfer",
                "address": "0x0000000000000000000000000000000000005002",
                "language": "precompiled",
                "version": "v0"
            }
        ]
    },
    "info": {
        "Version": "2.0.0",
        "Size": "4 Nodes",
        "Distribution": "Single Host"
    }
}
---
test:
  name: Hello World
  description: This is a helloworld benchmark of FISCO BCOS for caliper
  workers:
    type: local
    number: 1
  rounds:
  - label: get
    description: Test performance of getting name
    txNumber: 10000
    rateControl:
      type: fixed-rate
      opts:
        tps: 1000
    callback: benchmarks/samples/fisco-bcos/helloworld/get.js
  - label: set
    description: Test performance of setting name
    txNumber: 10000
    rateControl:
      type: fixed-rate
      opts:
        tps: 1000
    callback: benchmarks/samples/fisco-bcos/helloworld/set.js
monitor:
  type:
  - docker
  - process
  dockers:
    containers:
    - node0
    - node1
    - node2
    - node3
  process:
    processes:
    - command: node
      arguments: fiscoBcosClientWorker.js
      multiOutput: avg
  interval: 0.5
{
    "caliper": {
        "blockchain": "fisco-bcos",
        "command": {
            "start": "network/nodes/127.0.0.1/start_all.sh; sleep 3s",
            "end": "network/nodes/127.0.0.1/stop_all.sh"
        }
    },
    "fisco-bcos": {
        "config": {
            "privateKey": "bcec428d5205abe0f0cc8a734083908d9eb8563e31f943d760786edf42ad67dd",
            "account": "0x64fa644d2a694681bd6addd6c5e36cccd8dcdde3"
        },
        "network": {
            "nodes": [
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8545",
                    "channelPort": "20200"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8546",
                    "channelPort": "20201"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8547",
                    "channelPort": "20202"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8548",
                    "channelPort": "20203"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8549",
                    "channelPort": "20204"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8550",
                    "channelPort": "20205"
                },
                {
                    "ip": "127.0.0.1",
                    "rpcPort": "8551",
                    "channelPort": "20206"
                }
            ],
            "authentication": {
                "key": "./network/nodes/127.0.0.1/sdk/node.key",
                "cert": "./network/nodes/127.0.0.1/sdk/node.crt",
                "ca": "./network/nodes/127.0.0.1/sdk/ca.crt"
            },
            "groupID": 1,
            "timeout": 100000
        },
        "smartContracts": [
            {
                "id": "helloworld",
                "path": "smart_contracts/HelloWorld.sol",
                "language": "solidity",
                "version": "v0"
            }
        ]
    },
    "info": {
        "Version": "2.0.0",
        "Size": "7 Nodes",
        "Distribution": "Single Host"
    }
}
  • Caliper 0.2.0 需要改源代码:https://github.com/FISCO-BCOS/FISCO-BCOS/issues/1248
  • docker sock permission 问题(改sock的权限 chmod 666 /var/XXX忘了/docker.sock):https://www.digitalocean.com/community/questions/how-to-fix-docker-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket
  • hasOwnProperty undefined / Property “length” undefined(仓库中的提供的benchmark跟caliper版本不一致,config.yml 中应该用上 test.clients 而不是 test.workers,此外可能要删除默认的 process 监控,这一块多读 Caliper 官方手册)https://github.com/hyperledger/caliper/issues/760、https://github.com/hyperledger/caliper/issues/781
  • snap restart docker 、snap.docker.dockerd:https://blog.csdn.net/qq_39248122/article/details/102844212、https://blog.csdn.net/boling_cavalry/article/details/100059053