Hyperledger ExplorerでAmazon Managed Blockchainのブロックチェーンネットワークを可視化してみた

Hyperledger Explorerって便利そうなツールがあったので、Amazon Managed Blockchainで構築したブロックチェーンネットワークが参照できないか試してみました。
ハマりポイントが多数ありましたので、よければご参考ください。
<img width="1345" alt="スクリーンショット_2019-06-08_11_19_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/3cb293be-ba7c-34f0-0d6b-61c1a67a64e7.png">

可視化ツール Hyperledger Explorer で Hyperledger Fabric ブロックチェーンを見てみよう（v1.2.1対応版) - Qiita
https://qiita.com/hi5san/items/c28b71205534d93be46c

hyperledger/blockchain-explorer
https://github.com/hyperledger/blockchain-explorer


## 前提

下記記事を参考にAmazon Managed Blockchainでブロックチェーンネットワークを構築している前提です。

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた - Qiita
https://qiita.com/kai_kou/items/e02e34dd9abb26219a7e


## 利用手順

### PostgreSQLをEC2インスタンスにインストールする

下記を参考にFabric CLIを動かしているEC2インスタンスにPostgreSQL9.6をインストールします。

Install PostgreSQL on AWS EC2(Amazon Linux AMI 2013.03.1) ｜ DevelopersIO
https://dev.classmethod.jp/cloud/aws/install-postgresql-on-aws-ec2/


PostgreSQLはAmazon Linux2の`yum install` でインストールすると`9.2` が入ってしまうので、`amazon-linux-extras` で`9.6` がインストールされるようにします。

```console:EC2インスタンス
# パッケージのインストール
$ sudo amazon-linux-extras install postgresql9.6
$ sudo yum install -y postgresql postgresql-server


# データベース初期化
$ sudo /sbin/service postgresql initdb

Hint: the preferred way to do this is now "/usr/bin/postgresql-setup --initdb --unit postgresql"
 * Initializing database in '/var/lib/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log


# サービス起動
$ sudo /bin/systemctl start postgresql.service
$ sudo /bin/systemctl enable postgresql.service

Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql.service to /usr/lib/systemd/system/postgresql.service.


# 起動確認
$ sudo systemctl | grep postgresql

postgresql.service                                                                                          loaded active running   PostgreSQL database server


# postgresのパスワード変更
$ sudo passwd postgres


# 設定ファイルの変更
# 参考) https://dev.classmethod.jp/cloud/aws/install-postgresql-on-aws-ec2/

$ su - postgres

$ vi /var/lib/pgsql/data/postgresql.conf
# 下記のコメントを外してlocalhostから*に変更する
listen_addresses = '*'

# 下記のコメントを外す
port = 5432

$ vi /var/lib/pgsql/data/pg_hba.conf
# ファイル内設定をすべて無効にして下記を末尾に追加する
local   all     all     trust
host    all     all     0.0.0.0/0       md5

$ exit


# サービスの再起動
$ sudo /bin/systemctl stop postgresql.service
$ sudo /bin/systemctl start postgresql.service
```

### jqのインストール

```console:EC2インスタンス
$ sudo yum install -y jq

インストール:
  jq.x86_64 0:1.5-1.amzn2.0.2

依存性関連をインストールしました:
  oniguruma.x86_64 0:5.9.6-1.amzn2

完了しました!

$ jq --version
jq-1.5
```


### Hyperledger Explorerのインストール

Hyperledger ExplorerはAmazon Managed Blockchainで構築したブロックチェーンネットワークを参照するのにTLS接続する必要があったので、最新版を利用します。(1敗

データベース作成時に`postgres` ユーザーにスイッチするので`ec2-user` のホームで作業するとパスの関連で面倒だったので、`/tmp` 内で作業しています。

```console:EC2インスタンス
# /tmpにインストールする
$ cd /tmp


# 必要な証明書をコピー
$ cp -r ~/admin-msp/ /tmp/admin-msp/
$ cp ~/managedblockchain-tls-chain.pem /tmp


# Hyperledger Explorerのソース取得
$ git clone https://github.com/hyperledger/blockchain-explorer.git

Cloning into 'blockchain-explorer'...
remote: Enumerating objects: 86, done.
remote: Counting objects: 100% (86/86), done.
remote: Compressing objects: 100% (73/73), done.
remote: Total 8440 (delta 32), reused 67 (delta 13), pack-reused 8354
Receiving objects: 100% (8440/8440), 140.66 MiB | 24.29 MiB/s, done.
Resolving deltas: 100% (4465/4465), done.
```

Amazon Managed Blockchainで構築したブロックチェーンネットワークのURLがやたらと長いため、Hyperledger Explorerで利用するテーブル定義だと、Hyperledger Explorer起動時にエラーとなります。なのでテーブル定義を変更してからデータベースを作成する必要がありました。(1敗

```console:EC2インスタンス
$ cd /tmp/blockchain-explorer/app/persistence/fabric/postgreSQL/db

# Amazon Managed Blockchain用に定義を変更
$ sed -i -e "s/varchar(64)/varchar(256)/g" explorerpg.sql


# データベース作成
$ sudo -u postgres ./createdb.sh


# 作成確認
sudo -u postgres psql -l |grep fab
 fabricexplorer | hppoc    | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
```


### 必要なパッケージのインストールとテスト

```console:EC2インスタンス
$ cd /tmp/blockchain-explorer/
$ npm install

node-pre-gyp WARN Using request for node-pre-gyp https download
[grpc] Success: "/tmp/blockchain-explorer/node_modules/grpc/src/node/extension_binary/node-v57-linux-x64-glibc/grpc_node.node" is installed via remote

> husky@0.14.3 install /tmp/blockchain-explorer/node_modules/husky
> node ./bin/install.js

husky
setting up Git hooks
done

added 1078 packages from 1391 contributors and audited 4922 packages in 41.327s
found 10 vulnerabilities (5 moderate, 5 high)
  run `npm audit fix` to fix them, or `npm audit` for details


# テスト実行
$ cd app/test/
$ npm install
$ npm run test

  19 passing (125ms)
1..0
# tests 0
# pass  0
# ok


$ cd /tmp/blockchain-explorer/client
$ npm install

Have some ❤️ for Sinon? You can support the project via Open Collective:
 > https://opencollective.com/sinon/donate

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 1992 packages from 1349 contributors and audited 37118 packages in 49.653s
found 94 vulnerabilities (63 low, 12 moderate, 19 high)
  run `npm audit fix` to fix them, or `npm audit` for details


$ npm test -- -u --coverage

Test Suites: 37 passed, 37 total
Tests:       206 passed, 206 total
Snapshots:   0 total
Time:        29.067s
Ran all test suites.

Watch Usage: Press w to show more.
```

テストにパスしたらホスト側からブラウザでアクセスできるようにセキュリティグループのルールを追加します。

```console
> curl ifconfig.io

[自分のグローバルID]


> aws ec2 authorize-security-group-ingress \
    --group-id sg-xxxxxxxxxxxxxxxxx \
    --protocol tcp \
    --port 8080 \
    --cidr [自分のグローバルID]/32
```


### Hyperledger Explorerのビルド

Hyperledger Explorerのビルドを行うのにEC2インスタンスのインスタンスタイプを変更する必要がありました。ここでは`t2.xlarge` に変更してからビルドしています。

AWS：awscliでインスタンスタイプの変更をコマンドラインのみで行うメモ。 - ログってなんぼ
https://okisanjp.hatenablog.jp/entry/archives/287


``` console
> aws ec2 stop-instances --instance-ids i-xxxxxxxxxxxxxxxxx

> aws ec2 describe-instance-status --instance-ids i-xxxxxxxxxxxxxxxxx

> aws ec2 modify-instance-attribute --instance-id i-xxxxxxxxxxxxxxxxx \
  --attribute instanceType --value t2.xlarge

> aws ec2 start-instances --instance-ids i-xxxxxxxxxxxxxxxxx
```

インスタンスタイプが変更できたらインスタンスのグローバルIPを確認してSSHで接続し直します。

``` console
> aws ec2 describe-instances \
  --instance-ids i-xxxxxxxxxxxxxxxxx \
  --query "Reservations[0].Instances[0].PublicIpAddress"

"xxx.xxx.xxx.xxx"


> ssh -i ec2-key.pem ec2-user@xxx.xxx.xxx.xxx
```


Hyperledger Explorerのビルドを行います。

```console:EC2インスタンス
$ cd /tmp/blockchain-explorer/client
$ npm run build

> hyperledger-explorer-client@0.3.8 build /tmp/blockchain-explorer/client
> react-scripts build

Browserslist: caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
Creating an optimized production build...


> hyperledger-explorer-client@0.3.8 build /tmp/blockchain-explorer/client
> react-scripts build

Browserslist: caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`
Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  398.29 KB  build/static/js/1.f9aa9b7f.chunk.js
  37.31 KB   build/static/css/1.62fc721c.chunk.css
  26.75 KB   build/static/js/main.8f865573.chunk.js
  1007 B     build/static/css/main.b58249f8.chunk.css
  763 B      build/static/js/runtime~main.229c360f.js

The project was built assuming it is hosted at the server root.
You can control this with the homepage field in your package.json.
For example, add this to build it for GitHub Pages:

  "homepage" : "http://myname.github.io/myapp",

The build folder is ready to be deployed.
You may serve it with a static server:

  npm install -g serve
  serve -s build

Find out more about deployment here:

  http://bit.ly/CRA-deploy
```

ビルドができたらEC2インスタンスのインスタンスタイプを戻しておくのもありです。

```console
> aws ec2 stop-instances --instance-ids i-xxxxxxxxxxxxxxxxx

> aws ec2 describe-instance-status --instance-ids i-xxxxxxxxxxxxxxxxx

> aws ec2 modify-instance-attribute \
  --instance-id i-xxxxxxxxxxxxxxxxx \
  --attribute instanceType --value t2.micro

> aws ec2 start-instances --instance-ids i-xxxxxxxxxxxxxxxxx

> aws ec2 describe-instance-status --instance-ids i-xxxxxxxxxxxxxxxxx \
  --query "InstanceStatuses[0].InstanceStatus.Status"

> aws ec2 describe-instances \
    --instance-ids i-xxxxxxxxxxxxxxxxx \
    --query "Reservations[0].Instances[0].PublicIpAddress"

"xxx.xxx.xxx.xxx"

> ssh -i ec2-key.pem ec2-user@xxx.xxx.xxx.xxx
```


### Hyperledger Explorerの設定変更

Amazon Managed Blockchainのブロックチェーンネットワークにアクセスできるように設定を追加します。

```console:EC2インスタンス
$ vi /tmp/blockchain-explorer/app/platform/fabric/connection-profile/managed-blockchain.json
```

```json:managed-blockchain.json
{
  "name": "TestNetwork",
  "version": "1.0.0",
  "license": "Apache-2.0",
  "client": {
    "tlsEnable": true,
    "adminUser": "AdminUser",
    "adminPassword": "Password123",
    "enableAuthentication": true,
    "organization": "orderer-m-XXXXXXXXXXXXXXXXXXXXXXXXXX",
    "connection": {
      "timeout": {
        "peer": {
          "endorser": "300"
        },
        "orderer": "300"
      }
    }
  },
  "channels": {
    "mychannel": {
      "orderers": [
        "orderer"
      ],
      "peers": {
        "peernode": {}
      }
    }
  },
  "organizations": {
    "m-XXXXXXXXXXXXXXXXXXXXXXXXXX": {
      "mspid": "m-XXXXXXXXXXXXXXXXXXXXXXXXXX",
      "peers": ["peernode"],
      "certificateAuthorities": [
        "ca-m-XXXXXXXXXXXXXXXXXXXXXXXXXX"
      ],
      "adminPrivateKey": {
        "path": "/tmp/admin-msp/keystore/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_sk"
      },
      "signedCert": {
        "path": "/tmp/admin-msp/signcerts/cert.pem"
      }
    }
  },
  "peers": {
    "peernode": {
      "url": "grpcs://nd-xxxxxxxxxxxxxxxxxxxxxxxxxx.m-xxxxxxxxxxxxxxxxxxxxxxxxxx.n-xxxxxxxxxxxxxxxxxxxxxxxxxx.managedblockchain.us-east-1.amazonaws.com:30003",
      "grpcOptions": {
        "ssl-target-name-override": null
      },
      "tlsCACerts": {
        "path": "/tmp/managedblockchain-tls-chain.pem"
      }
    }
  },
  "certificateAuthorities": {
    "ca-m-XXXXXXXXXXXXXXXXXXXXXXXXXX": {
      "url": "https://ca.m-xxxxxxxxxxxxxxxxxxxxxxxxxx.n-xxxxxxxxxxxxxxxxxxxxxxxxxx.managedblockchain.us-east-1.amazonaws.com:30002",
      "httpOptions": {
        "verify": true
      },
      "tlsCACerts": {
        "path": "/tmp/managedblockchain-tls-chain.pem"
      },
      "caName": "ca-m-XXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
  },
  "orderers": {
    "orderer": {
      "url": "grpcs://orderer.n-xxxxxxxxxxxxxxxxxxxxxxxxxx.managedblockchain.us-east-1.amazonaws.com:30001",
      "grpcOptions": {
        "ssl-target-name-override": null
      },
      "tlsCACerts": {
        "path": "/tmp/managedblockchain-tls-chain.pem"
      }
    }
  }
}
```

追加した設定が読み込まれるようにします。

```console:EC2インスタンス
$ vi /tmp/blockchain-explorer/app/platform/fabric/config.json
```

```json:app/platform/fabric/config.json
{
  "network-configs": {
    "TestNetwork": {
      "name": "TestNetwork",
      "profile": "./connection-profile/managed-blockchain.json"
    }
  },
  "license": "Apache-2.0"
}
```

### Hyperledger Explorerの起動

設定ができたらHyperledger Explorerを起動します。
起動すると`logs` にログ出力されます。

```console:EC2インスタンス
$ cd /tmp/blockchain-explorer/
$ ./start.sh


$ cat logs/app/app.log

$ cat logs/console/console-2019-06-08.log
```

起動してホストのブラウザから http://EC2インスタンスのグローバルIP:8080/ にアクセスしてログイン画面が表示されたら、`managed-blockchain.json` で指定している`adminUser` と`adminPassword` でログインします。
<img width="759" alt="スクリーンショット 2019-06-08 12.05.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/8394226e-16f8-100c-d6e8-a660f7b36124.png">

ログインできたらダッシュボードが表示されます。
<img width="1345" alt="スクリーンショット_2019-06-08_11_19_09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/3cb293be-ba7c-34f0-0d6b-61c1a67a64e7.png">
やったぜ。

ブロックチェーンネットワーク内のブロックやトランザクションなどが可視化されてブロックチェーンが可動していることが確認できるようになります。どんな情報が可視化されるのかは下記が参考になります。

Hyperledger Explorer（v0.3.7版）で確認できる情報 - Qiita
https://qiita.com/fhoshi/items/6da01b7aa6f9b0c6b059


## 参考

可視化ツール Hyperledger Explorer で Hyperledger Fabric ブロックチェーンを見てみよう（v1.2.1対応版) - Qiita
https://qiita.com/hi5san/items/c28b71205534d93be46c

hyperledger/blockchain-explorer
https://github.com/hyperledger/blockchain-explorer

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた - Qiita
https://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

Install PostgreSQL on AWS EC2(Amazon Linux AMI 2013.03.1) ｜ DevelopersIO
https://dev.classmethod.jp/cloud/aws/install-postgresql-on-aws-ec2/

AWS：awscliでインスタンスタイプの変更をコマンドラインのみで行うメモ。 - ログってなんぼ
https://okisanjp.hatenablog.jp/entry/archives/287

Hyperledger Explorer（v0.3.7版）で確認できる情報 - Qiita
https://qiita.com/fhoshi/items/6da01b7aa6f9b0c6b059