1.はじめに
初めて、HyperLedger Fabricのchaincodeのコーディングする人向けの記事です。コーディングのとっかかりになって頂けたら幸いです。
1.1 想定読者
- HyperLedger Fabricのサンプルソースを取得している人(gitから取得できます
git clone https://github.com/hyperledger/fabric-samples.git
) - Go言語の基本的な知識がある人(但しC++やjavaができる人であればついていけると思います)
- HyperLedger Fabricの基本的な知識がある人
- HyperLedger Fabricのchaincodeの実行環境がある人(なくてもいいですが、やりながら試してもらうと理解しやすいと思いますので)これから作る人はこのページを参考にしてみてください。コマンドラインでの実行方法について記載しています(【vagrant(ベイグラント)を使って、HyperLedger Fabric v1.1の環境を簡単構築】、【HyperLedger Fabric v1.1でchaincodeを実行する】)
2.サンプルソース
HyperLedger Fabricにはサンプルソースがありますので、サンプルソースをコピーして、コーディングを始めるのがいいかと思います。今回はchaincode_example02というサンプルソースを参考にしたいと思います。サンプルソースは以下にあります。サンプルソースは単純な送金アプリで、A→BにX送金する(サンプルソースのファンクション:invoke)。AやBの残高を参照する(サンプルソースのファンクション:query)機能があります。
サンプルソース格納場所
/home/vagrant/fabric-samples/chaincode/chaincode_example02/go/chaincode_example02.go
※HyperLedger FabricのサンプルソースをgitからCloneする必要があります。/home/vagrantの部分は各自の環境によって異なります
3.呼び出されるファンクション
chaincodeで呼び出されるファンクションは以下のみです。
- Init ・・・インストール時(初期化)に実施されるファンクション
- Invoke ・・・chaincodeが呼び出された場合に実施されるファンクション
サンプルソースを見るともっといろいろとファンクションがありますが、Invoke
からパラメータを参照して各処理へ分岐しているので、基本はこれだけです。
chaincode_example02.goを使用して別のプログラムを作る場合は、invoke(上のInvokeとは違うファンクション)とqueryを修正して使っていけばいいのではと思います。deleteについては不要の人もいるかと思いますのでいらない場合は削除してしまえばいいと思います。
4.DBを更新、参照する
HyperLedgerで使用するDBはキーバリューストアタイプのDBで、キーワードに対して、対応した値を設定、参照するというものになります。chaincodeのコーディングについてはとりあえず下の2つを覚えればスタートできると思います。(もちろんGo言語の知識も必要ですが)。DBを更新するファンクションは以下になります。第一引数が、キーワードで、第二引数が値です。複数の値を設定したい場合は第二引数をjsonバイト列にします。jsonバイト列を使用する場合は、encoding/jsonパッケージのMarshal関数を使用します。結果はエラーだった場合、errにエラー内容が入ります。正常である場合はnilです。
※encoding/jsonパッケージやMarshal関数については別のHPを参照してもらえればと。。。
更新関数
err = stub.PutState(A, []byte(strconv.Itoa(Aval)))
参照の場合は第一引数にキーワードを入れます。Avalbytesに参照結果が入ります。errにはエラー内容が入ります。正常である場合はnilです。json形式で値が設定されている場合はAvalbytesをencoding/jsonパッケージのUnmarshal関数を使用して、パースしてください。
参照関数
Avalbytes, err := stub.GetState(A)
5.おわりに
上記に記載したことはサンプルソースを見ればわかることですが、後学のためまとめさせてもらいました。今後は取引履歴の参照の仕方や、ソースの更新時にDBに登録した内容がクリアされてしまう問題の対処について調べたいと思います。