IBM Bluemixプラットフォームを使って、Hyperledger Fabricのブロックチェーンのチェーンコードを構築し動かしてみましょう。本記事では、基本的なHyperledger FabricチェーンコードアプリケーションをIBM BluemixのRESTインターフェイスを利用してデプロイし、問い合わせや実行といったやりとりを理解することを目指します。
※チェーンコード: ブロックチェーンには通常取引に関するデータが保存されますが、その一部として保存されるアプリケーションレベルのコードをチェーンコードといいます。ここではHyperledger Fabric(ブロックチェーン)のピアノードのネットワークにデプロイされるコードを表します。
目次
Bluemixアカウントの作成
IBM Bluemixのウェブサイトで「フリー・アカウントの作成」をクリックし、フォームに必要事項を記入し、30日間の無料トライアルアカウントを有効にしましょう。アプリケーション実行用の2GBのランタイムおよびコンテナメモリ、無制限のIBMサービスとAPI、無料サポートが利用可能になります。
登録を終えたらBluemixにログインし、組織を作成し、続いてスペースを作成してください。ここでは組織を「gaiax-blockchain-br」、スペースを「dev」としました。
これでHyperledgerブロックチェーンを作成し、起動する準備が整いました。
Hyperledgerブロックチェーンを起動する
以下のステップにしたがって、4ノードネットワークのHyperledgerブロックチェーンのStarter Developerプランを起動します。
- 画面上部のメニューで「カタログ」をクリックしてください。
- 画面左のサイドニューで「アプリケーション・サービス」を選択してください。
- 画面中央に表示されるアプリケーション・サービスの中から「Blockchain 」を選択してください。
- 続いて表示される画面でサービス名と資格情報名を入力して、価格プラン「Starter Developer プラン (ベータ)」を選択し(画面の下の方にあるのでスクロールして探してください。)、「作成」ボタンをクリックしてください。
- 作成完了後に表示される画面で表示される「ダッシュボードを起動」ボタンをクリックしてください。
チェーンコードを動かす
ここからは、GitHub上のIBMのチュートリアルIBM-Blockchain/learn-chaincode: Learn how to write chaincodeの「Interacting with Your First Chaincode」にそって、ピア上でRESTインターフェイスを使って既存のチェーンコード「finished」を動かしてみましょう。
それでは、RESTインターフェイスを利用する際のユーザーの登録からはじめ、チェーンコードのデプロイ、チェーンコードへの問い合わせ、実行の順に見ていきます。ここではふたつのRESTエンドポイント「/registrar」と「/chaincode」を、それぞれ 「/registrar」 はユーザー登録に、「/chaincode」 はチェーンコードへのデプロイ、呼び出し、問い合わせに利用します。
レジストラーを利用したユーザー登録
RESTインターフェイスでのエンドポイント /chaincode の呼び出しは、リクエストボディにセキュアなコンテキストIDを必要とします。以下のステップにしたがって、ユーザーリストの中からユーザーを選んでネットワークにユーザーを登録します。
- 起動したブロックチェーンの「サービス資格者情報」タブをクリックし、利用可能なユーザーを見つけ、enrollIdとenrollSecretをメモしてください。(ダッシュボードに入る前の管理画面にあります)
・・・
- ダッシュボードに入り左サイドメニューで「API」を選択してください。
- 「レジストラー」を選択し、「POST /registrar」を開いてください。
- テキストフィールド「Secret」にサンプルをコピーしてください。<enrollId>と<enrollSecret>はステップ1でメモしたもの入力してください。[サンプルコード]
{ "enrollId": "<enrollId>", "enrollSecret": "<enrollSecret>" }
[リクエストの入力フォーム]
- 「試行する」ボタンをクリックしてPOSTリクエストを送信します。リクエストが正常に行われると、レスポンスコード200とともに、レスポンスボディ「{“OK”: “Login successful for user ‘user_type1_0’.” }」が得られ、ユーザーを登録できたことがわかります。
チェーンコードのデプロイ
チェーンコードを実行するために、チェーンコードをブロックッチェーンに送信します。以下のステップにしたがってチェーンコードのサンプル「finished」をhttp://gopkg.in/ibm-blockchain/learn-chaincode.v2/finishedからデプロイしてみましょう。
- ダッシュボードの左サイドメニューで「API」を選択してください
- 「チェーンコード」を選択し、「POST /chaincode」を開いてください
- テキストフィールド「DeploySpec」に以下のサンプルをコピーしてください。<enrollId>は環境に合わせて置き換えてください。[サンプルコード]
{ "jsonrpc": "2.0", "method": "deploy", "params": { "type": 1, "chaincodeID": { "path": "http://gopkg.in/ibm-blockchain/learn-chaincode.v2/finished" }, "ctorMsg": { "function": "init", "args": [ "hi there" ] }, "secureContext": "<enrollId>" }, "id": 1 }
[リクエストの入力フォーム]
- 「試行する」ボタンをクリックしてPOSTリクエストを送信します。
リクエストが正常に行われると、以下のようなレスポンスが得られます。レスポンスの「message」の値は128文字の英数字からなるハッシュで、チェーンコードを表すIDにあたります。呼び出しやクエリトランザクションでチェーンコードを参照する際にこのID<chaincodeHash>を使うので、メモしておいてください。
チェーンコードへの問い合わせ
前項でブロックチェーンにデプロイしたチェーンコードはキーとともに値を保存しています(具体的にはinit関数でキー「hello_world」に値「hi there」がセットされています。詳しくは同チュートリアルまたはリポジトリのinit関数の実装を参照してください)。
ここでは以下のステップにしたがってキー「hello_world」の値をチェーンコードに問い合わせてみましょう。
- 左サイドメニューで「API」を選択してください。
- 「チェーンコード」を選択し、「POST /chaincode」を開いてください。
- テキストフィールド「QuerySpec」に以下のサンプルをコピーしてください。<chaincodeHash>と<enrollId>は環境に合わせて置き換えてください。
[サンプルコード]
{ "jsonrpc": "2.0", "method": "query", "params": { "type": 1, "chaincodeID": { "name": "<chaincodeHash>" }, "ctorMsg": { "function": "read", "args": [ "hello_world" ] }, "secureContext": "<enrollId>" }, "id": 2 }
「試行する」ボタンをクリックしてPOSTリクエストを送信します。リクエストが正常に行われると、レスポンスコード200とともに以下のようなレスポンスボディが得られ、キー「hello_world」の値が「hi there」となっていることを確認できます。
[レスポンスボディ]
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "hi there" }, "id": 2 }
チェーンコードの実行
最後に、以下のステップで関数writeを呼び出してキー「hello_world」の値を「hi there」から「go away」に書き換え、書き換えが行われたか確認してみましょう。
- 左サイドメニューで「API」を選択してください。
- 「チェーンコード」を選択し、「POST /chaincode」を開いてください。
- テキストフィールド「InvokeSpec」に以下のサンプルをコピーしてください。<chaincodeHash>と<enrollId>は環境に合わせて置き換えてください。
[サンプルコード]
{ "jsonrpc": "2.0", "method": "invoke", "params": { "type": 1, "chaincodeID": { "name": "<chaincodeHash>" }, "ctorMsg": { "function": "write", "args": [ "hello_world", "go away" ] }, "secureContext": "<enrollId>" }, "id": 3 }
- 「試行する」ボタンをクリックしてPOSTリクエストを送信します。
リクエストが正常に行われると、レスポンスコード200とともに以下のようなレスポンスボディが得られます。[レスポンスボディ]
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "8c0bab9b-182f-487d-8698-599604cab031" }, "id": 3
もう一度「チェーンコードへの問い合わせ」の項の手順でキー「hello_world」の値を問い合わせ、値が「go away」に書き換えが行われたか確認してみましょう。レスポンスコード200とともにレスポンスボディとして以下のようなデータが得られば成功です。
[レスポンスボディ]
{ "jsonrpc": "2.0", "result": { "status": "OK", "message": "go away" }, "id": 2 }
更に勉強したい方は
IBM Bluemix上でHyperledgerチェーンコードが動いていることを確認できました。本記事では、GitHub上のIBMのチュートリアルIBM-Blockchain/learn-chaincode: Learn how to write chaincodeの既存のコード「finished」 を利用し、「Interacting with Your First Chaincode」からチュートリアルを始めましたが、同チュートリアルを最初から読み込んで「Implementing Your First Chaincode」にそって開発環境の設定や、スケルトンコード「start」を利用して関数の詳細などを追ってみるとより理解が深まることでしょう。