添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

先安装NodeJS 8.X、node-gyp、Docker、Docker-compose。

git clone https://github.com/hyperledger/caliper.git
cd caliper
npm install

安装区块链SDK(以fabric为例)

# caliper项目目录下
npm install grpc@1.10.1 fabric-ca-client fabric-client

性能测试示例在 benchmark 目录下,用法如下:

node benchmark/simple/main.js -c yourconfig.json -n yournetwork.json
  • -c用于指定区块链的配置文件,不指定的话默认为 config.json
  • -n用于指定区块链网络配置文件,不指定的话由-c指定的配置文件定义。
  • 跑一个smallbank的例子:

    node benchmark/smallbank/main.js

    生成的报告长这样(部分):

    在这个标准框架核心,是可以译解信息的“适配层”,让Caliper可以安装智能合约,触发合约,或者查询各种分布式账本的状态,从而更好地测量其有效性。

    适配层 Adaptation Layer

    适配层用于将现有的区块链系统与Caliper框架集成。适配器使用了相应的链SDK和API实现了Caliper Blockchain NBIs。

    接口&核心层

  • 区块链操作接口:包含部署合约、调用合约、查询账本状态等操作;
  • 资源监控:对docker容器、本地进程进行监控,包括CPU、内存、网络IO等的状态;
  • 性能分析:读取预定义的性能数据(如TPS、延迟、成功率等)并打印报告。这些数据在调用NBI的时候会记录(如创建时间,交易提交时间,交易结果等);
  • 生成HTML报告。
  • 应用层来运行区块链测试场景。每一个测试场景由一个配置文件来定义,包含底层区块链网络的配置和测试参数。
  • 项目内置一个默认的区块链引擎,当然开发人员也可以基于NBI来定义自己的区块链引擎。
  • 区块链引擎

    benchmark/simple/config.json 为例:

    "blockchain": { "type": "fabric", "config": "benchmark/simple/fabric.json" "command" : { "start": "docker-compose -f network/fabric/simplenetwork/docker-compose.yaml up -d", "end" : "docker-compose -f network/fabric/simplenetwork/docker-compose.yaml down;docker rm $(docker ps -aq);docker rmi $(docker images dev* -q)" "test": { "name": "simple", "description" : "This is an example benchmark for caliper, to test the backend DLT's performance with simple account opening & querying transactions", "clients": { "type": "local", "number": 5 "rounds": [{ "label" : "open", "txNumber" : [1000, 1000, 1000], "rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 50}}, {"type": "fixed-rate", "opts": {"tps" : 100}}, {"type": "fixed-rate", "opts": {"tps" : 150}}], "arguments": { "money": 10000 }, "callback" : "benchmark/simple/open.js" "label" : "query", "txNumber" : [5000, 5000], "rateControl" : [{"type": "fixed-rate", "opts": {"tps" : 100}}, {"type": "fixed-rate", "opts": {"tps" : 200}}], "callback" : "benchmark/simple/query.js" "monitor": { "type": ["docker", "process"], "docker":{ "name": ["all"] "process": [ "command" : "node", "arguments" : "local-client.js", "multiOutput" : "avg" "interval": 1
  • blockchain 定义被测试区块链类型,并给出具体配置文件;
  • command 定义了测试开始和结束时的命令;
  • test 定义了测试相关的信息;
  • monitor 定义了对资源对象如何进行监控。
  • Master

    master实现的测试流包含三个阶段:

  • 准备阶段 :创建和初始化区块链,部署智能合约,并启动监控;
  • 测试阶段 :启动一个循环测试,测试任务会被安排给client去执行,client会返回性能测试数据;
  • 报告阶段 :分析测试数据,并生成HTML格式的报告。
    Order

    Client

  • Local client

    由于Node.js天生时单线程的,因此会fork多个local client子进程来充分利用多核,提高测试效率。每个子进程都运行有一个区块链客户端。

    Zookeeper client

    多个zoookeeper client是独立启动的,启动后会注册自己并待命测试任务,测试后会创建一个包含结果数据的znode。也是会fork多个子进程(local client)。

    用户自定义的测试模块

    其中定义有生成和提交交易的function(返回值都是promise):

  • init :会在每轮测试前被client调用;
  • run :定义如何执行交易。client会根据workload定义循环调用它;
  • end :每轮测试后被调用,通常定义一些清理工作。
  • 撸一下源码

    还是基于上边的架构图,这次从上往下捋。

    首先是Benchmark Layer

    从测试命令入手,以 smallbank 为例:

    node benchmark/smallbank/main.js

    测试用例位于 benchmark/ 目录下。由测试人员编写,并配置到 -c 指定的配置文件的 test.rounds[.callback] 中。

    main.js 中主要是加载两个配置文件,然后调用 src/comm/bench-flow.js run 方法,将两个配置文件传进去:

        const framework = require('../../src/comm/bench-flow.js');
        framework.run(absConfigFile, absNetworkFile);

    bench-flow.js 可以认为是测试引擎, run 方法定义了完整的测试流程。

    下边是接口和核心层

    接口即Blockchain NBIs,位于 src/comm/blockchain-interface.js 中的,其中的 BlockchainInterface 定义了区块链的基本操作:

    为了生成测试报告,首先必须有监控来收集数据,主要侧重于对Docker和Process的监控,代码文件包括 monitor-interface.js monitor-docker.js monitor-process.js 。从名字可以看出是接口和两个具体实现,看一下接口定义了些啥:

    除了启停操作,主要侧重于对CPU、内存和网络的监控。

    数据统计和报告生成功能位于 src/comm/report.js

    caliper支持对Fabric、Sawtooth等的测试,看架构图上还想对以太坊进行支持,但是目前还没有。

    具体的适配代码分别位于 src/fabric src/sawtooth src/iroha 等目录下,比如 fabric.js 中的 Fabric 类就继承自 BlockchainInterface ,实现了初始化、安装/执行智能合约等功能。

    这些功能内部自然就是调用了 fabric-client ,所以测试前需要先进行安装:

    npm install grpc@1.10.1 fabric-ca-client fabric-client
    hyperledger 【打怪升级】区块链 (19)Reactor Processors——响应式Spring的道法术器 智能合约编程语言-solidity快速入门(下) Android中适配器的notifyDataSetChanged()为何有时不刷新 从hook开始聊聊那些windows内核数据结构 Scala的actor 正则性能调优 windows下kafka+ELK的日志系统 Nginx下,请求本机另外Host很慢 使用JavaScript和Google时区API显示任何城市的本地时间 以太坊智能合约项目-Token合约开发与部署 以太坊智能合约入门项目-众筹项目 边城工具集:Fiddle 类工具助力在线测试和协作代码 JS实现确认、反选、取消按钮功能 Scala 语言学习之泛型(7) Powershell Here String 中换行在不同版本中的行为表现 Jetbrains 系 IDE 编辑器的代码提示功能 Windows借助脚本实现自动化加域 kotlin中的高级特性--协变与逆变(反变) PowerShell 多线程测试IP端口