Hyperledger Fabric Chaincodeガイド

Junki Yuasa
Acompany
Published in
8 min readDec 2, 2019

はじめに

こんにちは、12月に突入しいよいよ寒くなってきました。今回の記事ではHyperledger FabricのChaincodeの実行環境を用意し、ベーシックなChaincodeを作成、実行します。

Fabricの概要についてはこちらの記事をご覧ください。

事前準備

事前準備に関しては本記事では説明を致しません。こちらの公式ページを参照して事前準備を行なってください。

環境構築

環境構築について見ていきます。Hyperledger Fabricのネットワークを実行するには以下の3つのことを行う必要があります。

  1. fabric-samplesレポジトリのclone(ネットワーク設定ファイル)
  2. ネットワークを実行するために必要なbinaryファイル群、configファイル群のインストール
  3. 各dockerイメージのインストール

1のネットワークの設定ファイルについてはfabric-samplesのfirst-networkを用います。

2のbinaryファイル群はfabric-samplesのbinディレクトリに、configファイル群はconfigディレクトリに入ります。

以下のコマンドで実行します。

$ curl -sSL http://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version> <option>

optionとして-s、-b、-dをつけるとそれぞれ1、2、3を取りやめることができます。例えば、以下のコマンドはfabric-samplesのcloneのみを行います。

$ curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.4 1.4.4 0.4.18 -b -d

実際に1、2、3を行うには以下のコマンドを実行します。今回はこちらのコマンドを実行してください。

$ curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.4 1.4.4 0.4.18

以下のコマンドで各dockerイメージがインストールされていることが確認できます。

$ docker images

Chaincodeの作成

今回はFabricにデータを記録し、参照するだけのChaincodeを作成します。
主に使用するモジュールは’github.com/hyperledger/fabric/core/chaincode/shim’です。
’github.com/hyperledger/fabric/protos/peer’は関数の返り値の型定義のみに用いられています。

Hyperledger FabricのChaincodeの主な関数はInitとInvokeです。

Init関数はChaincodeの初期化時に実行されます。また、Chaincodeのupdate時にも実行されるのでここでのデータの追加などは避けるべきでしょう。

Invoke関数はChaincodeとやりとりをする時に呼び出されます。サブ関数を用意して、Invoke関数には指定されたサブ関数の呼び出しのみを定義しておきます。

サブ関数として、recordDataとqueryDataを定義します。
recordDataでデータの記録を行い、queryDataでデータの参照を行います。

chaincodeディレクトリ以下にrecord-data/go/record-data.goを作成してください。

Chaincodeと対話するアプリケーションの作成

まず、first-networkで定義されているネットワークを実行し、Chaincodeのインストールと初期化を行うシェルスクリプトファイルを作成します。

fabric-samples以下にrecord-dataディレクトリを作成してください。

$ cd fabric-samples && mkdir record-data
$ cd record-data
$ touch startFabric.sh

startFabric.shは以下のように記述します。

次にjavascriptディレクトリを作成し、チェーンコードを実行するためのコードを書いていきます。

$ cd record-data
$ mkdir javascript && cd javascript
$ touch enrollAdmin.js registerUser.js invoke.js query.js

enrollUser.jsにはクライアントアプリのadminユーザーを登録する処理が書かれています。ここではクライアントアプリはorg1に接続します。

registerUser.jsにはクライアントアプリを実際に使用するユーザーを登録する処理が書かれています。ここではユーザーとしてuser1を登録しています。

invoke.jsにはChaincodeをinvokeする処理が書かれています。ChaincodeのregisterData関数を実行しています。keyをdata1、valueをappleとしています。

query.jsにはChaincodeをqueryする処理が書かれています。ChaincodeのqueryData関数を実行しています。keyを用いて、valueを参照します。

最後にpackage.jsonファイルを作成し、必要なパッケージを定義します。使用するパッケージはfabric-ca-clientとfabric-networkです。

$ cd javascript
$ npm init -y

そしてパッケージをインストールします。

$ npm install

Chaincodeと対話する

まずrecord-dataディレクトリに移動し、startFabric.shを実行して、ネットワークを起動します。権限がない場合はchmodなどで実行権限を追加しましょう。

$ cd record-data
$ ./startFabric.sh

そしてadminとユーザーの登録を行います。

$ cd javascript
$ node enrollAdmin.js
Wallet path: ~/record-data/javascript/wallet
Successfully enrolled admin user "admin" and imported it into the wallet
$ node registerUser.js
Wallet path: ~/record-data/javascript/wallet
Successfully registered and enrolled admin user "user1" and imported it into the wallet

最後にinvokeとqueryを行います。

$ node invoke.js
Wallet path: ~/record-data/javascript/wallet
Transaction has been submitted
$ node query.js
Wallet path: ~/record-data/javascript/wallet
Transaction has been evaluated, result is: {"Data":"apple"}

データをHyperledger Fabricに記録し、それを参照することができました!

最後に

起動したネットワークは各dockerコンテナで動いています。最後に、コンテナを停止させておきしょう。

$ cd first-network
$ ./byfn.sh down

今回はHyperledger FabricのChaincode実行環境の作成とシンプルなChaincodeの作成を行いました。

今後も,Acompanyからブロックチェーンに関する記事を投稿していきますので,ぜひfollowしていただけると嬉しいです.

Happy Hacking 😎!

参考資料

--

--