【EC2】Hyperledger Fabric v1.4.4 チュートリアル環境構築

# 環境
- EC2（Amazon Linux 2）
- Docker v18.09
- Docker-compose v1.24
- Go lang v1.12
- Node.js v8.9.4
- npm v5.6.0
- Python v2.7
- Hyperledger Fabric v1.4.4

# Fabcarディレクトリ構成
- Chaincodeファイル
~/fabric-samples/chaincode/fabcar/go/配下
~/fabric-samples/chaincode/fabcar/javascript/lib/配下

- Chaincode実行用SDKファイル
~/fabric-samples/fabcar/javascript/配下

# Docker, Docker-composeインストール
### 1.パッケージのアップデート

```
$ sudo yum -y update
```

### 2.Dockerインストール

```
# インストール
$ sudo yum install -y docker

# dockerグループにユーザーを登録
$ sudo usermod -a -G docker ec2-user 

# 確認
$ cat /etc/group | grep docker
```

### 3.Docker-composeインストール→Docker起動

```
# インストール
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# バイナリに対して実行権限付与
$ sudo chmod +x /usr/local/bin/docker-compose

# 確認
$ docker-compose -v

# Docker起動
$ sudo service docker start

# 一度ログアウトして、dockerの環境情報を確認
$ docker info
```
# Nodebrew（nvm）インストール
Nodebrewの場合

```
# インストール
$ curl -L git.io/nodebrew | perl - setup

# PATH通す
$ export PATH=$HOME/.nodebrew/current/bin:$PATH >> ~/.bash_profile

# 使用するNode.js(npm)のバージョン指定
$ nodebrew install-binary v8.9.4
$ nodebrew use v8.9.4
```

nvmの場合

```
# nvmインストール
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

# nvmバージョン&インストール可能Node.jsバージョンの確認
$ nvm --version
$ nvm ls-remote

# 使用するNode.js(npm)のバージョンをインストール
$ nvm install v8.9.4
```

お好きな方で構築してください。

# Goインストール
```
# インストール
$ sudo yum install golang

# PATH通す
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOPATH/bin

# 確認
$ echo $GOPATH
$ go version
```

# Fabricチュートリアル
### 1.ネットワーク起動
startFabric.shを実行することで、peer（Chaincodeを実行するコンテナ）やorderer（Chaincodeの実行順序を制御するコンテナ）、CA（アカウントを管理するコンテナ）用のDockerコンテナが起動し、peerにChaincodeをインストール/インスタンス化/初期化するところまでやってくれます。


```
# サンプルプログラムのインストール
$ curl -sSL http://bit.ly/2ysbOFE | bash -s // バージョン指定しない場合最新版インストール（2019/12/23時点: v1.4.4）→今回はこっち
$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.4.1  // バージョン指定する場合

$ cd fabric-samples/fabcar

# ブロックチェーンネットワークの起動
$ ./startFabric.sh javascript

# 起動コンテナの確認
$ docker ps --format "{{.Names}}"
```

ちなみにEC2のインスタンスタイプがt2.microではメモリ不足でChaincodeをインストールできないので、t3a.small（自分はこれでできました）以上にしましょう。

### 2.Chaincodeの確認
ちゃんとインスタンス化までできているか確認してみましょう。

```
# インストール済みChaincode確認
$ docker exec cli peer chaincode list --installed

# インスタンス化済みChaincode確認
$ docker exec cli peer chaincode list --instantiated -C mychannel
```

### 3.Chaincodeの実行
コンテナにインストールされたChaincodeを叩きにいきます。

```
# サンプルプログラムのディレクトリに移動
$ cd javascript

# ライブラリのインストール
$ npm install  // npm ERR!がでて、'fabric-network'を正常にインストールできていない場合、gccをインストールしてみる
$ sudo yum install gcc-c++

# gRPCバイナリをインストール
$ npm rebuild

# ユーザー作成&登録
$ node enrollAdmin.js
$ node registerUser.js
$ ls wallet
admin  user1

# 台帳（StateDB）のデータを参照
$ node query.js

# 台帳（StateDB）のデータを更新
$ node invoke.js

# ブロックチェーンネットワークの停止
$ cd ../../basic-network
$ ./stop.sh
```

npm installするときは、gccインストールするのを忘れずに。
次回はより実践的な内容で、Chaincodeを自作する（Node.js）記事でも書いてみます。


# 参考
参考になる記事が少ないので、オフィシャルドキュメントを参考にすることをおすすめします（一つ目）。
[peer chaincode - Hyperledger Fabric docs - Read the Docs](https://hyperledger-fabric.readthedocs.io/en/release-1.4/commands/peerchaincode.html)
[Hyperledger Fabric v1.4 のプログラミングモデル](https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-6/index.html)
[AWSのEC2でDockerを試してみる](https://qiita.com/yumatsud/items/33bc22f7d8f640a286f4)