IBMのメインフレームでBlockchainを動かしてみた。(Hyperledger Fabric and Hyperledger Composer on LinuxONE) Part1

#はじめに
Blockchainにおけるアプリケーション開発手順を学習しようと思った際に、なかなか適切な資料が見つかりませんでした。そんな時、無償で使えるクラウド上のIBMのメインフレームのLinuxを使用した資料 [Hyperledger Fabric and Hyperledger Composer on LinuxONE](https://github.com/IBM/hyperledger-fabric-on-linux-one?cm_sp=IBMCode-_-run-blockchain-technology-on-a-linux-mainframe-_-Get-the-Code) を見つけて、社内のグループ学習の教材に使用しました。 この度、この資料の管理者から日本語化の許可が得られたので、こちらに紹介します。


**アーキテクチャ**

![FlowDiagram.png](https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/FlowDiagram.png?raw=true)
    1. LinuxONE Community Cloudへのアクセス申請を行います。（無料、ユーザー登録要)
    2. クラウド上にLinuxゲストを作成します。
    3. GitHubからスクリプトをクローンしてセットアップ用スクリプトを実行します。
    4. GitHubから必要なファイルをインポートしてHyperledger Composerにプロジェクトを作成します。
    5. Node-REDを介して、APIおよびBlockchainとのやりとりを行います。

***アプリケーションの概要***
このブロックチェーンの学習ガイドは、Hyperledger Composerを使用して開発者がHyperledger Fabricとやりとりする基本的な方法を理解することを目的としています。 この手順では、Hyperledger Composerのブラウザで動かせる統合開発環境(IDE)でチェーンコードの開発を行い、またHyperledger ComposerのReST-fulインターフェイスを利用して、クライアントアプリケーションとHyperledger Fabricの接続方法についてを学びます。

このガイドは３つのパートで構成されています。
Part 1 - LinuxONE Community Cloud guestのセットアップ方法
Part 2 - [ブロックチェーンアプリケーションの作成とAPIの生成](https://qiita.com/truepot/private/38546c196fa3740282fd)
Part 3 - [Node-REDによるブロックチェーンAPIの活用](https://qiita.com/truepot/private/e59a8da65dc5395144f2)

**シナリオの概要**
このアプリケーション例では、サーモスタット(温度調整の装置)と温度計をシミュレートして温度データを提供します。
実世界のシナリオでは、自宅やオフィスビルの中の温度センサーに置き換えて考えられます。センサーは、APIを介してNest　(補足：Google傘下のネストラボ社が販売するスマートホーム対応製品で、部屋を希望どおりの室温にしたりできる）または他のスマートホームデバイスのような実際のサーモスタットに接続することができます。 家族、家庭、友人または子供が過度に空調や熱を逃がさないようにするには、Hyperledger Fabric上で実行されているスマートコントラクト（契約書)で定義されたトランザクションを実行して、サーモスタットを調整する権限があるかどうかをまず調べる必要があります。このスマートコントラクトは、温度計のために台帳に記録された値をチェックして、サーモスタットの調整が環境に優しいものであるかどうかを判断します。
次に、アプリケーションはWeather.comに統合され、その地域の実際の気温をチェックし、スマートコントラクトの条件に基づいてサーモスタットを理想的な設定に調整します。

**注意事項**
この学習ガイドは、2018年10月時点でHyperledger Fabric V1.2およびHyperledger Composer V0.20.4で稼働することを確認していますが、ソフトウェアは随時更新されているため、組み合わせによってスクリプトの修正等が必要な場合があることをご了承ください。

**当ガイドで使用される基本的な用語**
**台帳：**
Blockchainのトランザクション(取引)の記録でトランザクションをブロック単位で追加していく。ブロックには以前までのブロックのハッシュ値が付加されていて、勝手にブロックを追加することはできない。参加者全員がそれぞれ台帳を保有していることで合意無く改ざんされることがない。
**アセット：**
Blockchain上で管理される資産。（APIで取得される外気温や湿度から算出された推奨値、センサーで取得する室温、チームIDなど）
**ピアー(Peer)：**
台帳を保有し、トランザクション(取引)による台帳更新の合意を行うBlockchainの参加者。
**スマートコントラクト：**
Blockchainで定義されたプログラム。特定の入力に対して自動実行される。（ラズベリーパイの温度センサーからの入力に対して推奨温度に変更される）
**トランザクション：**
資産の取引の記録を台帳に書き込む。主にPeer間の合意により承諾される。実行される一連の取引。

#[Part 1：LinuxONE Community Cloud guestのセットアップ方法](https://github.com/IBM/hyperledger-fabric-on-linux-one#part-1---setting-up-your-linuxone-community-cloud-guest-1)

　　LinuxONE コミュニティ・クラウドへのアクセス
1.ブラウザーで、IBM LinuxONE コミュニティ・クラウドのページを開いてください。
https://developer.ibm.com/linuxone/
![Comunity Cloud.jpeg](https://qiita-image-store.s3.amazonaws.com/0/273603/7ee897a5-c859-9112-cc7c-6064bd55f4a7.jpeg)

2.Try a LinuxONE Virtual Machineをクリックすると、120日間有効の無料試用版の申請ページに入ります。
![community cloud.jpeg](https://qiita-image-store.s3.amazonaws.com/0/273603/8ecad381-68ac-855b-7704-e2d9b2b97c5c.jpeg)

3.*のついた項目を全て記入してから、Request your trialをクリックしてください。ここで入力したメールアドレスは、ステップ5で使われます。(表示された画面と資料のイメージが異なる場合には、画面の指示にしたがってください）
![GuestApplication3.png](https://qiita-image-store.s3.amazonaws.com/0/289266/4e829d6b-cde0-e7f0-80cc-ec8c4538bf12.png)

4.登録完了の画面が表示されたら、Sign Inをクリックしてください。
![SignIn4.png](https://qiita-image-store.s3.amazonaws.com/0/289266/47b3b390-4ce2-19a6-29b4-02196bd6804c.png)

5.あなたのメールアドレス宛に、登録確認のため、下記のようなメールが送られました。次のステップに必要なあなたのUser IDとPasswordをこのメールで確認してください。
![RegistrationConfirmationEmail5.png](https://qiita-image-store.s3.amazonaws.com/0/289266/163bccfb-9bf2-9feb-0daf-37dd93929abb.png)

**LinuxONE guestの作成**
6.ブラウザーに戻って、User IDとPasswordを入力してください。
　　注：ここで分かりやすいパスワードに変更できます。初回サインインした後、右上にあるあなたのusernameをクリックし、account settingsを選択してください。
![SignInUserIDPW6.png](https://qiita-image-store.s3.amazonaws.com/0/289266/fcfbe239-e144-3878-dacd-aeb8a2f9d337.png)

7.LinuxONE Community Cloud guestのホームに入ったら、Infrastructureの下のVirtual Serversに入っているManage Instancesをクリックしてください。ここでLinuxのインスタンスを配置することができます。
![communitycloud3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/273603/57aad714-da02-03e4-19d3-ebc3e4e3706d.jpeg)
8. `Create`をクリックします。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/Create.png"width=100%>
9. 以下の情報を入力します。
　※新しいSSH Keyを使用する場合は、先に10.~12.を実行してブラウザを再読み込みしておきましょう。
・**Select a type** は `General purpose VM`を選択します。
・**Instance name** にインスタンス名を入力します。
 (例：_DJBlockchain_)
・**Instance Description** にインスタンスの説明を入力します。(例：_Blockchain guest for Developers Journey._)
・**Select an Image** は `SLES12SP3` を選択します。
・**Select a Flavor** は `LinuxONE-Medium` を選択します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/LinuxONEFields.png"width=100%>
10. 下にスクロールして、**Select a SSH Key Pair**で`Create`をクリックします。<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/CreateKeyPair.png"width=100%>
11. ポップアップのダイアログに任意の鍵の名前(_DJBlockchain_)を入力して`Create a new key pair`を選択します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/KeyPairName.png"width=70%>
12. お使いのパソコンによって、新しい鍵ペアを保存するかどうかを尋ねるプロンプトが表示される場合があります。
　`Save File`でパソコン上に保存します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/SaveFile.png"width=50%>
13. **Select a SSH key pair**で新しく作成した鍵(`DJBloackchain`)を選択します。
　※新しい鍵の選択肢が出ない場合、ブラウザを再読み込みしてください。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/SelectDJBlockchain.png"width=100%>
14. **CURRENT SELECTION:**で選択した情報を確認したら、`Create`のボタンをクリックしてSLES 12 LinuxONEゲストを作成します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/CreateGuest.png"width=100%>
15. 作成中のゲストシステムが表示され、**Status**の表示が_block_device_mapping_ ⇒ _spawning_ ⇒ _ACTIVE_の順に遷移します。_ACTIVE_になれば使用可能です。
※**IP Address**に表示されたアドレスを書き留めておいてください。ログイン時に使用します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/StartedGuest.png?raw=true"width=100%>
16. Mac OSの場合コンピュータのターミナルで、SSH鍵ペア(例：_DJBlockchain.pem_)を保存したディレクトリに移動します。以下が保存場所の例です。(Windowsの場合は、**補足**をご参照ください。）
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/DownloadDirectory.png?raw=true"width=60%>
17. Mac OSの場合、下記コマンドを実行し、秘密鍵のパーミッションを変更します。(Windowsの場合は、**補足**をご参照ください。）
_`chmod 600 DJBlockchain.pem`_
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/SSHKeyPermissions.png?raw=true"width=80%>
18. _DJBlockchain.pem_があるロケーションから下記コマンドを実行します。
xは15.のIPアドレスに変更してください。
_`ssh -i DJBlockchain.pem linux1@xxx.xxx.xxx.xxx`_
19. 鍵認証の警告が表示されるので、_yes_を返します。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/ContinueConnecting.png?raw=true"width=90%>
20. これでIBM LinuxONE Community Cloudのゲストシステムに接続することができました。
<img src="https://github.com/IBM/hyperledger-fabric-on-linux-one/raw/master/images/CommunityCloudWelcome.png?raw=true"width=90%>
**補足**
Windowsをご使用の場合には、teraterm, putty等のソフトウェアをご利用ください。
[こちら](http://dotnsf.blog.jp/archives/1063515821.html)の情報が参考になります。

**Hyperledger FabricおよびHyperledger Composer用にゲストOSのLinuxをセットアップ**
21 . OSセットアップ用スクリプトをダウンロードします。 
wget https://raw.githubusercontent.com/IBM/HyperledgerFabric-on-LinuxOne/master/Linux1BlockchainScript.sh
![WgetSetup.png](https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/WgetSetup.png?raw=true)


22 . lsコマンドでダウンロードしたファイルを確認します。

```
    linux1@djblockchain:~> ls
    bin  Linux1BlockchainScript.sh  public_html
    linux1@djblockchain:~>
```

23 . chmodコマンドでシェルファイルを実行モードへ変更します。

```
linux1@djblockchain:~> chmod u+x Linux1BlockchainScript.sh
linux1@djblockchain:~> ls
bin  Linux1BlockchainScript.sh  public_html
linux1@djblockchain:~>
```

24 . セットアップ用シェルLinux1BlockchainScript.shを実行します。
Linux1BlockchainScript.shでは、Hyperledger FabricとHyperledger Composerの最新版が導入されます。　(2018年11月時点のバージョンはHyperledger Fabric V1.2とHyperledger Composer V0.20.4)

25 . `./Linux1BlockchainScript.sh`の1回目の実行では、権限や環境変数の設定が行われました。続く数ステップで、設定変更を反映するために1度ログインし直し、スクリプトの2回目の実行を行います。具体的には、下記のような作業です。
・ `exit`とタイプしてsshセッションを抜ける。
・ `ssh -i DJBlockchain.pem linux1@xxx.xxx.x.x`とタイプして再度ログインする。`xxx.xxx.x.x`には手順15でメモした、LinuxONEゲストシステムのIPアドレスを指定する。


```一回目スクリプト実行の様子
      linux1@djblockchain:~> ./Linux1BlockchainScript.sh 
      ID linux1 was not a member of the docker group. This has been corrected.
      PATH was missing '/data/npm/bin'. This has been corrected.
      Some changes have been made that require you to log out and log back in.
      Please do this now and then re-run this script.
 ```
　　　　
26. コマンドラインの制御が戻ってきたらスクリプトの1回目の実行の完了です。
27. スクリプトにより行われた変更を反映するため、`exit`とタイプしsshセッションを抜けます。
<img src="https://raw.githubusercontent.com/IBM/hyperledger-fabric-on-linux-one/master/images/ExitSession.png">
28. ゲストに再ログインし直してください。
`ssh -i DJBlockchain.pem linux1@xxx.xxx.x.x`  xはゲストのIPアドレス。アドレスがわからなくなってもステップ15の画面で確認できます
![ReLogin.png](https://raw.githubusercontent.com/IBM/hyperledger-fabric-on-linux-one/master/images/ReLogin.png)

`./Linux1BlockchainScript.sh`とタイプして、セットアップスクリプトの2回目の実行を行なってください。
ここで、必要なソフトウェアのダウンロードと導入・セットアップが行われるため、しばらく時間がかかります。
セットアップが終了すると以下のようなメッセージが表示されます。

```
make: Leaving directory '/data/npm/lib/node_modules/node-red/node_modules/bcrypt/build'
+ node-red@0.19.5
added 388 packages in 10.261s
Please log out of this system and log back in to pick up the group and PATH changes.
```
ステップ27,28を参考にして、ゲストに再度ログインし直してください。

***Hyperledger Fabric と Hyperledger Composerが正しく導入されたことを確認する***
29. blockchain networkが稼働しているか、`docker ps -a`コマンドで確認します。
以下のような4つのコンテナが稼働しているはずです。
![RunningFabricContainers.png](https://raw.githubusercontent.com/IBM/hyperledger-fabric-on-linux-one/master/images/RunningFabricContainers.png)
30. composerのコマンドラインインターフェースや他のツールが導入されたことを
`composer -v`コマンドで確認します。

```
    linux1@djblockchain:~> composer -v
    v0.20.4
``` 

31 . `ps -ef|grep playground`コマンドでプロセスを確認して、Composer Playgroundが稼働していることを確認します。
![VerifyComposerPlaygroundRunning.png](https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/VerifyComposerPlaygroundRunning.png?raw=true)
32. ブラウザーを開いて、アドレスバーに`xxx.xxx.x.x:8080`を入力します。xにはLinuxONEゲストシステムのIPアドレスを指定します。
Note: 
・Hyperledger Composer Playgroundを利用するブラウザーにはChromeをお勧めします。また、Playgroundを使う場合、シークレットウィンドウを使うことをお勧めします。これにより、異常な動作に気づいた場合には、キャッシュと履歴をすばやくクリアすることができます。
・Firefoxを使う場合には、Private modeを使うことはできません。
以下のような画面が表示されるはずです。
![ComposerPlaygroundUI1.png](https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/ComposerPlaygroundUI1.png?raw=true)
![ComposerPlaygroundUI2.png](https://github.com/IBM/hyperledger-fabric-on-linux-one/blob/master/images/ComposerPlaygroundUI2.png?raw=true)
33. おめでとうございます！:clap:。　Part1はこれで終了です。　引き続き、次のパートをお楽しみください。 
Part2に続く
[IBMのメインフレームでBlockchainを動かしてみた。(Hyperledger Fabric and Hyperledger Composer on LinuxONE) Part2](https://qiita.com/truepot/private/38546c196fa3740282fd)