目次


Hyperledger Fabric 入門, 第 5 回

チェーンコードの書き方

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: Hyperledger Fabric 入門, 第 5 回

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:Hyperledger Fabric 入門, 第 5 回

このシリーズの続きに乞うご期待。

第 5 回は Hyperledger Fabric のチェーンコードの実装方法について紹介します。

1

はじめに

Hyperledger Fabric ではスマートコントラクトを実装することができるため、汎用的な許可制ブロックチェーンと呼ばれています。 スマートコントラクトは契約上のルールや条件を実装したもののことを指します。 本稿では Hyperledger Fabric のスマートコントラクトの実装の仕方について紹介します。 また本稿は Hyperledger Fabricv1.3 の情報をもとに記載しております。

2

チェーンコードとは

Hyperledger Fabric ではスマートコントラクトのことをチェーンコードと呼びます。 チェーンコードはプログラミング言語を使って記述しています。 現在は Go、Node.js、Java を使って、チェーンコード開発をすることができます。 Hyperledger Composer という開発フレームワークを利用する方法もありますが、今回はネイティブで Go 言語を使った開発の仕方について紹介します。Composer を使った開発方法についてはこちらをご確認ください。 チェーンコードは Peer にデプロイされ、ブロックチェーンネットワーク上の台帳にアクセスする際にクライアントアプリから呼び出されます。そのため、チェーンコードには台帳にどういった情報を書き込み、どういった情報を取得するかを記述する必要があります。 データベースのモデル定義や SQL 文をイメージして頂くと分かりやすいと思います。

 

またチェーンコードには以下のような操作が存在します。

  • Package

    チェーンコードをパッケージングします。

  • Install

    開発したチェーンコードを Peer にインストールします。
    デプロイする際は対象の Peer ごとに install する必要があります。

  • Instantiate

    チェーンコードをチャネル上で初期化します。
    初期化時に Endorsement Policy を設定します。Instantiate を実行するとチェーンコードが利用可能になります。

  • upgrade

    既存のデプロイされているチェーンコードをアップデートする際に行います。
    事前にアップグレードするチェーンコードを Install しておく必要があります。

  • invoke

    台帳の更新、参照を行います。

3

チェーンコードの書き方

チェーンコードの基本的な書き方を Hyperledger Fabric のドキュメントのチュートリアルをもとに解説します。 チェーンコードは Go、Node.js、Java で書くことができますが、今回は Go 言語での書き方について紹介します。 基本的な考え方や構造は同じなので、Node.js や Java で書く時にもご参考になると思います。 チェーンコードを書く際は Init 関数と Invoke 関数を定義する必要があります。

 

Hyperledger Fabric ではチェーンコードを書く際に利用できる API が用意されています。 台帳を更新する際に利用する putState や台帳のデータを取得する際に利用する getState 等、Hyperledger Fabric 特有の処理に必要な API が用意されています。

 

チェーンコードは以下の手順で書いていきます。

  1. 利用するパッケージを import する。

    import するパッケージはブロックチェーン上の台帳やチャネル等にアクセスするための API を提供します。

  2. 関数を実行するための構造体を定義する。
  3. Init 関数を定義する。

    チェーンコードを Instantiate した時に呼び出される関数です。

     

  4. Init 関数の処理を記述する。

    特に何も処理することがなければ、記述する必要はありません。 Init 関数はチェーンコードをアップグレードする際も実行されるため、アセットの初期化の処理を Init 関数の中に書いてしまうと、アップグレード時に台帳のデータが初期化されてしまします。例えば、A さんの所持ポイントを 1000 に設定する処理を Init 関数に書いておくと、初期化後、しばらく、チェーンコードが実行され、A さんのポイントが 1500 に増えていても、チェーンコードを修正してアップグレードすると、Init 関数が実行され、A さんのポイントが 1000 に戻ってしまうため、Init 関数の処理を書くときは注意が必要です。 このような事態を避けるため、上記の例のような初期値の設定は別途、InitValue() のような関数を定義して、Invoke 関数の中で呼び出すようにすることを推奨します。

  5. Invoke 関数を定義する。

    Invoke 関数は台帳の参照、更新を行う時に呼び出される関数です。

     

  6. Invoke 関数の処理を定義する。

    Invoke 関数ではトランザクションから指定された関数名に応じて、呼び出すサブ関数を分けています。 例えば、台帳からデータを取得する関数は get()、台帳を更新する関数は set() 等です。

     

  7. Invoke 関数の中で呼び出されるサブ関数を定義する。

    Invoke 関数から呼び出される関数を定義します。例として台帳の値を更新する set() 関数を定義します。

     

チェーンコード特有の台帳へのアクセス部分等は API が用意されているため、それ以外の基本的なプログラミングの部分は、一般的なアプリケーション開発と変わりません。次章では実際に Go 言語で開発したチェーンコードで動作するサンプルアプリケーションを紹介します。

4

サンプルアプリの紹介

サンプルアプリの Marble について紹介します。 Marble アプリは Marble(おはじき)をブロックチェーンネットワークの参加者間でやりとりするアプリケーションです。 おはじきには色や大きさを定義することができ、作成したおはじきを他の参加者に渡したり、削除することができます。 Hyperledger Fabric の SDK を用いたサンプルアプリです。詳細はこちらをご確認ください。

 

Marble アプリのチェーンコードは 4 種類用意されています。 Marble アプリのチェーンコードで定義するものは参加者の情報(氏名、所属等)と資産の情報(おはじきの色、おはじきの大きさ、おはじきの所有者)、資産の移転(所有者変更、新規作成、削除)です。 これらの情報がこの 4 つのチェーンコードで書かれています。 今回はそのうちの 2 つのチェーンコードの一部について紹介します。

  • marble.go

    marble.go では Init 関数、Invoke 関数、参加者と資産のモデルを定義しています。 marble という構造体を定義し、パラメータを設定、ブロックチェーンネットワークの参加者を Owner という構造体として定義し、パラメータを設定しています。

     

  • Invoke 関数を定義

    Invoke 関数が呼び出されると getFunctionAndParmeters で関数名と引数を取得します。 取得した関数名に応じて、呼び出すサブ関数を条件分岐で処理しています。 例えば、関数名が write だった場合、取得した引数を渡して、Invoke 関数の中で write 関数を呼び出します。

     

  • write_ledger.go

    write_ledger.go では Invoke 関数の中で呼び出されるサブ関数の処理を記述しています。(おはじきの所有者移転の処理等)

     

Hyperledger Fabric で提供されている API 等のツールを使うことで簡単にチェーンコードを書くことができます。 3 章でご紹介した部分をマスターすれば、基本的なチェーンコードは書くことができるようになります。

5

チェーンコードのデプロイ方法

チェーンコードを実行するためにはブロックチェーンネットワークに参加している Peer にチェーンコードをデプロイする必要があります。 ブロックチェーンネットワークの作成についてはこちらにチュートリアルがあります。 チェーンコードのデプロイ方法は SDK を使った方法CLI を使った方法がありますが、今回は CLI を使った方法を紹介します。

  1. デプロイしたい Peer のコンテナへログイン

    チェーンコードはブロックチェーンネットワークの Peer にデプロイするため、デプロイしたい Peer のコンテナにログインする必要があります。 docker コマンドでコンテナにログインする場合は、docker exec -it コンテナ名 bash でログインできます。

  2. チェーンコードを Install

    peer にログインしたら peer chaincode install コマンドでチェーンコードを install します。 以下のようなコマンドを実行するとチェーンコードの install が始まります。
    peer chaincode install -n チェーンコード名 -v チェーンコードバージョン -p チェーンコードのパス
    チェーンコードの install は各 Peer に実行する必要があります。 またチェーンコードはチェーンコード名とチェーンコードのバージョンで管理しています。

  3. チェーンコードを Instantiate

    チェーンコードは peer に install しただけでは利用できません。 チェーンコードを利用するためには Instantiate を行う必要があります。Instantiate は peer ごとではなく、1 つのチェーンコードにつき、1 回行います。 peer chaincode instantiate コマンドを使って行います。以下、コマンドの例です。

    peer chaincode instantiate -o orderer のコンテナ名:ポート番号 -tls TLS 通信の有無 (true or false)
    --cafile orderer の tls 証明書のパス -C チャネル名 -n チェーンコード名 -v チェーンコードバージョン -c Init 関数に渡す引数 -P Endorsement Policy

    チェーンコードの Instantiate が完了すると、Instantiate されたチェーンコードのコンテナが起動します。 docker ps コマンドで確認することができます。 また Endorsement Policy については第 2 回の記事をご確認ください。

  4. チェーンコードの実行

    デプロイしたチェーンコードは CLI コマンドを使ってテストすることができます。 テストしたいチェーンコードがインストールされた Peer のコンテナにログインして、peer chaincode invoke コマンドを実行します。
    peer chaincode invoke -o orderer のコンテナ名:ポート番号 -tls TLS 通信の有無 (true or false) --cafile orderer の tls 証明書のパス
    -C チャネル名 -n チェーンコード名 -c 引数(引数は実行する関数名とその関数に渡す引数を記載)

6

まとめ

今回はチェーンコードの書き方を Go 言語で紹介しました。 ブロックチェーン特有の記述の部分はツールが用意されているため、サンプルのソースコードを見ながら、使い方をマスターすれば、簡単にチェーンコードを書くことができます。 また、今後 Hyperledger Fabric では、より簡単にチェーンコードが開発できるようなアップデートも予定されているため、その辺りも今後、紹介していきたいと思います。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1063509
ArticleTitle=Hyperledger Fabric 入門, 第 5 回: チェーンコードの書き方
publish-date=11222018