Hyperledger Caliperの使い方

本記事は古い内容になっています。最新版の使用方法について[こちらの記事](https://qiita.com/jnmt/items/0fb65e2ea722f7b68921)を参照ください。

## はじめに

Hyperledgerは、Linux Foundationが推進するオープンソースのブロックチェーン基盤開発プロジェクトです。Hyperledgerプロジェクトでは、FabricやSawtooth、Burrowなど、複数のブロックチェーン基盤が開発されています。これらの実装の全く異なるブロックチェーン基盤を、同一のアプリケーション、同一のワークロードで統一的にベンチマークするためのフレームワークが、Hyperledger Caliperです。

対象のブロックチェーン基盤自体が絶賛開発中な上、Caliperも頻繁に仕様が変わっているように見受けられますが、簡単な使い方と何ができるかについてまとめたいと思います。

## 対応するブロックチェーン基盤

- Burrow
- Composer
- Fabric
- Fabric CCP[^CCP]
- Iroha
- Sawtooth

[^CCP]: CCP(Common Connection Profile)を使う場合と使わない場合が用意されています。CCPについては[こちら](https://qiita.com/jnmt/items/b9d73e82d1c6a7901175)の記事で簡単にまとめています。

## 使い方

**前提**

以下のソフトウェアを使用します。

- NodeJS 8, 9 or 10
- node-gyp
- Docker
- Docker-compose

**インストール**

```shell-session
$ git clone https://github.com/hyperledger/caliper.git
$ cd caliper
$ npm install
$ npm run repoclean
$ npm run bootstrap
```

現状、Caliperはnpmで公開されておらず、``caliper``というコマンドをインストールするには一手間かかるのですが、面倒なので``caliper``コマンドを使わずに実行します。コマンドをインストールしたい場合は、[こちら](https://hyperledger.github.io/caliper/docs/1_Getting_Started.html)をしてください。

```
$ cd packages/caliper-cli
$ node caliper.js benchmark run -w ../caliper-samples -c benchmark/simple/config.yaml -n network/fabric-v1.4/2org1peergoleveldb/fabric-node.json
```

各オプションの意味は以下の通りです。
- ``-w``: ワークスペースディレクトリのパス
- ``-c``: ベンチマーク構成ファイルのワークスペースからの相対パス
- ``-n``: ネットワーク構成ファイルのワークスペースからの相対パス

ベンチマーク構成ファイルでは、どういうワークロードでどれくらいの負荷をかけるかを指定し、ネットワーク構成ファイルでは評価対象のブロックチェーンネットワークを指定します。``packages/caliper-samples``内の``benchmark``ディレクトリ、``network``ディレクトリのそれぞれにサンプルファイルがあります。

ネットワーク構成ファイルでは開始終了時に実行するコマンドを指定できるようになっており、各サンプルでは、そこでdocker-composeを使用して評価対象のブロックチェーンネットワークを起動するようになっています。

``packages/caliper-samples``内の``benchmark``ディレクトリには、現在、以下のブロックチェーン基盤のサンプルファイルがあるので同じワークロードのまま、他のブロックチェーン基盤での性能を測ることができます。ただ、筆者が試したところ、基盤によっては負荷を大幅に抑えたベンチマーク構成ファイルを選ばないと完走しないものもありました。

- burrow
- fabric-{v1.0,v1.1,v1.2,v1.3,v1.4,v1.4.1}
- iroha
- sawtooth

実行が終わると、下記のようなHTML形式のレポートが出力され、スループットやレイテンシ、リソースの使用状況などを確認することができます。

<img width="1228" alt="caliper_report.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465166/1dd56df4-aed4-5cfe-646f-6afe7baec422.png">
[Hyperledger Caliperのレポートサンプル](caliper_report.png)

## ベンチマーク構成ファイルで指定可能な項目

- ``clients``
  - ``type`` : localとzookeeperの2つのタイプが指定できます。複数マシンでクライアントを動作させる場合はzookeeperを使用します。

- ``txMode`` : トランザクションの生成モードを指定します。
  - ``real-time`` : トランザクションをその場で生成してすぐにバックエンドのブロックチェーンネットワークへ送信します。(デフォルト)
  - ``file-read`` ``file-write`` : file-writeモードで生成したトランザクションをファイルに保存しておき、file-readモードで当該ファイルを読んでワークロードを再現します。``benchmark/simple/config-file.yaml``などにサンプルがあります。

- ``rateControl``
  - ``fixed-rate`` : 指定されたレート(tps)でトランザクションを送信します。
  - ``fixed-feedback-rate`` : 未完了のトランザクションがある場合に、一時的にトランザクションの送信を止めながら、指定されたレートで実行します。

- ``callback`` : ワークロード(アプリケーション)の処理が記述されたJavaScriptファイルを指定します。(例: 口座開設、残高照会)

- ``monitor`` : モニタリング対象のDockerコンテナなどを指定します。

パラメータの詳細は[こちら](https://hyperledger.github.io/caliper/docs/2_Architecture.html)を参照してください。

## サンプルで用意されているワークロード

ワークロード名   | 概要
---------------|----------------------------------------------------------------
simple         | 単純なGet/Putを行うワークロード。
smallbank      | 口座開設、預入れ、送金などを模したワークロード。
marbles        | Hyperledgerのサンプルにしばしば登場するおはじきのワークロード。
drm            | 著作権管理を模そうとしているようだが詳細未確認。
composer       | Hyperledger Composerのサンプルとおぼしきものだが詳細未確認。