Hurleyを用いて独自のHyperledger Composer Playgroundを立ち上げる。

後日、自分のブログで公開するかもしれませんが、現時点のまとめです。Hurleyについて調査中のため、誤解している可能性もありますが、Hyperledger Compsoer Playgroundを立ち上げ、ブロックチェーンアプリケーションのコードを書き、トランザクションを確認するところまでは確認できました。

# [Hurley](https://worldsibu.tech/convector/hurley-development-environment/)
おそらく「ハーレイ」と読むと思います。Apache License 2.0のライセンスでWorldSibu社から提供されている「Hyperledger Fabricを用いた開発環境をさくっと作ってくれるツール」です。Node.jsを使用してセットアップします。
## 今回やること
Hurleyを用いて、Hyperledger Fabricの環境を構築し、Hyperledger Composerから接続、Hyperledger Composer Playgroundを起動してみましょう。
![2019-02-09 01_18_05-Huerley_Composer_Playground実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/41414/73b6aaf6-8d37-9cb3-6f2e-ddc5b3ce2b52.png)

##Hyperledger Composer Playground
「Hyperledger Composer Playground」は、ブロックチェーンアプリケーションを開発するためのサポートツールで、Webブラウザで利用することができます。実際にコードを書き、動作を確認するための機能を使用することができます。Hyperledger Composer PlaygroundにはIBMが提供する[オンライン版](https://composer-playground.mybluemix.net/)がありますが、Apache License 2.0のライセンスで提供されていますので、自分でサーバーを用意して導入することができます。

#環境準備
## サーバー
Ubuntu 16.04 Serverをインストールした仮想マシンを用意します。CPUは1コア、メモリは少なくとも2GB程度は必要です。仮想マシンはお使いのPC上で用意するか、クラウド上で用意します。Raspberry Piを使用するのは難しいです。
ここではサーバーのIPアドレスは、192.168.56.20 とします。クラウド上に用意した場合は、クラウド上の仮想マシンのIPアドレスに読み替えてください。

##ソフトウェアの導入
###Hyperledger Composerの導入
Hyperledger Composerのチュートリアルと途中まで同じです。具体的には「composer-playground」をインストールするところまでです。
作業には、rootユーザーは使用しません。サーバーに「user」というユーザーを作成済みの状態とします。作業される際には、各自でお使いのユーザー名に読み替えます。

DockerやNode.jsなど必要なソフトウェアを導入し、再起動します。

```
$ cd /home/user
$ curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh
$ chmod u+x prereqs-ubuntu.sh
$ ./prereqs-ubuntu.sh
$ sudo reboot
```

再起動後、Hyperledger Composerの実行に必要なツールをインストールします。下記のコマンドは、2019年2月現在のものです。

```
$ 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
$ npm install -g composer-playground@0.20
```

### Hurleyの導入
次は、Hurleyを導入します。下記のコマンド１行だけです。

```
$ npm i -g @worldsibu/hurley
```
# Hyperledger Fabric環境の起動
HurleyによるHyperledger Fabric環境を起動します。

```
$ hurl new
$ docker ps -a
```

これだけです。Hyperledger FabricのDockerイメージがダウンロードされ、起動していきます。「/home/Ubuntuのユーザー名/hyperledger-fabric-network/」に、Hurley向けのファイルやディレクトリが格納されています。Hyperledger Fabricの管理者用証明書や秘密鍵が含まれます。

ここで、userというユーザーを使用しておりますので、「/home/user/hyperledger-fabric-network/」となります。

#ビジネスネットワークカード
ビジネスネットワークカードは、ブロックチェーンに接続するための入館証のようなものです。サーバールームやデータセンターに入るときは専用の入館証が必要ですから、それをイメージしていただれば幸いです。ビジネスネットワークカードには、管理者用証明書と秘密鍵が含まれます。

## 管理者用証明書を確認
パス、つまり場所を探します。管理者用証明書とは、Hyperledger Fabric環境のもので、秘密鍵とセットで用いて、ビジネスネットワークカードを作成します。

Hurleyにより、2つのHyperledger Fabricの組織が起動しています。
![2019-02-09 01_44_52-Hyperledger_Fabric_起動.png](https://qiita-image-store.s3.amazonaws.com/0/41414/5083a0b4-c3f6-8144-f95e-c83b088512a2.png)
「org1.hurley.lab」と「org2.hurley.lab」です。

org1.hurley.labの管理者用証明書を確認します。

```
$ cd /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org1.hurley.lab/users/Admin@org1.hurley.lab/msp/signcerts
$ ls
```

org2.hurley.labの管理者用証明書を確認します。

```
$ cd /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org2.hurley.lab/users/Admin@org2.hurley.lab/msp/signcerts
$ ls
```

##管理者用証明書の複製
確認できた管理者用証明書を、/home/user/hyperledger-fabric-network ディレクトリに複製します。

```
$ cp /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org1.hurley.lab/users/Admin@org1.hurley.lab/msp/signcerts/Admin@org1.hurley.lab-cert.pem /home/user/hyperledger-fabric-network/
$ cp /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org2.hurley.lab/users/Admin@org2.hurley.lab/msp/signcerts/Admin@org2.hurley.lab-cert.pem /home/user/hyperledger-fabric-network/
```

## 秘密鍵を確認
パス、つまり場所を探します。
org1.hurley.labの秘密鍵を確認します。

```
$ cd /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org1.hurley.lab/users/Admin@org1.hurley.lab/msp/keystore
$ ls
```

org2.hurley.labの秘密鍵を確認します。

```
$ cd /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org2.hurley.lab/users/Admin@org2.hurley.lab/msp/keystore
$ ls
```

##秘密鍵の複製
確認できた秘密鍵を、/home/user/hyperledger-fabric-network ディレクトリに複製します。秘密鍵のファイル名はそれぞれ異なります。実際のファイル名を確認し、読み替えてください。

```
### org1.hurley.labの秘密鍵を複製
$ cp /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org1.hurley.lab/users/Admin@org1.hurley.lab/msp/keystore/xxxxxx_sk /home/user/hyperledger-fabric-network/

### org2.hurley.labの秘密鍵を複製
$ cp /home/user/hyperledger-fabric-network/artifacts/crypto-config/peerOrganizations/org2.hurley.lab/users/Admin@org2.hurley.lab/msp/keystore/yyyyyyy_sk /home/user/hyperledger-fabric-network/
```

##接続用プロファイルの作成
ビジネスネットワークを作成するために必要な「接続プロファイル」を作成します。

```
$ vi /home/user/hyperledger-fabric-network/connection.json
```
viエディタが起動します。以下の内容を記述します。Hyperledger Fabricの起動状況に合わせて記述内容が異なりますのでご注意ください。

```
{
    "name": "fabric-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "peers": {
        "peer0.org1.hurley.lab": {
            "url": "grpc://localhost:7051"
        },
        "peer0.org2.hurley.lab": {
            "url": "grpc://localhost:7053"
        }
    },
    "certificateAuthorities": {
        "ca.org1.hurley.lab": {
            "url": "http://localhost:7054",
            "caName": "ca.org1.hurley.lab"
        },
        "ca.org2.hurley.lab": {
            "url": "http://localhost:7054",
            "caName": "ca.org2.hurley.lab"
        }
    },
    "orderers": {
        "orderer.hurley.lab": {
            "url": "grpc://localhost:7050"
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.hurley.lab"
            ],
            "certificateAuthorities": [
                "ca.org1.hurley.lab"
            ]
        },
        "Org2": {
            "mspid": "Org2MSP",
            "peers": [
                "peer0.org2.hurley.lab"
            ],
            "certificateAuthorities": [
                "ca.org2.hurley.lab"
            ]
        }
    },
    "channels": {
        "composerchannel": {
            "orderers": [
                "orderer.hurley.lab"
            ],
            "peers": {
                "peer0.org1.hurley.lab": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer0.org2.hurley.lab": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    }
}
```
## ビジネスネットワークカードの作成
管理者用証明書と秘密鍵を複製し、接続用プロファイルを作成した後、ビジネスネットワークカードを作成します。次のコマンドを実行します。

```
$ cd /home/user/hyperledger-fabric-network/

$ composer card create -p connection.json -u PeerAdmin -c Admin@org1.hurley.lab-cert.pem -k xxxxx_sk -r PeerAdmin -r ChannelAdmin PeerAdmin@org1.card

Successfully created business network card file to
        Output file: PeerAdmin@fabric-network.card

Command succeeded

$ composer card create -p connection.json -u PeerAdmin -c Admin@org2.hurley.lab-cert.pem -k yyyyy_sk -r PeerAdmin -r ChannelAdmin PeerAdmin@org2.card

Successfully created business network card file to
        Output file: PeerAdmin@fabric-network.card

Command succeeded

$ composer card import -f PeerAdmin@fabric-network.card
```
<作成されたビジネスネットワークカード>
![2019-02-09 01_18_05-Huerley_Composer_Card_list実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/41414/abb27753-16aa-084b-7587-b1dc54d37d17.png)



#Hyperledger Compsoer Playgroundの起動と動作確認
HurleyによりHyperledger Fabricの環境が起動しており、ビジネスネットワークカードが作成できましたの、hyperledger Composer Playgroundを起動します。

```
$ cd /home/user/hyperledger-fabric-network/
$ mkdir logs

$ nohup composer-playground >/home/user/hyperledger-fabric-network/logs/playground.stdout 2>/home/user/hyperledger-fabric-network/logs/playground.stderr & disown
```
これで、Google Chromeのシークレットウィンドウを開き、http://192.168.56.20:8080 にアクセスすれば、Hyperledger Composer Playgroundの画面が表示されます。
![2019-02-09 01_18_05-Huerley_Composer_Playground実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/41414/73b6aaf6-8d37-9cb3-6f2e-ddc5b3ce2b52.png)

「Let's Blockchain!」をクリックして、ブロックチェーンアプリケーションを作ってみましょう。ここでは、先日開催したハンズオンの資料を用いて、動作確認を実施しました。
[ブロックチェーンハンズオン 2019/01/26](https://www.slideshare.net/kolinz/20190126)

<トランザクションが処理されているか確認した様子>
![2019-02-09 01_18_05-Huerley_Composer_Playground_Transaction実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/41414/ed6ddf5f-7d99-cc1a-0d13-1efa021d4bd9.png)

#まとめ
Hurleyを使うと、わずか一行のコマンドで、Hyperledger Fabricの環境を起動できることがわかりました。また、Hyperledger Composerのチュートリアルでは「fabric-dev-servers」として、ビジネスネットワークカードを簡単に作成できる環境が用意されていましたが、これでビジネスネットワークカードを作成する仕組みを理解することができました。