Hyperledger Fabric v1.1.0で遊ぶための環境設定と動作確認方法

# 注意

> 2019/02/21現時点では `v1.4.0` が最新のため、いろいろ古い。 

(2019.02) ぜひこちらの記事群も参考にしてください。
【Hyperledger Fabric 1.2.1を動かして、ブロックチェーンの動作を確認・検証しよう】 https://qiita.com/kyoko7tam/items/6e0eea28ac8340f6897e

# 概要

~~Hyperledger Fabric (以下Fabric) のソースコードには動作確認用の `e2e_cli` (End-to-end CLI) が同梱されている。基本的にはソースをビルド後の動作確認用だが、Dockerイメージを引っ張ってくればビルドしなくても動く。
以下その方法。~~

Fabric v1.1.0リリース版で実験するための環境設定方法。以下の3ステップを行う。ただサンプルで遊ぶだけならFabricのソースは不要なのでスキップしてよい。Dockerイメージ、platform binaries、`fabric-samples`は必要。

1. Fabric v1.1.0のソースコードをダウンロード
1. Dockerイメージとplatform binariesのダウンロード 
1. `fabric-samples`のダウンロード 
1. 確認のため、`basic-network`を動かしてみる
2. 確認のため、[Build Your First Network (BYFN) を試してみる](https://qiita.com/shinsa82/items/28e98bde12071bbca4b2)

## 前提条件

Mac OS X El Capitanで試した。

- git
- Docker CE
- Docker Compose

以下、適当な作業ディレクトリ `WORK` で行うものとする。

```bash
cd $WORK
```

## Fabric v1.1.0のソースコードをダウンロード

Cloneの際、ブランチに `release-1.1` を指定するのがポイントである。
**注意: タグ v1.1.0 をクローンするのは、いくつかのファイルが古いのでうまくいかない**

```bash
# --depth=1 を指定すると過去のコミットを取らないので速い
git clone -b release-1.1 --depth=1 https://github.com/hyperledger/fabric.git
```

# Dockerイメージとplatform binariesのダウンロード 

```bash
# 作業用のディレクトリを別に作っておいたほうがいい 
cd $WORK
mkdir work && cd work

# (ローカルでビルドしない場合) Dockerイメージをpullし、platform binariesをダウンロード
# Fabricのイメージはタグ1.1.0、サードパーティのイメージはタグ0.4.6をpullする
# Pullされたイメージにはdocker tagコマンドによりlatestタグが付くので注意
../fabric/scripts/bootstrap.sh

# Platform binariesにパスを通す
export PATH=$WORK/work/bin:$PATH
```

Pullされたイメージは以下の通り:

```
hyperledger/fabric-ca          latest              72617b4fa9b4        2 months ago        299MB
hyperledger/fabric-ca          x86_64-1.1.0        72617b4fa9b4        2 months ago        299MB
hyperledger/fabric-tools       latest              b7bfddf508bc        2 months ago        1.46GB
hyperledger/fabric-tools       x86_64-1.1.0        b7bfddf508bc        2 months ago        1.46GB
hyperledger/fabric-orderer     latest              ce0c810df36a        2 months ago        180MB
hyperledger/fabric-orderer     x86_64-1.1.0        ce0c810df36a        2 months ago        180MB
hyperledger/fabric-peer        latest              b023f9be0771        2 months ago        187MB
hyperledger/fabric-peer        x86_64-1.1.0        b023f9be0771        2 months ago        187MB
hyperledger/fabric-javaenv     latest              82098abb1a17        2 months ago        1.52GB
hyperledger/fabric-javaenv     x86_64-1.1.0        82098abb1a17        2 months ago        1.52GB
hyperledger/fabric-ccenv       latest              c8b4909d8d46        2 months ago        1.39GB
hyperledger/fabric-ccenv       x86_64-1.1.0        c8b4909d8d46        2 months ago        1.39GB
hyperledger/fabric-zookeeper   latest              92cbb952b6f8        2 months ago        1.39GB
hyperledger/fabric-zookeeper   x86_64-0.4.6        92cbb952b6f8        2 months ago        1.39GB
hyperledger/fabric-kafka       latest              554c591b86a8        2 months ago        1.4GB
hyperledger/fabric-kafka       x86_64-0.4.6        554c591b86a8        2 months ago        1.4GB
hyperledger/fabric-couchdb     latest              7e73c828fc5b        2 months ago        1.56GB
hyperledger/fabric-couchdb     x86_64-0.4.6        7e73c828fc5b        2 months ago        1.56GB
```

また、platform binariesにはpeerコマンド自身も含まれているので、バージョンを表示してみるとこのようになる:

```
$ peer version
peer:
 Version: 1.1.0
 Go version: go1.9.2
 OS/Arch: darwin/amd64
 Experimental features: false
 Chaincode:
  Base Image Version: 0.4.6
  Base Docker Namespace: hyperledger
  Base Docker Label: org.hyperledger.fabric
  Docker Namespace: hyperledger

2018-05-15 17:11:02.034 JST [main] main -> INFO 001 Exiting.....
```
たとえばprivate ledger機能を試すには、"Experimental features" がtrueになるように再ビルドする必要がある (たぶん)。

## fabric-samplesのダウンロード 
```bash
cd $WORK
git clone -b release-1.1 --depth=1 https://github.com/hyperledger/fabric-samples.git
```

## 確認のため、`basic-network`を動かしてみる

```bash
cd $WORK
cd fabric-samples/basic-network

# スタート
start.sh

# ストップ。コンテナを止めるだけ
stop.sh

# 停止したコンテナなどを消すなどしたければこちら。`docker rmi`のエラーが出るけど気にしない
# これはこのスクリプトが他のサンプルと共用のため余計なコマンドが入っている
teardown.sh
```

`basic-network`はpeer 1台、CouchDB 1台、orderer 1台、CA 1台を立ち上げるシンプルな設定である。起動されると以下の動作を行う:

- peer0から唯一のチャネル`mychannel`を`peer channel create`コマンドで作成する
- peer0をそのチャネルに`peer channel join`コマンドで参加させる

特にチェーンコードをデプロイしたり呼び出すということはしていない。

### 動いているコンテナの確認

```
$ docker-compose ps
         Name                       Command               State                       Ports                     
----------------------------------------------------------------------------------------------------------------
ca.example.com           sh -c fabric-ca-server sta ...   Up      0.0.0.0:7054->7054/tcp                        
couchdb                  tini -- /docker-entrypoint ...   Up      4369/tcp, 0.0.0.0:5984->5984/tcp, 9100/tcp    
orderer.example.com      orderer                          Up      0.0.0.0:7050->7050/tcp                        
peer0.org1.example.com   peer node start                  Up      0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp
```

### ログの確認

特定のコンテナのログが見たいときはその名前を指定する。`-f`を指定するとtailモードになる。

```
$ docker-compose logs
peer0.org1.example.com    | 2018-05-15 08:32:00.738 UTC [nodeCmd] serve -> INFO 001 Starting peer:
peer0.org1.example.com    |  Version: 1.1.0
peer0.org1.example.com    |  Go version: go1.9.2
peer0.org1.example.com    |  OS/Arch: linux/amd64
peer0.org1.example.com    |  Experimental features: false
peer0.org1.example.com    |  Chaincode:
peer0.org1.example.com    |   Base Image Version: 0.4.6
peer0.org1.example.com    |   Base Docker Namespace: hyperledger
peer0.org1.example.com    |   Base Docker Label: org.hyperledger.fabric
peer0.org1.example.com    |   Docker Namespace: hyperledger
peer0.org1.example.com    | 
peer0.org1.example.com    | 2018-05-15 08:32:00.741 UTC [ledgermgmt] initialize -> INFO 002 Initializing ledger mgmt
peer0.org1.example.com    | 2018-05-15 08:32:00.742 UTC [kvledger] NewProvider -> INFO 003 Initializing ledger provider
peer0.org1.example.com    | 2018-05-15 08:32:00.801 UTC [couchdb] handleRequest -> WARN 004 Retrying couchdb request in 125ms. Attempt:1  Error:Get http://couchdb:5984/: dial tcp 172.23.0.3:5984: getsockopt: connection refused
(略)
orderer.example.com       | 2018-05-15 08:32:18.479 UTC [policies] Evaluate -> DEBU 31c Signature set satisfies policy /Channel/Readers
orderer.example.com       | 2018-05-15 08:32:18.480 UTC [policies] Evaluate -> DEBU 31d == Done Evaluating *policies.implicitMetaPolicy Policy /Channel/Readers
orderer.example.com       | 2018-05-15 08:32:18.480 UTC [common/deliver] deliverBlocks -> DEBU 31e [channel: mychannel] Received seekInfo (0xc42010c220) start:<specified:<number:1 > > stop:<specified:<number:18446744073709551615 > >  from 172.23.0.5:38980
orderer.example.com       | 2018-05-15 08:32:18.480 UTC [fsblkstorage] waitForBlock -> DEBU 31f Going to wait for newer blocks. maxAvailaBlockNumber=[0], waitForBlockNum=[1]
```

### peer CLI

peer0が参加しているチャネルの一覧を取得するには`docker exec`を使用して`peer channel list`コマンドを実行する:

```bash
$ docker exec peer0.org1.example.com peer channel list
2018-05-15 08:48:07.033 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined: 
mychannel
2018-05-15 08:48:07.059 UTC [main] main -> INFO 002 Exiting.....
```