在现有Fabric 2.2.0 网络上设置和运行Caliper性能测试 实战

首先请确认是否安装并配置了dockerdocker-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!保存退出,如下图所示(pwdfabric-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文件夹中,分别创建三个名为networksbenchmarksworkload的文件夹

cd ../..
mkdir caliper-workspace
cd caliper-workspace
mkdir networks
mkdir benchmarks
mkdir workload

文件目录如图所示,caliper-workspacefabric-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的报告,打开即可查看性能测试报告。
在这里插入图片描述
打开后如图所示
在这里插入图片描述

欢迎小伙伴的讨论,若有问题请在评论区评论,谢谢你。

猜你喜欢

转载自blog.csdn.net/bean_business/article/details/108937601