Amazon Managed Blockchain 〜開発環境構築編〜

by 仲尾 和祥

はじめに

5/1にAmazon Managed Blockchainが一般公開されました。ブロックチェーンスタジオ内では、発表された当時から利用してみたいという話をしており、簡単なアプリケーションの構築をしてみました。本記事は、このアプリケーションを構築するにあたり、ローカルでHyperledger Fabricのアプリケーションの開発環境構築に関して、自分が利用している設定を紹介したいと思います。なお、Amazon Managed BlockchainがHyperledger Fabric v1.2で構築されているため、構築する環境のバージョンも揃えています。

システム構成

構成図

Hyperledger Fabricを用いたアプリケーションの基本的なシステム構成は、下記の図のようになります。下記の図では、Hyperledger Fabricのネットワークを2組織で構成しており、トランザクションの承認に両組織の承認が必要な場合の構成を記載しています。なお、組織が増えた場合、点線の枠で囲んでいる構成が増えていくことになると考えてください。

application environment

このうち、開発者がコードを書く必要があるのは、ApplicationとChaincodeです。Applicationは、Fabric CAを用いた認証機能と、Peerに対してChaincodeを実行するリクエストを最低限実装する必要があります。また、Chaincodeは、Chaincodeをデプロイする時に実行されるinit関数と、トランザクションの検証やWorld Stateを参照するためのinvoke関数を最低限実装する必要があります。

Walletの仕様

Hyperledger Fabricでは、パブリックブロックチェーンの考え方とは異なり、Walletをサーバ側で保持することも想定しています。
これは、パブリックブロックチェーンのWalletは、各個人が管理責任を持ってサービスに参加するために管理するものであるのに対し、コンソーシアム型のブロックチェーンでは、サービスは各組織内で運用され、運用規則に応じてユーザの登録や失効、再発行等のインシデントに対して柔軟に対応できるようにする必要があるためです。

上記のような理由から、Hyperledger Fabricは、Walletの管理方法として、下記の3つが用意されています。

  • CouchDBWallet: Applicationが接続できるCouchDBで管理する方式
  • FileSystemWallet: Application内にファイルとして保存する方式

ちなみに、Hyperledger Favric v1.3からは、InMemoryWallet(Applicationのメモリ内に保存される方式)がサポートされています。

開発環境の構築

開発方法

Hyperledger Fabricのアプリケーション開発の方式は、下記の2つが用意されています。

  • High Level APIを用いた開発:
    Hyperledger Composerで提供される予定であった、WalletやAssetといった抽象化されたフレームワークを用いて開発する方式。Chaincodeが自動的に生成される等の利点があり、習熟することで開発コストの削減や実装スピードの向上が見込めるのが特徴。
  • Low Level APIを用いた開発:
    SDKとChaincodeライブラリを用いて開発する方式。Hyperledger Fabricの仕様変更に開発者自身が対応する必要があるが、KVSを用いたデータベースを利用できる等、開発するにあたり利用できる機能の選択肢が多いのが特徴。

本記事では、Low Level APIを用いた開発のローカル環境構築について紹介します。

Application

使用可能な言語

Hyperledger FabricのApplication SDKは、下記の言語で提供されています。

  • 最新版用に追従して開発されている言語
    • Node.js
    • Java
  • 追従することを保証していない言語
    • Python
    • Golang

このうち、Node.jsはHigh Level APIを用いた開発に利用するため、バージョンアップに合わせてリリースできるように開発されています。また、Javaについても、一部の機能で、ごく稀にリリースが遅れることもありますが、追従して利用できるように開発されています。一方で、PythonやGolangについては、基盤のバージョンに完全に追従していないため、利用を推奨されていません。

なお、Node.jsについては、サンプルプログラムがhyperledger/fabric-samplesリポジトリのfabcarに用意されています。

開発環境の構築

基本的には、Hyperledgerプロジェクトのhyperledger/fabric-samplesリポジトリにあるbasic-networkを利用することで開発環境を構築することができます。この構成は、Orderer、FabricCA、Peer、CouchDB、CLIのコンテナが各1台ずつ起動する構成となっています。

ただし、上記の設定をそのまま用いる場合、最新バージョン(v1.4.1 2019/06/07時点)の構成なってしいます。このため、v1.2.1の環境が構築できるように修正を加えた環境設定を下記で公開したので参考にしてください。

Chaincode

使用可能な言語

Hyperledger FabricのChaincode SDKが提供されている言語は下記になります。

  • Golang
  • Node.js
  • Java

このうち、Golangは、Hyperledger Fabricのコードに含まれているため、バージョンのリリースに合わせて追従して開発されています。また、Node.jsについては、High Level APIを用いた開発に利用されているため、頻繁に開発されている特徴があります。一方で、Javaについては、リリースノートを確認すると、少し遅れて追従していることがあるため、最新版に環境を利用する開発には不向きになっています。

開発環境の構築

コンテナ環境の構築

基本的には、Hyperledgerプロジェクトのhyperledger/fabric-samplesリポジトリにあるchaincode-docker-devmodeを利用することで開発環境を構築することができます。この構成では、Orderer、Peer、Chaincode実行環境、CLIのコンテナが起動します。

この構成は、peerをchaincode-devモードで動作させています。これにより、peerとchaincodeのコンテナ間でヘルスチェックを抑止し、chaincodeを何度も再デプロイできる構成となっています。ただ、このサンプル構成の場合、ワールドステート等を保存するCouchDBが動作していないため、 GetQueryResult() のような関数を利用することができません。

また、サンプルの構成の場合、Hyperledger Fabricの各コンポーネントのバージョンが最新版になってしまいます。このため、Hyperldger Fabric v1.2の構成で、修正を加えた設定ファイルを下記のリンク先に公開したので参考にしてください。

依存パッケージの解決(Golang)

Hyperledger FabricのChaincodeを開発する場合、Golangを指定すると依存パッケージの解決に悩まされることがあります。理由としては、下記の2点があります。

  • Hyperledger Fabricはマイナーバージョンアップ時に、PeerとChaincode間のprotobufの定義が変わることがあるため
  • Hyperledger Fabricのパッケージマネジメントツールが下記のように変遷しており、開発バージョンによって利用できるツールが異なるため
    • v1.0〜v1.1: govendor
    • v1.2〜: dep
  • Golangのパッケージ管理ツールがv1.11以前と以降で変更された

このため、GolangでChaincodeを開発する場合は、利用するバージョンのHyperledger FabricのGopkg.lockファイル(例: v1.2.1の場合)を参照し、必要に応じて依存パッケージのリビジョンを指定します。本記事の作成時(2019/06/07)のChaincodeのバージョン解決を行なった設定は、ここに公開してあるため、参考にしてください。

SDK(Application/Chaincode)仕様の確認環境

Hyperledger FabricのSDKの仕様を確認として、下記の公式ページが用意されています。

  • Application
    • Node.js: https://fabric-sdk-node.github.io/release-1.4/index.html
    • Java: https://sdkjavadocs.github.io/
  • Chaincode
    • Golang: https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim
    • Node.js: https://fabric-shim.github.io/release-1.4/index.html
    • Java: https://fabric-chaincode-java.github.io/org/hyperledger/fabric/shim/Chaincode.html

しかし、これらは最新のバージョンしか提供されていないため、特定のバージョンのものを確認することができません。このため、下記のリンクに一部のSDK仕様の確認ページが表示できる環境設定を公開したので参考にしてください。

おわりに

今回は、Amazon Managed Blockchainを使ったアプリケーションを開発するために必要なローカル環境について紹介しました。次回以降では、実際に作成したアプリケーションについての紹介や、Amazon Managed Blockchainへアプリケーションをデプロイする手順について紹介する予定です。

前回の記事: Amazon Managed Blockchain 〜コンソーシアム構築編〜

参考

Contact

Contact