連載 [第6回] :
  Hyperledger Fabric再入門

Hyperledger Fabricに関連する2つのプロジェクトとHyperledger Fabricに関するリソース

2021年3月24日(水)
西島 直

はじめに

前回はfabric-samplesにあるasset-transfer-basicを用いたfabric-sdk-nodeについて解説しました。これで簡単なchaincodeやブロックチェーンアプリケーションを作成できるようになりました。

最終回の今回は、Hyperledger Fabricに関連する2つのプロジェクト「Blockchain Explorer」「Caliper」と、Hyperledger Fabricに関するリソースを紹介します。

Blockchain Explorer

Blockchain Explorerはブロックチェーンネットワークを可視化するツールです。Hyperledger Fabric以外のブロックチェーン基盤の可視化も可能です。

fabric-samplesを用いてブロックチェーンネットワークを可視化してみます。まずfabric-samplesでchaincodeをインストールします。2021年1月時点の最新版であるBlockchain Explorer v1.1.4はHyperledger Fabric v1.4とv2.2をサポートしています。Hyperledger Fabricvの最新版v2.3のfabric-samples v2.3を利用するので、バージョンに気をつけてください。

下記のコマンドでfabric v2.2.2、fabric-ca v1.4.9、fabric-samples(v2.2.2のbranchに切り替え済みです)をダウンロードします。

$ curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.2 1.4.9

次に、fabric-samplesを利用してブロックチェーンネットワークを構築します。

$ cd fabric-samples/test-network
$ ./network.sh up createChannel
$ ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-javascript/ -ccl javascript

続いて、Blockchain Explorerをセットアップします。コンテナとして提供されているので、設定ファイルとdocker-compose.yamlを用意するだけで利用できます。今回は公式の設定を利用します。

$ cd $HOME
$ mkdir explorer
$ cd explorer
$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/config.json
$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/connection-profile/test-network.json -P connection-profile
$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/docker-compose.yaml
$ ls *
config.json  docker-compose.yaml

connection-profile:
test-network.json

config.json、docker-compose.yaml、test-network.jsonの3つのファイルが用意されました。次にBlockchain Explorerがfabricにアクセスするためのcertファイル等の設定が必要です。docker-compose.yamlでそれらのファイルが入ったフォルダをマウントする必要があるため、volumeのパスを変更します。

$ cat docker-compose.yaml
(前略)
  explorer.mynetwork.com:
(中略)
    volumes:
      - ./config.json:/opt/explorer/app/platform/fabric/config.json
      - ./connection-profile:/opt/explorer/app/platform/fabric/connection-profile
      - ../fabric-samples/test-network/organizations:/tmp/crypto
      - walletstore:/opt/explorer/wallet
(後略)

6行目には同じディレクトリにあるconfig.jsonを指定します。7行目も同様に同じディレクトリにあるconnection-profileを指定してください。8行目にはfabric-samplesのnetwork.shが生成したcertファイル等があるorganizationsディレクトリを指定します(この例では、作成したexplorerと同じディレクトリにfabric-samplesがあることを想定)。これでセットアップは完了です。

最後に、Blockchain Explorerを起動させるためdocker-compose.yamlがあるディレクトリで下記のコマンドを実行してください。

$ docker-compose up -d

これで、Blockchain Explorerが起動しました。ブラウザでlocalhost:8080にアクセスしてください。

ログイン画面が見えました。Userとpasswordはconnection-profile/test-network.jsonに記載されています。デフォルトだとUserはexploreradmin、passwordはexploreradminpwになります。ログインすると、下記の画面に遷移します。

この画面の上部メニューにある「BLOCKS」をクリックすると、今までのブロックが見られます。今は6つのブロックが積まれています。0番目はgenesis block、1と2は異なる組織がお互いに認識できようにするための情報が入っている設定のブロック、3、4はchaincodeの定義に対する承認ブロック、5はchaincodeのコミットのブロックです。

Block HashとPrevious Hashを見ると、n番目のBlock Hashがn+1番目のPrevious Hashと同じになっています。Blockchainの由来となったblockのchainが確認できます。

ここで、Invokeを発行してブロックを積んでみたいと思います。fabric-samples/test-networkディレクトリに移動して環境変数を設定し、下記のコマンドを実行します(詳細は第2回を参照)。

$ export PATH=${PWD}/../bin:$PATH
$ export FABRIC_CFG_PATH=$PWD/../config/
$ export CORE_PEER_TLS_ENABLED=true
$ export CORE_PEER_LOCALMSPID="Org1MSP"
$ export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
$ export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
$ export CORE_PEER_ADDRESS=localhost:7051
$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
$ peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'

8行目でchaincodeを初期化し、9行目でasset6をChristopherに移動するinvokeを発行しています。

Blockchain Explorerを見ると、Block Numberが2つ増えて7になっています。Transactionsのリンクをクリックするとトランザクションの詳細が見えます(「b97eb2…」をクリック)。

Writesにトランザクションのkey(今回のinvokeはasset6)に対してvalueがどうなっているのか(OwnerがChristopherに変更)を確認できます。

Hyperledger Caliper

Hyperledger CaliperはHyperledger Fabricをはじめ、Hyperledger BesuやEthereumなどのパフォーマンスを測定するベンチマークツールです。異なるブロックチェーン基盤の性能比較や異なるchaincodeで性能比較をするのはあまり意味がないのですが、chaincodeを固定してHyperledger Fabricの設定変更による影響の調査やインスタンスサイズの選定などに利用するのが良いと思います。

Hyperledger Caliperでは、ブロックチェーンネットワークに接続するためのネットワークとベンチマークの設定ファイル、ベンチマークのワークロードモジュールの3つのファイルを必要としています。fabcarにはベンチマークの設定ファイルとワークロードのモジュールが用意されているので、それを利用したいと思います。

まずは、fabric-samplesでfabcarのchaincodeをデプロイします。Hyperledger Caliperはv2.2までしか対応してないことに注意してください。

$ cd fabric-samples/test-network
$ git checkout v2.2.2
$ ./network.sh up createChannel
$ ./network.sh deployCC -ccn fabcar -ccv v1 -cci initLedger -ccl javascript -ccp ../chaincode/fabcar/javascript/

次に、npmでcaliperのCLIをインストールします(事前にnpmをインストールしてください)。

$ npm install --only=prod @hyperledger/caliper-cli@0.4.2

続いて、Hyperledger Caliperのサンプルを用意します。fabric-samplesと同じ階層にクローンしてください。

$ git clone https://github.com/hyperledger/caliper-benchmarks.git

fabcarのベンチマークの設定ファイルやモジュールは以下の場所にあります。

$ ls caliper-benchmarks/benchmarks/samples/fabric/fabcar/
changeCarOwner.js  config.yaml  createCar.js  helper.js  queryAllCars.js  queryCar.js

config.yamlがベンチマークの設定ファイルです。内容を詳しく見てみましょう。

$ vi caliper-benchmarks/benchmarks/samples/fabric/fabcar/config.yaml
test:
  workers:
    type: local
    number: 5
  rounds:
    - label: Change car owner.
      txDuration:
      - 30
      rateControl:
        - type: fixed-load
          opts:
            transactionLoad: 5
      workload:
        module: benchmarks/samples/fabric/fabcar/changeCarOwner.js
        arguments:
          assets: 1000
    - label: Query all cars.
…

7行目のlabelでベンチマークのワークロードを定義しています。「Change car owner」ワークロードは同フォルダのchacngeCarOwner.jsで定義されたワークロードを実行します。assetsはトランザクションを生成する数です。計算能力にもよりますが、1000だと時間がかかるので、100などにすると良いでしょう。

次にnetworkの設定ファイルを作成します。

vi networkConfig.yaml
name: Caliper test
version: "2.0.0"
caliper:
  blockchain: fabric
channels:
  - channelName: mychannel
    contracts:
    - id: fabcar
organizations:
  - mspid: Org1MSP
    identities:
      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

caliperをfabricの2.2にバインドしてから、caliper-benchmarkのディレクトリでベンチマークを実行します。

$ npx caliper bind --caliper-bind-sut fabric:2.2
$ npx caliper launch manager --caliper-workspace ./ --caliper-networkconfig ../networks/networkConfig.yaml --caliper-benchconfig benchmarks/samples/fabric/fabcar/config.yaml --caliper-flow-only-test --caliper-fabric-gateway-enabled

10分ほどベンチマークが行われ、計測が終了すると性能が表示されます。AWSのt3.mediumインスタンスを利用して検証したところ、Change car owerのトランザクションは21.7TPSだと分かりました。

また、report.htmlが生成されるためWebブラウザでも表示できます。

Hyperledger Fabricに関するリソース

Hyperledger Fabricの新機能

Hyperledger Fabricには、Private dataやExternal Builder、Policies、Prometheus連携など有用な機能があります。使い方に困ったらドキュメント(英語)を参照してください。なお、Fabricドキュメントワーキンググループには日本語ワーキングがあり、ドキュメントの日本語化にも力を入れているので、英語に慣れてない方でも参照できると思います。

また、新機能の提案はRFCという形で議論しています。現在はOpenTelemetryとの統合やTEE(Trusted Execution Environments)上でchaincodeを実行するPrivate Chaincodeなどが議論されています。

Hyperledger Fabricのユースケース

実際にどのようなユースケースでHyperledgerが使われているかを紹介しているページがあります。18のユースケースの中で13のユースケースはHyperledger Fabricが利用されています。

Hyperledgerのブログでは最新の分散台帳技術の動向が紹介されています。2021年2月のニュースでは、Good Health Pass Collaborativeの発足について述べられています。旅行やビジネスで海外へ行くために、COVID-19の陰性検査証明や予防接種の記録するデジタルヘルスパスシステムをどのようにするのかを議論しています。ここではHyperledger IndyやAriesが利用される予定です。

おわりに

これまでは企業間、業種間の取引は信頼性を人手で確認したり、判子(またはサイン)で担保したりしてきました。しかし分散台帳技術により、それらのビジネスプロセスをデジタル化できるようになりました。分散台帳技術は社会のインフラに利用される可能性を持っています。また、既存のビジネスプロセスの改善以外にも、異業種間で信頼できるデータ共有により、新しいサービスやシステムを構築することも可能となります。

本連載では、Hyperledger Fabric再入門として全6回を通して基本的な使い方を紹介してきました。本連載を通じて、皆さんが分散台帳を用いた新しいサービスを構築するためのお役に立てれば幸いです。

株式会社日立製作所

研究開発グループ デジタルテクノロジーイノベーションセンタ OSSテクノロジーラボラトリ員
OSSの評価・検証・機能開発、upstream活動、社内外へのOSS普及に従事。
Linux KernelやKVM、OpenStackでOSSコミュニティの参加した経験を持つ。
現在はHyperledgerコミュニティに参加しブロックチェーンの普及に勤めている。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています