Hyperledger Fabricを動かしてみよう (v1.4/v1.3/v1.2.1対応版)


技術パート監修・執筆: @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つである。

- <b>Private Data Collections</b> <br>
チャネルメンバーのサブセット間で特定のデータ/トランザクションを機密に保つ機能。
- <b>Service Discovery</b> <br>
クライアントアプリケーションを簡素化するため、オーダラー、ピア、チェーンコード、エンドースメントポリシーなどのネットワークサービスを動的に発見する機能。
- <b>Access Control</b> <br>
チャネルごとにピア機能と相互作用できるクライアントIDを構成する機能。
- <b>Pluggable endorsement and validation</b> <br>
チェーンコードごとにプラグイン可能なエンドースメントと検証ロジックを活用する機能。

特に、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：
- https://hyperledger-fabric.readthedocs.io/en/release-1.3/whatsnew.html

また、2019年1月にはv1.4.0がリリースされた。

#Fabric v1.4 (v1.3/v1.2.1) サンプルの実行に必要な環境を整える
Fabricを試すにはサンプルプログラムを動かしてみるのが手っ取り早い。 ここではFabric v1.4を対象として、サンプルプログラム群 [Fabric Samples](https://github.com/hyperledger/fabric-samples) を動かすためのセットアップについて解説する。

基本的には公式ドキュメントの [Install Samples, Binaries and Docker Images](https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html) に書いてあることの和訳および補足である。

## 前提条件
- MacもしくはLinux系マシン上で試すことを前提とする 
    - Windowsの場合はWin10ならばDockerが使える。それ以外のWindows環境ではVagrant+Virtual BoxでLinux環境を作り、その中で試すこととなる
- Docker、curl、git、bashなどの前提ソフトウェアは [Prerequisites](https://hyperledger-fabric.readthedocs.io/en/release-1.4/prereqs.html) の内容にしたがってインストールされているものとする。 <b>必ずしも各ソフトの最新バージョンで動くわけではないので注意すること。</b> 例えば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

```text:ディレクトリ内容
~/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

```text:イメージ一覧
$ 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対応版)](https://qiita.com/yoshihiro-nnnn/items/a9db142f59f606977b11) を見てほしい。

(本文終わり)

# `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に教える必要がある。