首先请确认是否安装并配置了docker
和docker-compose
,已安装的可忽略,未安装的可参考这篇文章的第一节
1.下载并配置Node.js
下载Node.js,v10.X LTS
版本
sudo wget -P /usr/local https://cdn.npm.taobao.org/dist/node/v10.20.0/node-v10.20.0-linux-x64.tar.xz
cd /usr/local
sudo tar -xvf node-v10.20.0-linux-x64.tar.xz
给node文件夹权限
sudo chmod 777 -R node-v10.20.0-linux-x64
配置环境变量
vim ~/.bashrc
将以下内容复制到bashrc
文件中,按I
插入,插入完成后按ESC
退出插入,输出:wq!
保存退出,如下图所示
export PATH=$PATH:/usr/local/node-v10.20.0-linux-x64/bin
退出后在命令行输入以下命令刷新配置文件
source ~/.bashrc
检查是否安装成功,如果返回版本号即配置成功
node -v
npm -v
2.下载fabric-sample及fabric2.2.0二进制文件和镜像
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples
git checkout 22393b629bcac7f7807cc6998aa44e06ecc77426
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.8 -s
配置环境变量
vim ~/.bashrc
将以下内容复制到bashrc
文件中,按“I”插入,插入完成后按ESC
退出插入,输出:wq!
保存退出,如下图所示(pwd
是fabric-sample
的路径)
export PATH=$PATH:$(pwd)/bin
退出后在命令行输入以下命令刷新配置文件
source ~/.bashrc
3.创建并初始化Fabric网络
cd test-network
./network.sh up createChannel
./network.sh deployCC -ccn basic -ccl javascript
./network.sh up createChannel
执行完毕后如下图所示
./network.sh deployCC -ccn basic -ccl javascript
执行完毕后如下图所示
4.创建Caliper工作区
当前在test-network
目录下,回到fabric-samples
的同一级目录,在fabric-samples目录的同一级别创建一个名为caliper-workspace的文件夹,然后在caliper-workspace文件夹中,分别创建三个名为networks、benchmarks和workload的文件夹
cd ../..
mkdir caliper-workspace
cd caliper-workspace
mkdir networks
mkdir benchmarks
mkdir workload
文件目录如图所示,caliper-workspace
和fabric-samples
在同一目录下
Caliper的安装和使用将基于当地的npm
安装。(没有配置npm的小伙伴可以参考此文章中下载并配置Node.js
部分)
在caliper-workspace目录中,使用以下终端命令安装caliper CLI:
npm install --only=prod @hyperledger/caliper-cli@0.4.0
使用以下终端命令绑定SDK:
npx caliper bind --caliper-bind-sut fabric:2.1
5.构建网络配置文件
在networks
文件夹下创建一个名为networkConfig.json
的文件
cd networks
touch networkConfig.json
将以下内容复制到networkConfig.json
的文件中并保存,
{
"version" : "1.0",
"name": "Caliper test",
"caliper" : {
"blockchain": "fabric"
},
"clients": {
"[email protected]": {
"client": {
"credentialStore": {
"path": "/tmp/org1",
"cryptoStore": {
"path": "/tmp/org1"
}
},
"organization": "Org1",
"clientPrivateKey": {
"path": "../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp/keystore/priv_sk"
},
"clientSignedCert": {
"path": "../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp/signcerts/[email protected]"
},
"connection": {
"timeout": {
"peer": {
"endorser": "300"
}
}
}
}
}
},
"channels": {
"mychannel": {
"created" : true,
"contracts": [
{
"id":"basic",
"version":"1.0.0"
}
]
}
},
"organizations":{
"Org1": {
"mspid": "Org1MSP",
"peers": [
"peer0.org1.example.com"
]
}
},
"peers": {
"peer0.org1.example.com": {
"url": "grpcs://localhost:7051",
"tlsCACerts": {
"pem": "-----BEGIN CERTIFICATE-----\n<UNIQUE CONTENT>\n-----END CERTIFICATE-----\n"
},
"grpcOptions": {
"ssl-target-name-override": "peer0.org1.example.com",
"hostnameOverride": "peer0.org1.example.com"
}
}
}
}
注意"pem": "-----BEGIN CERTIFICATE-----\n<UNIQUE CONTENT>\n-----END CERTIFICATE-----\n"
中的内容需要根据自己网络中生成的证书内容来更改,查看方式如下:
cd ../..
cd fabric-samples/test-network/organizations/peerOrganizations/org1.example.com
打开connection-org1.json
,复制以下内容替换networkConfig.json
文件中"pem": "-----BEGIN CERTIFICATE-----\n<UNIQUE CONTENT>\n-----END CERTIFICATE-----\n"
的内容
替换networkConfig.json
文件中tlsCACerts
的内容,并保存
6.构建测试工作负载模块
在workload
文件夹中,创建一个名为readAsset.js
的文件
cd ..
cd workload
touch readAsset.js
将以下内容复制到readAsset.js
的文件中并保存:
'use strict';
const {
WorkloadModuleBase } = require('@hyperledger/caliper-core');
class MyWorkload extends WorkloadModuleBase {
constructor() {
super();
}
async initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext) {
await super.initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext);
for (let i=0; i<this.roundArguments.assets; i++) {
const assetID = `${
this.workerIndex}_${
i}`;
console.log(`Worker ${
this.workerIndex}: Creating asset ${
assetID}`);
const request = {
contractId: this.roundArguments.contractId,
contractFunction: 'CreateAsset',
invokerIdentity: '[email protected]',
contractArguments: [assetID,'blue','20','penguin','500'],
readOnly: false
};
await this.sutAdapter.sendRequests(request);
}
}
async submitTransaction() {
const randomId = Math.floor(Math.random()*this.roundArguments.assets);
const myArgs = {
contractId: this.roundArguments.contractId,
contractFunction: 'ReadAsset',
invokerIdentity: '[email protected]',
contractArguments: [`${
this.workerIndex}_${
randomId}`],
readOnly: true
};
await this.sutAdapter.sendRequests(myArgs);
}
async cleanupWorkloadModule() {
for (let i=0; i<this.roundArguments.assets; i++) {
const assetID = `${
this.workerIndex}_${
i}`;
console.log(`Worker ${
this.workerIndex}: Deleting asset ${
assetID}`);
const request = {
contractId: this.roundArguments.contractId,
contractFunction: 'DeleteAsset',
invokerIdentity: '[email protected]',
contractArguments: [assetID],
readOnly: false
};
await this.sutAdapter.sendRequests(request);
}
}
}
function createWorkloadModule() {
return new MyWorkload();
}
module.exports.createWorkloadModule = createWorkloadModule;
7.构建基准测试配置文件
在benchmarks
文件夹下创建一个名为myAssetBenchmark.yaml
cd ..
cd benchmarks
touch myAssetBenchmark.yaml
将以下内容复制到myAssetBenchmark.yaml
的文件中并保存:
test:
name: basic-contract-benchmark
description: test benchmark
workers:
type: local
number: 2
rounds:
- label: readAsset
description: Read asset benchmark
txDuration: 30
rateControl:
type: fixed-load
opts:
transactionLoad: 2
workload:
module: workload/readAsset.js
arguments:
assets: 10
contractId: basic
monitors:
resource:
- module: docker
options:
interval: 5
containers:
- all
8.运行Caliper基准测试
运行以下指令
npx caliper launch manager --caliper-workspace ./ --caliper-networkconfig networks/networkConfig.json --caliper-benchconfig benchmarks/myAssetBenchmark.yaml --caliper-flow-only-test --caliper-fabric-gateway-enabled --caliper-fabric-gateway-discovery
测试结果如下:
同时在caliper-workspace
目录下生成了一个名为report.html
的报告,打开即可查看性能测试报告。
打开后如图所示
欢迎小伙伴的讨论,若有问题请在评论区评论,谢谢你。