Hyperledger Fabric/Hyperledger ComposerをGCP環境へ導入する(2019/2時点)

#記事を書いたきっかけ
ブロックチェーンに興味があり、調べてみるとオープンソースのHyperledgerを使えば比較的に簡単に自分のアプリケーションが作れるようだったので、試してみようと思ったこと。
Google Cloud PlatformへのHyperledger導入、という記事があまりなさそうだったので、備忘のためにもその手順を記録しておくことにする。
Linux？何それ？っていう超初心者の自分が分かるように書いてるのでかなり冗長になってます、悪しからず。
(注)Hyperledgerとは何ぞや？という方には以下公式ドキュメントをお勧めします、英語ですが。
https://hyperledger-fabric.readthedocs.io/en/latest/getting_started.html

#今回出来たこと
GCPで立ち上げたVMインスタンス上に無事にHyperledger関連の環境をインストール出来た。

#先に感想
・Linux慣れない、CUI慣れない
・公式ドキュメントすげぇ！(当たり前だ)
・分からないことがあってもググりまくれば何とかなる！
・これからHyperledgerを使ってたくさん遊んでみようと思います。

#作業内容

こちらが公式ドキュメント。
https://hyperledger.github.io/composer/latest/installing/installing-index
基本的にはここの手順に沿ってやれば大丈夫なはず。

###①GCPでVMインスタンスを立ち上げる
Ubuntu 18.04 LTSのインスタンスを立ち上げた。

###②必要な環境を導入
https://hyperledger.github.io/composer/latest/installing/installing-prereqs.html
こちらに沿って作業。どうやら
・Docker Engine
・Docker-Compose
・Node
・npm
・git
・Python
が必要らしい。一つずつ作業していくつもりだったが、Ubuntuであれば以下3行のコードを書くだけで導入してくれるようだ、便利！

```
(input)
curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh
chmod u+x prereqs-ubuntu.sh
./prereqs-ubuntu.sh

(output)
Installation completed, versions installed are:
Node:           v8.15.0
npm:            6.4.1
Docker:         Docker version 18.09.2, build 6247962
Docker Compose: docker-compose version 1.13.0, build 1719ceb
Python:         Python 2.7.12
Please logout then login before continuing.
```

更に色々な記事を見ていると、Hyperledger Fabricでの作業にはGo言語のインストールも必要の模様(Composerであれば不要？)
以下記事を参照してインストール。
(1年目エンジニアがHyperledger-Fabricのサンプルを触ってみた！（準備編）)
https://qiita.com/wakiwaki/items/c3cd98613fe79f0bc86f
(Hyperledger Fabric 1.3 と Hyperledger Exploror をインストールしてみる。)
https://qiita.com/afukatamb/items/f0dbc524ba01d82f31e0

```
(input)
sudo wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
sudo tar -C ~/ -xzf ~/go1.11.4.linux-amd64.tar.gz
sudo apt install golang-go
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
vi ~/.profile
#以下記述を追加(iでインサートモードにして編集、esc->:wq->enterで保存して閉じる)
　PATH=$PATH:/usr/local/go/bin
　GOPATH=$HOME/go
```



###③開発環境を導入
https://hyperledger.github.io/composer/latest/installing/development-tools.html
ここでは開発ツールをインストールする。
####・CLIツール
CLIって何？と思って調べたらコマンドラインツールの略だった。「composer-cli」というものをインストールする。
上記に引き続いて以下コードを入力したところ、「npmが未インストール！」というエラーが出た。
一旦ターミナルを終了し、再度SSHで接続したところうまく動作した。
インストール&再起動は基本動作だが、そこを見落とすのが初心者。。。
(わざわざGCPコンソールでインスタンスのリセットをしていたが、sudo rebootで再起動できることを後から知った)

```
(input)
npm install -g composer-cli@0.20
npm install -g composer-rest-server@0.20
npm install -g generator-hyperledger-composer@0.20
npm install -g yo
```

####・Playground
ブロックチェーンのネットワークを定義したり、編集したり出来るツールらしい。

```
(input)
npm install -g composer-playground@0.20

(output)
Success: "/home/<user>/.nvm/versions/node/v8.15.0/lib/node_modules/composer-playground/node_modules/gr
pc/src/node/extension_binary/node-v57-linux-x64-glibc/grpc_node.node" is installed via remote
+ composer-playground@0.20.7
added 770 packages from 599 contributors in 57.442s
```

####・IDE
Visual Studio Code(VSCode)がお勧めされているが、「ターミナルでどうやったらええんじゃ！」と叫ぶLinux初心者。。。
https://code.visualstudio.com/download
色々調べてみたところ公式ドキュメントを発見！curlを使えばよいらしい。さっき使った気がする。。。
https://code.visualstudio.com/docs/setup/linux
以下記事も参考にさせて頂いた。
(Visual Studio Code for Linux を WSL 上の Ubuntu 16.04 LTS にインストールする)
https://tech.xeres.jp/2018/05/30/installing-vscode-for-linux-in-wsl-ubuntu-16.04-lts/

```
(input)
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo cp microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
rm microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

sudo apt update

sudo apt install -y lib{gtk2.0-0,xss1,asound2}
sudo apt install -y code
```

そしてまた再起動して、、、

```
(input)
code
```

ん？何もでてこない？何でだ？よくわからんが、VSCodeはCUIでは動かないのか？(そりゃそうか)
とりあえずGUI環境をGCPに入れてみよう。
以下記事を参考にしました。
(GCP に ubuntu 17.10 デスクトップ環境を作り iPad から Remote Desktopで使ってみた)
https://qiita.com/toronya/items/6136f1a3ed4f87668e36

```
(input)
#1行ずつ入力&実行しないと、「Do you want to continue? [Y/n]」でYが入れられなくてハマる
#<>の部分は自分で変えて下さい、こんなところでも超初心者はハマります(例：<好きなユーザ名>->remoteusr)
sudo apt-get install gnome-core gnome-shell gnome-software gnome-panel
sudo apt install xrdp
sudo adduser <好きなユーザ名>
sudo gpasswd -a <上で入れたユーザ名> sudo
#ターミナルを再起動する
sudo vim /etc/X11/Xwrapper.config
#以下記述を追加(iでインサートモードにして編集、esc->:wq->enterで保存して閉じる)
  allowed_user=anybody

(output)
ユーザ追加で「Enter new UNIX password:」が出るので、好きなパスワードを設定して下さい。 
```

このままだとxRDPがうまく動かないようなので、以下を参照して対応。
https://cpoint-lab.co.jp/article/201806/ubuntu-18-04%E3%81%AB-xrdp%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

```
(input)
sudo sed -e 's/^new_cursors=true/new_cursors=false/g' \
 -i /etc/xrdp/xrdp.ini
sudo systemctl restart xrdp
D=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop

cat <<EOF > ~/.xsessionrc
 export GNOME_SHELL_SESSION_MODE=ubuntu
 export XDG_CURRENT_DESKTOP=ubuntu:GNOME
 export XDG_DATA_DIRS=${D}
 export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF

cat <<EOF | \
   sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
 [Netowrkmanager]
 Identity=unix-user:*
 Action=org.freedesktop.color-manager.create-device
 ResultAny=no
 ResultInactive=no
 ResultActive=yes
EOF
 
sudo systemctl restart polkit
```

Windowsマシンからは以下手順でこのUbuntu環境へリモートデスクトップとしてアクセス可能。
　ファイル名を指定して実行(Windowsキー+R)
　->mstscを指定してリモートデスクトップクライアントを起動
　->GCPのVMインスタンスに表示されている外部IPを入力
　->SessionはXorgとし、先ほど作成したユーザ名とパスワードを入力

これでデスクトップが開いた！ここから左上のActivitiesをクリックし、Show Applicationをクリックすると確かにVisual Studio Codeがインストールされているのが確認できた！やったね！
しかしVSCodeとGUI環境インストールで2時間ほどハマってしまった、長かった。。。


####・Hyperledger Fabric
ようやくここまでたどり着きました！
公式ドキュメントの指示通り、fabric-dev-serversというディレクトリを作成してインストール

```
(input)
mkdir ~/fabric-dev-servers && cd ~/fabric-dev-servers

curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
tar -xvf fabric-dev-servers.tar.gz
cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./downloadFabric.sh
```
、、、これだとversion1.2がインストールされるが、最新versionは1.4なのでそっちを入れたい。
Fabricの方のチュートリアルの通り、サンプル含めインストールしてみよう。
https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html

```
(input)
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.4.0
export PATH=$HOME/fabric-samples/bin:$PATH
vi ~/.profile
#以下記述を追加(iでインサートモードにして編集、esc->:wq->enterで保存して閉じる)
　PATH=$HOME/fabric-samples/bin:$PATH
```

#動作確認
ここまでで一通りインストールが完了したので、Hyperledger Fabricが動作することを確認する。
以下記事を参照した。
(Hyperledger Fabric v1.1.0で遊ぶための環境設定と動作確認方法)
https://qiita.com/shinsa82/items/d3734bf05a549b6c2ee6#%E7%A2%BA%E8%AA%8D%E3%81%AE%E3%81%9F%E3%82%81basic-network%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B

####サンプルネットワーク起動
```
(input)
cd fabric-samples/basic-network
./start.sh
```
####ネットワークの確認
```
(input)
docker-compose ps

(output)
          Name                       Command                      State                       Ports           
-------------------------------------------------------------------------------------------------------------
ca.example.com              sh -c fabric-ca-server      Up                          0.0.0.0:7054->7054/tcp    
                            sta ...                                                                           
couchdb                     tini -- /docker-            Up                          4369/tcp,                 
                            entrypoint ...                                          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,   
```



####サンプルネットワーク停止
```
./stop.sh
```
ネットワークが動いていることを確認できた！
ついでにPlaygroundも起動してみよう。
以下IBMのチュートリアルを参照した。
https://www.ibm.com/developerworks/jp/cloud/library/cl-model-test-your-blockchain-network-with-hyperledger-composer-playground/index.html

```
(input)
docker run --name composer-playground --publish 8080:8080 hyperledger/composer-playground
```
この状態でリモートデスクトップからFirefoxを立ち上げ、http://localhost:8080 へアクセスするとちゃんとPlaygroundが立ち上がった！感動！


#最後に
ここまで読んで頂いた方、本当にありがとうございます。
初心者がハマった部分についても記載しておく方が誰かの役に立つかと思い長々と記載しました。
無駄な部分が多いと思うので、ご指摘頂けると非常にありがたいです！
次は実際にHyperledgerで遊んでみた感想を書きたいと思っています。