技術パート監修・執筆: @shinsa82
#Hyperledger Fabricとは
Hyperledger Fabricとは、オープンソースのブロックチェーン基盤であり、Linux Foundationが管理・運営するHyperledgerプロジェクトの一つである。Hyperledgerプロジェクトでは、様々なインダストリーでビジネス使用可能なブロックチェーン基盤の開発を行っている。Hyperledger Fabric以外にも、Hyperledger Iroha, Hyperledger Indyなど、様々なBlockchain基盤がある。
参考URL:
- https://www.hyperledger.org/projects/fabric
- https://arxiv.org/abs/1801.10228v1
- https://hyperledger-fabric.readthedocs.io/en/release-1.3/whatsnew.html
v1.2の新機能や変更点について
v1.2は2018年7月にリリースされた。主な新機能は以下の4つである。
-
Private Data Collections
チャネルメンバーのサブセット間で特定のデータ/トランザクションを機密に保つ機能。 -
Service Discovery
クライアントアプリケーションを簡素化するため、オーダラー、ピア、チェーンコード、エンドースメントポリシーなどのネットワークサービスを動的に発見する機能。 -
Access Control
チャネルごとにピア機能と相互作用できるクライアントIDを構成する機能。 -
Pluggable endorsement and validation
チェーンコードごとにプラグイン可能なエンドースメントと検証ロジックを活用する機能。
特に、Private Data Collectionsはv1.2の目玉機能である。これまでは、プライベートなデータ共有をする場合、一つのネットワーク内に「チャネル」という機能を持つ必要があった。共有範囲毎にチャネルを持つ必要があるため、参加者間で入り組んだ共有範囲を設定する場合、複数のチャネルを持たせていた。Private Data Collectionsでは、プライベートなデータを通常のブロックとは別に管理する。そのため、同一チャネル内でも一部のピアだけが データを受け取るようになり、共有範囲の設定が容易になった。
参考URL:
- https://hyperledger-fabric.readthedocs.io/en/release-1.2/whatsnew.html
- https://www.altoros.com/blog/hyperledger-fabric-v1-2-whats-new-and-roadmap-for-2018/
さらに、2018年10月にバグフィックスバージョンであるv1.2.1がリリースされた。
2019年2月現在の最新版はv1.4
2018年10月にv1.3がリリースされた。Go、Node.js以外にもJavaでChaincodeを実装できるようになった。その他にも、StateのKey単位でEndorsement Policyを指定できる機能などが追加された。 詳しくは公式ドキュメントを参照していただきたい。
参考URL:
また、2019年1月にはv1.4.0がリリースされた。
#Fabric v1.4 (v1.3/v1.2.1) サンプルの実行に必要な環境を整える
Fabricを試すにはサンプルプログラムを動かしてみるのが手っ取り早い。 ここではFabric v1.4を対象として、サンプルプログラム群 Fabric Samples を動かすためのセットアップについて解説する。
基本的には公式ドキュメントの Install Samples, Binaries and Docker Images に書いてあることの和訳および補足である。
前提条件
- MacもしくはLinux系マシン上で試すことを前提とする
- Windowsの場合はWin10ならばDockerが使える。それ以外のWindows環境ではVagrant+Virtual BoxでLinux環境を作り、その中で試すこととなる
- Docker、curl、git、bashなどの前提ソフトウェアは Prerequisites の内容にしたがってインストールされているものとする。 必ずしも各ソフトの最新バージョンで動くわけではないので注意すること。 例えばPythonはバージョン2でないと動かない。
なお、インストールされている
curl
が古いと-L
オプションを受け付けず、bootstrap.sh
の実行がエラーになるので注意。
セットアップ方法: スクリプトをダウンロードして実行するだけでよい
v1.0くらいからはサンプルの実行に必要なスクリプト、dockerイメージ、バイナリをまとめてダウンロードしてくれる bootstrap.sh
というスクリプトがFabricのソースコードに同梱されている。まだバグがあるが比較的安定して動くので使用をおすすめする。下記のコマンドではそのスクリプトをダウンロードして実行している。
~$ mkdir fabric-140
~$ cd fabric-140
~/fabric-140$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.4.0 1.4.0 0.4.14
なお、v1.4が最新である間は
... | bash
とだけ実行すればいい。
bashの引数として指定している
-s
はbootstrap.shのオプションではなく、「スクリプトを標準入力から読み込む」という、bashのオプションなので混同しないこと。 このスクリプトの引数の与え方はトリッキーなので注意すること。詳しくは後述
ちなみに、v1.3.0の環境を作りたい場合はこうする:
~$ mkdir fabric-130
~$ cd fabric-130
~/fabric-130$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.3.0 1.3.0 0.4.13
v1.2.1ならこうする:
~$ mkdir fabric-121
~$ cd fabric-121
~/fabric-121$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10
なお、このスクリプトが何をやっているかについては末尾の説明を読んでほしい。
結果の確認
このようなディレクトリ構成になっていればOK
~/fabric-140$ tree -F -L 2 .
.
└── fabric-samples/
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Jenkinsfile
├── LICENSE
├── MAINTAINERS.md
├── README.md
├── balance-transfer/
├── basic-network/
├── bin/
├── chaincode/
├── chaincode-docker-devmode/
├── commercial-paper/
├── config/
├── fabcar/
├── first-network/
├── high-throughput/
├── interest_rate_swaps/
└── scripts/
またdockerイメージに関しては、以下のコマンドを実行して、Fabricに関する以下のイメージが含まれていればOK
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-javaenv 1.4.0 3d91b3bf7118 4 weeks ago 1.75GB
hyperledger/fabric-javaenv latest 3d91b3bf7118 4 weeks ago 1.75GB
hyperledger/fabric-tools 1.4.0 0a44f4261a55 5 weeks ago 1.56GB
hyperledger/fabric-tools latest 0a44f4261a55 5 weeks ago 1.56GB
hyperledger/fabric-ccenv 1.4.0 5b31d55f5f3a 5 weeks ago 1.43GB
hyperledger/fabric-ccenv latest 5b31d55f5f3a 5 weeks ago 1.43GB
hyperledger/fabric-orderer 1.4.0 54f372205580 5 weeks ago 150MB
hyperledger/fabric-orderer latest 54f372205580 5 weeks ago 150MB
hyperledger/fabric-peer 1.4.0 304fac59b501 5 weeks ago 157MB
hyperledger/fabric-peer latest 304fac59b501 5 weeks ago 157MB
hyperledger/fabric-ca 1.4.0 1a804ab74f58 5 weeks ago 244MB
hyperledger/fabric-ca latest 1a804ab74f58 5 weeks ago 244MB
hyperledger/fabric-zookeeper 0.4.14 d36da0db87a4 4 months ago 1.43GB
hyperledger/fabric-zookeeper latest d36da0db87a4 4 months ago 1.43GB
hyperledger/fabric-kafka 0.4.14 a3b095201c66 4 months ago 1.44GB
hyperledger/fabric-kafka latest a3b095201c66 4 months ago 1.44GB
hyperledger/fabric-couchdb 0.4.14 f14f97292b4c 4 months ago 1.5GB
hyperledger/fabric-couchdb latest f14f97292b4c 4 months ago 1.5GB
これでたとえばfabcarサンプルを試すことができる。詳しくは Fabcarサンプルで学ぶHyperledger Fabric Node.js SDK (v1.2.1対応版) を見てほしい。
(本文終わり)
bootstrap.sh
動作詳細
curlコマンドでダウンロードしている短縮URLは実際は https://github.com/hyperledger/fabric/blob/release-1.4/scripts/bootstrap.sh のファイルを指している。 これがやっていることは以下の3つである:
1. Fabric-samplesのclone
Fabricのサンプルコード設定・コード集であるfabric-samples (https://github.com/hyperledger/fabric-samples) をgit cloneしてくる
注意: ここでv1.4のサンプルをチェックアウトするために、
fabric-samples
にcd
していることに注意
2. Platform-Specific Binariesのダウンロード
[1] バイナリのダウンロード
サンプルを試すために必要な、暗号鍵やジェネシスブロックを作成するためのバイナリ (通称 platform-specific binaries) をダウンロードしている
- これらはFabricのソースからビルドできるが、そうしない人向けにビルド済バージョンを配布している
- これはホストのアーキテクチャによって異なるバイナリをダウンロードするので注意
v1.4では以下のバイナリをダウンロードして fabric-samples/bin
に格納している。サンプルを試すにはここにパスを通すこと。
~/fabric-140$ ls -1 fabric-samples/bin/
configtxgen
configtxlator
cryptogen
discover
fabric-ca-client
get-docker-images.sh
idemixgen
orderer
peer
[2] コンフィグファイルのダウンロード
- Fabricネットワークの設定ファイル configtx.yaml
- ノード設定ファイル (core.yaml, orderer.yaml)
を fabric-samples/config
に格納している。これらはfabric-samplesのサンプルを動かす際に使われる
ダウンロードは (デフォルトでfabric-samplesをcloneした場合)
fabric-samples
ディレクトリで行われるので、バイナリは/fabric-samples/bin
に、設定は/fabric-samples/config
に展開される。 fabric-samplesのチェックアウトをスキップした場合にはこれらは/bin
および/config
となるが、これは想定している場所と異なるため注意する
3. Dockerイメージの取得 (pull)
- Fabric
- Fabric CA
- 3rd party
の3種類のイメージをpullしている。前者2つには「Fabricのバージョン」のタグ (例えば 1.4.0) がついており、3rd partyイメージにはそれとは独立のバージョンタグ (例えば 0.4.14)がついている。スクリプトではpullしたイメージにdocker tagコマンドでlatest
タグを付与しているので、複数バージョンのイメージを使って開発を行っている人は注意すること。
オプション
bootstrap.sh
にはオプションを指定できる。ただしbashのオプション指定方法に慣れないとハマるので注意。
-
-h
: ヘルプを表示する。これを指定したい場合にはcurl ... | bash -s -- -h
とすべし。 -
-s
: fabric-samplesのclone (上記 1.) をスキップする。これを指定したい場合にはcurl ... | bash -s 1.4.0 -s
とかcurl ... | bash -s -- -s
とすべし。 -
-b
: platform-specific binariesのダウンロード (上記 2.) をスキップする。これを指定したい場合にはcurl ... | bash -s 1.4.0 -b
とかcurl ... | bash -s -- -b
とすべし。 -
-d
: Dockerイメージのpull (上記 3.) をスキップする。これを指定したい場合にはcurl ... | bash -s 1.4.0 -d
とかcurl ... | bash -s -- -d
とすべし。
bash
の直後についている -s
はスクリプトを標準入力から読み込むためのbashのオプションであり、このスクリプトのオプションではない。引数の末尾についているのがそうである。また、オプション以外の引数がない場合に、どこまでがbashのオプションで、どこからがスクリプトのオプションかが分からないので --
を入れてbashに教える必要がある。