Hyperledger Fabric Chaincodeガイド
はじめに
こんにちは、12月に突入しいよいよ寒くなってきました。今回の記事ではHyperledger FabricのChaincodeの実行環境を用意し、ベーシックなChaincodeを作成、実行します。
Fabricの概要についてはこちらの記事をご覧ください。
事前準備
事前準備に関しては本記事では説明を致しません。こちらの公式ページを参照して事前準備を行なってください。
環境構築
環境構築について見ていきます。Hyperledger Fabricのネットワークを実行するには以下の3つのことを行う必要があります。
- fabric-samplesレポジトリのclone(ネットワーク設定ファイル)
- ネットワークを実行するために必要なbinaryファイル群、configファイル群のインストール
- 各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していただけると嬉しいです.