Vagrantを使ってHyperledger fabric v0.5のサンプルチェーンコードを試す

# はじめに
v0.5-developer-previewを試してみましたので手順をまとめておきます。
最新版はv1.1.0があるのでだいぶ古い(v0.5は2016年にリリースされた)ようですがとりあえず試したいだけならこれでも大丈夫かと思います。

参考書籍：[ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術](https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E7%90%86%E8%AB%96-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AD%A6%E3%81%B6FinTech%E3%81%AE%E3%82%B3%E3%82%A2%E6%8A%80%E8%A1%93-%E8%B5%A4%E7%BE%BD%E5%96%9C%E6%B2%BB-%E7%B7%A8%E8%91%97/dp/4865940405/ref=sr_1_1?ie=UTF8&qid=1523285672&sr=8-1&keywords=%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E7%90%86%E8%AB%96)

# 環境

- Mac
- Vagrant 2.0.3
- Hyperledger fabric v0.5-developer-preview
- go version go1.10.1 darwin/amd64

# Go言語のセットアップ
以下記事がわかりやすいですのでそのまま参照しセットアップします。
[[Go] MacにGo言語をインストール＆セットアップする](https://www.yoheim.net/blog.php?q=20161203)

# リポジトリの用意

archveされているv0.5-developer-previewというブランチをローカルに用意します。

```
$ git clone https://github.com/hyperledger-archives/fabric.git
$ cd fabric/
$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/test-release
  origin/v0.5-developer-preview <= これを使います
$ git checkout -b v0.5-developer-preview origin/v0.5-developer-preview
Checking out files: 100% (421/421), done.
Branch v0.5-developer-preview set up to track remote branch v0.5-developer-preview from origin.
Switched to a new branch 'v0.5-developer-preview'
$ git branch
  master
* v0.5-developer-preview <= ブランチ切り替え完了
```

# setup.shの修正
devenv/setup.sh b/devenv/setup.shを修正します。
v0.5-developer-previewで利用しているdockerのAPIが削除されているためdockerのバージョンを明示して対応します。
修正結果は以下の通りです、docker-engine=1.10.2-0~trustyとなっている部分です。

```
$ git diff
diff --git a/devenv/setup.sh b/devenv/setup.sh
index 90f5437..e2e3800 100755
--- a/devenv/setup.sh
+++ b/devenv/setup.sh
@@ -67,7 +67,8 @@ case "${DOCKER_STORAGE_BACKEND}" in
 esac
 
 # Install docker
-apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine
+# apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine
+apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine=1.10.2-0~trusty
```

# Vagrant起動
初回起動時は少し時間がかかります。

```
$ cd devenv/
$ vagrant up
$ vagrant ssh
```

※以降の作業はVagrantで起動したサーバ上で作業します。

# CAサーバの起動
認証サーバの用意を進めます。
(Hyperledgerはパーミッション型ネットワーク)

```
$ cd $GOPATH/src/github.com/hyperledger/fabric/
$ make membersrvc
$ membersrvc
```

# Validating Peer起動
※以下作業は別ターミナルで実施

Peerはビルド済みのため起動コマンドを実行します。
こちらはブロックを作成するノードの役割になります。

```
$ CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer node start --peer-chaincodedev
```

# チェーンコードのビルド
※以下作業は別ターミナルで実施
サンプルのchaincode_example02というチェーンコードプロセスを起動します。
(Fabricの中ではこのチェーンコードでスマートコントラクトを実装している)

```
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/
$ go build
$ CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:30303 ./chaincode_example02 
```

# CAサーバにログイン
※以下作業は別ターミナルで実施
CAサーバにログインをします。
なお初期アカウント情報はfabric/membersrvc/membersrvc.yamlに記載されています。

```
$ peer network login jim -p 6avZQLwcUe9b <= 初期設定されているアカウント
2018/04/09 14:44:35 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
14:44:35.615 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
14:44:35.632 [main] networkLogin -> INFO 003 CLI client login...
14:44:35.632 [main] networkLogin -> INFO 004 Local data store for client loginToken: /var/hyperledger/production/client/
14:44:35.633 [main] networkLogin -> INFO 005 Logging in user 'jim' on CLI interface...
14:44:35.768 [main] networkLogin -> INFO 006 Storing login token for user 'jim'.
14:44:35.768 [main] networkLogin -> INFO 007 Login successful for user 'jim'.
14:44:35.768 [main] main -> INFO 008 Exiting.....
```

# デプロイトランザクションの実行
下記コマンドでブロックチェーンネットワークにデプロイしValidating Peerがチェーンコードを実行できるようになります。
コマンドが正常に実行されると、Harutoに100、Yuiに200という設定の状態になります。

```
$ CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -l golang -n mycc -c '{"Function":"init", "Args":["Haruto", "100", "Yui", "200"]}'
2018/04/09 14:45:57 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
14:45:58.038 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
mycc
```

## Invokeトランザクション実行

実際に取引を実行するコマンドです。
以下はHarutoからYuiに10送金する取引となります。

```
$ CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Function":"invoke", "Args":["Haruto", "Yui", "10"]}'
2018/04/09 14:46:06 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
14:46:06.784 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
9b9451e4-d13b-44b0-a603-35e1ed371f54
```

## Queryトランザクションの実行

以下は所持金を参照し送金が実行されたことを確認するコマンドです。
Harutoから送金がされているはずですので90となっていればOK。

```
$ CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function":"query", "Args":["Haruto"]}'
2018/04/09 14:46:15 Load docker HostConfig: %+v &{[] [] []  [] false map[] [] false [] [] [] [] host    { 0} [] { map[]} false []  0 0 0 false 0    0 0 0 []}
14:46:15.980 [crypto] main -> INFO 002 Log level recognized 'info', set to INFO
90
```

# まとめ
Vagrantfileの用意があるため非常に手軽にサンプルを試すことができました。
最新版のFabricはv1.1のようですのでまたこちらも試してみようと思います。