使用Caliper對Fabric地basic鏈碼進行性能測試

如果你需要對fabric網絡中地合約進行吞吐量、延遲等性能進行評估,可以使用Caliper來實現,會返回給你一份網頁版的直觀測試報告。下面是對test-network網絡地basic鏈碼地測試過程。

目錄

    • 1. 建立caliper-workspace文件夾
    • 2. 安裝npm等
    • 3. calipe安裝
    • 4. 創建networks目錄并編輯yaml文件
    • 5. 創建workload目錄編寫js文件
    • 6. 創建benchmarks目錄并編寫yaml文件
    • 7. 啟動測試
    • 8. 查看結果

1. 建立caliper-workspace文件夾

建立caliper-workspace文件夾,文件夾的建立路徑是相對地,我這里是在fabric-samples的同級目錄下創建的,創建的路徑不同后面的配置文件中關于私鑰證書等地路徑也是不同的。
在這里插入圖片描述

2. 安裝npm等

  • 進入caliper文件夾 ,安裝npm
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

在這里插入圖安裝Node.js和npm片描述

  • 安裝Node.js和npm
sudo apt-get install -y nodejs
  • 驗證是否安裝成功

在這里插入圖片描述

3. calipe安裝

  • 使用npm安裝特定版本的@hyperledger/caliper包
npm install --only=prod @hyperledger/caliper@0.5.0

在這里插入圖片描述

  • 使用 Caliper 工具綁定到 Hyperledger Fabric 網絡
npx caliper bind --caliper-bind-sut fabric:2.2

在這里插入圖片描述
注意后面所創建的目錄結構如下:
在這里插入圖片描述

4. 創建networks目錄并編輯yaml文件

mkdir networks
cd networks/
vim networkConfig.yaml

寫入:

name: Caliper test
version: "2.0.0"caliper:blockchain: fabricchannels:# channelName of mychannel matches the name of the channel created by test network- channelName: mychannel# the chaincodeIDs of all the fabric chaincodes in caliper-benchmarkscontracts:- id: basicorganizations:- mspid: Org1MSP# Identities come from cryptogen created material for test-networkidentities:certificates:- name: 'User1'clientPrivateKey:path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk'clientSignedCert:path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem'connectionProfile:path: '../fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml'discover: true

5. 創建workload目錄編寫js文件

cd ..
mkdir workload
cd workload
vim 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: 'User1',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: 'User1',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: 'User1',contractArguments: [assetID],readOnly: false};await this.sutAdapter.sendRequests(request);}}
}function createWorkloadModule() {return new MyWorkload();
}module.exports.createWorkloadModule = createWorkloadModule;

6. 創建benchmarks目錄并編寫yaml文件

cd ..
mkdir benchmarks
cd benchmarks/
vim myAssetBenchmark.yaml

寫入:

test:name: basic-contract-benchmarkdescription: test benchmarkworkers:number: 2rounds:- label: readAssetdescription: Read asset benchmarktxDuration: 30rateControl:type: fixed-loadopts:transactionLoad: 2workload:module: workload/readAsset.jsarguments:assets: 10contractId: basic

7. 啟動測試

cd …

npx caliper launch manager --caliper-workspace ./ --caliper-networkconfig networks/networkConfig.yaml --caliper-benchconfig benchmarks/myAssetBenchmark.yaml --caliper-flow-only-test

在這里插入圖片描述

8. 查看結果

然后會在workspace目錄下產生一個報告:
在這里插入圖片描述

打開后就是測試的tps、時延等信息:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用TransBigData組件實現個人手機定位功能

目錄 一、引言 二、技術背景 三、實現邏輯 四、代碼實現 五、優化與注意事項&#xff1a; 六、總結 摘要&#xff1a;隨著現代社會對定位服務的需求日益增加&#xff0c;實現個人手機定位功能成為了開發者的研究熱點。本文詳細闡述了如何使用Python和TransBigData組件實現…

Python 從入門到精通 學習筆記 Day03

Python 從入門到精通 第三天 今日目標 流程控制語句、退出循環、練習學習的內容 一、流程控制語句 流程控制的三種方式&#xff1a;順序語句、雙分支語句、循環語句 雙分支語句 Python 的雙分支語句使用if-else語句實現。 其語法結構如下: if條件:#如果條作為真&#xff…

Facebook廣告報告指標CPC

在Facebook廣告中&#xff0c;CPC可以作為一個關鍵指標來評估廣告效果和投資回報。較低的CPC意味著廣告主能以更低的價格獲得更多的點擊量&#xff0c;從而降低廣告投放成本。而較高的CPC可能暗示著廣告主需要更大的預算才能獲得相同數量的點擊。本文小編將講講Facebook廣告報告…

k8s上安裝KubeSphere

安裝KubeSphere 前置環境安裝nfs-server文件系統配置nfs-client配置默認存儲創建了一個存儲類metrics-server集群指標監控組件 安裝KubeSphere執行安裝查看安裝進度 前置環境 下載配置我都是以CentOS 7.9 安裝 k8s(詳細教程)文章的服務器作為示例&#xff0c;請自行修改為自己的…

2024年軟考科目怎么選?(選科指引)

新手在準備報考軟考時&#xff0c;都會遇到這樣的一個問題——科目這么多&#xff0c;我適合考什么&#xff1f;要想知道自己適合報什么科目&#xff0c;就需要了解每個科目是什么&#xff0c;考什么等一系列的問題。今天給大家分享一下。 軟考包含什么科目&#xff1f; 軟考…

facebook廣告相比谷歌廣告的優勢

Facebook廣告相比谷歌廣告的優勢主要體現在以下方面&#xff1a; 用戶數據豐富&#xff1a;Facebook擁有龐大的用戶數據&#xff0c;包括人口、興趣、行為等多個維度&#xff0c;這些數據可以幫助廣告主更準確地定位到目標受眾。相比之下&#xff0c;谷歌廣告的用戶數據相對較…

android快速網絡請求之android-networking

今天介紹一個知道的人不多的庫&#xff0c;寫個簡單的頁面什么的。用起來很爽&#xff1f;如果你疑惑那么多開源的網絡庫為啥不用&#xff1f; 因為這個簡單方便。拿來就用。經過這幾天的實踐。確實可以。推薦一下 如果你需要 GITHUB 首先。引入依賴 implementation com.ami…

MySQL 數據遷移要點

目錄 1. 相同版本的遷移 2. 不用版本的遷移 3. 不同數據庫的遷移 數據庫遷移就是把數據從一個系統移動到另一個系統上&#xff0c;遷移過程其實就是在源數據庫備份和目標數據庫恢復的過程組合。遷移的原因是多種多樣的&#xff0c;比如&#xff1a; 需要安裝新的數據庫服務…

elasticsearch中LessThen遇到的坑

開發中&#xff0c;使用到LessThen-小于某個參數的邏輯查詢&#xff0c;如下&#xff1a; /// <summary> /// 查詢狀態已發布&#xff08;狀態小于2&#xff09;的政策要聞分頁 /// </summary> /// <param name"input"></param> /// <re…

使用OkHttp上傳本地圖片及參數

下面以一個例子來講解在項目中如何使用OKHttp來對本地圖片做個最簡單的上傳功能&#xff0c;基本上無封裝&#xff0c;只需要簡單調用便可&#xff08;對于OKHttp的引入不再單獨做介紹&#xff09;。 1&#xff1a;構建上傳圖片附帶的參數&#xff08;params&#xff09; Map…

2.vue學習筆記(目錄結構+模板語法+屬性綁定)

1.目錄結構 1.vscode ——VSCode工具的配置文件夾 2.node_modules ——Vue項目的運行依賴文件夾 3.public ——資源文件夾&#xff08;瀏覽器圖標&#xff09; 4.src ——源碼文件夾 5..gitgnore ——git忽略文件 6.index.html ——如果html文件 7.package.json —…

基于SpringBoot+Vue學生成績管理系統前后端分離(源碼+數據庫)

一、項目簡介 本項目是一套基于SpringBootVue學生成績管理系統&#xff0c;主要針對計算機相關專業的正在做bishe的學生和需要項目實戰練習的Java學習者。 包含&#xff1a;項目源碼、數據庫腳本等&#xff0c;該項目可以直接作為bishe使用。 項目都經過嚴格調試&#xff0c;確…

ElasticSearch中的分析器是什么?

在Elasticsearch中&#xff0c;分析器&#xff08;Analyzer&#xff09;是一個用于文本分析的重要組件。它定義了如何將文本分解成單詞和子詞&#xff0c;這對于索引和搜索是非常重要的。 在Elasticsearch中&#xff0c;分析器定義了如何將文本轉換為可以被索引和搜索的形式。…

虛幻學習筆記10—C++函數與藍圖的通信

一、前言 除了上一章C變量與藍圖通信講的變量能與藍圖通信外&#xff0c;還有函數和枚舉也可以和藍圖通信。函數的關鍵字為”UFUNCTION“、枚舉的關鍵字為”UENUM“。 二、實現 2.1、BlueprintCallable藍圖中調用 該函數時帶執行的&#xff0c;帶入如下。編譯成功后在藍圖中輸…

macOS 獲取文件夾大小

macOS 獲取文件夾大小 獲取文件夾大小的擴展如下&#xff1a; extension URL {var fileSize: Int? { // in bytesdo {let val try self.resourceValues(forKeys: [.totalFileAllocatedSizeKey, .fileAllocatedSizeKey])return val.totalFileAllocatedSize ?? val.fileAll…

來自Sui的溫馨建議:保護您的Web3私鑰

當您安裝一個錢包并創建Sui賬戶時&#xff0c;錢包包含一個公鑰和一個私鑰。保護好私鑰的安全非常重要&#xff0c;從而可以保護您的Sui資產&#xff0c;包括錢包中的任何tokens。 公鑰加密技術是幾十年前開發的&#xff0c;是當今互聯網上大多數安全交易的基礎&#xff0c;包…

Navicat Premium 16 for Mac/Windows:高效的數據庫開發工具

Navicat Premium 16是一款功能強大的數據庫開發工具&#xff0c;為開發人員提供了全面的工具和功能&#xff0c;幫助他們更高效地進行數據庫開發和管理。不論是初學者還是專業開發人員&#xff0c;Navicat Premium 16都能滿足他們的需求&#xff0c;并提供直觀、易用的界面。 …

【深度學習】AlexNet網絡實現貓狗分類

【深度學習】AlexNet網絡實現貓狗分類 AlexNet簡介 AlexNet是一種卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;模型&#xff0c;它在2012年的ImageNet圖像分類挑戰賽中取得了重大突破&#xff0c;引發了深度學習在計算機視覺領域的熱潮…

為“異常”努力是值得的

異常是OO語言處理錯誤的方式,在C中&#xff0c;鼓勵使用異常。侯捷再書中談起異常&#xff0c;“十年前撰寫“未將異常考慮在內的”函數是為一種美好實踐&#xff0c;而今我們致力于寫出“異常安全碼”。”可見異常安全的重要。 說起異常安全&#xff0c;首先就要是異常的出現…

Leetcode—213.打家劫舍II【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—213.打家劫舍II 算法思路 實現代碼 class Solution { public:// 左閉右開int rob1(vector<int>& nums, int start, int end) {int n nums.size();int f0 0, f1 0, new_f 0;for(int i start; i < end…