Macでブロックチェーンに触れてみた (Hyperledger-fabric)

#Macでブロックチェーンを動かしてみる
Hyperledger FabricはDockerコンテナとしてあるので、それをMacOSで利用することができます。
環境構築を行い、サンプル実行までの方法をまとめています。
サンプル実行できたらOKって感じなので中身は薄いです。
公式サンプルの「fabcar」でHyperledger Fabricの動作確認を行っていきます。
自分の環境では、以下の手順でいけました！
#Go, node, Git, npmのバージョン

インストール前にそれぞれのバージョンを記載しておきました。
参考にしてください。

 
```:go
$ go version
go version go1.9.1 darwin/amd64
```

```:node
$ node -v
v8.11.4
```

```:Git
$ git --version
git version 2.14.3 (Apple Git-98)
```

```:npm
$ npm -v
3.10.10
```
Dockerは最新のやつで大丈夫そう。

#Go,nodebrew, Docker, npmのインストール
##Goのインストール

```:Homebrewでインストール
＄brew install go
```
```:パスを通す
$ echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile
$ source ~/.bash_profile
```

##nodebrewのインストール

```:culrでインストール
$ curl -L git.io/nodebrew | perl - setup
```
```:nodeのバージョン一覧表示
nodebrew ls-remote
```
インストール可能なバージョンの一覧が表示されます。


```:バージョン指定してnodeをインストール
$ nodebrew install-binary v8.11.4
```
```:lsでインストール済みの一覧表示
$ nodebrew ls
v6.2.1
v8.1.0
v8.11.4
v8.15.1
v10.12.0

current: v8.11.4

```
currentが現在利用中のバージョンとなっています。

##Dockerのインストール
公式サイトからDocker for Macをインストールしました。
[Docker for Mac](https://docs.docker.com/docker-for-mac/install/)
とりあえずインストールできたらOKです。

#Hyperledger Fabricの環境構築
ここから環境構築していきます。
##
```:ディレクトリを作成
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
```

```:Gitリポジトリのコピーを取得
＄ git clone https://github.com/hyperledger/fabric.git
＄ cd fabric
```
```:ブランチを切り替える
＄ git branch
* release-1.4
＄ git checkout ae4e37d
$ git branch
* (HEAD detached at ae4e37dba)
  release-1.4
```
[git branch] で現在のブランチ名の左側に「*」が表示されます。
[git checkout ブランチ名 (ここではae4e37dというハッシュ値) ] でブランチを切り替えて、
[git branch]で確認してみると切り替わっていることが確認できます。

```:ディレクトリを移動し、buildする
＄ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ go build --tags nopkcs11 ./
```
buildは何も出力がなかったら成功です。
#サンプルの実行準備
公式サンプルの「fabcar」でHyperledger Fabricの動作確認を行っていきます。
ここではその準備を行っていきます。

```:fabric-samplesの取得
$ git clone https://github.com/hyperledger/fabric-samples.git -b v1.0.6

```
```:fabcarサンプルのセットアップ
$ cd fabric-samples/fabcar/
$ npm install
   (略)
 (warningは無視)
```
セットアップスクリプトを実行する前にDockerを起動しておきます。
F4を押してアプリケーション一覧の中から起動します。
![スクリーンショット 2019-04-10 17.15.37.png](https://qiita-image-store.s3.amazonaws.com/0/393221/6571db17-7c63-2663-835d-633b430a8493.png)

```:セットアップスクリプトを実行
./startFabric.sh
```
[docker ps] で起動しているコンテナを確認します。

```:コンテナが起動しているか確認
$ docker ps --format "{{.Names}}"
dev-peer0.org1.example.com-fabcar-1.0
cli
peer0.org1.example.com
couchdb
orderer.example.com
ca.example.com
```
6個起動していればOKです。
#サンプルの実行
いよいよサンプルの実行です。

```:管理ユーザadminの登録
$ node enrollAdmin.js
      (略)
Successfully enrolled admin user "admin"
      (略)
```
```:一般ユーザuser1の登録
$ node registerUser.js 
      (略)
Successfully loaded admin from persistence
Successfully registered user1 - secret:beiNjAAEqimU
Successfully enrolled member user "user1" 
User1 was successfully registered and enrolled and is ready to intreact with the fabric network
```
```:ユーザuser1として全データの問い合わせを行い、結果を表示
$ node query.js 
      (略)
Successfully loaded user1 from persistence
Query has completed, checking results
Response is  [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},
{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},
{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},
{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},
{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},
{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},
{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},
{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},
{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},
{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]


```
何やら、車の情報がたくさん出力されました。これでHyperledger Fabricのサンプルは実行できました。
SDK for Node.jsを利用した、Hyperledger FabricとのやりとりによってState DBの内容を取得しているそうです。詳しくは勉強中なので今後まとめていきたいと思います。