Hyperledger Explorerって便利そうなツールがあったので、Amazon Managed Blockchainで構築したブロックチェーンネットワークが参照できないか試してみました。
ハマりポイントが多数ありましたので、よければご参考ください。

可視化ツール 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://cloudpack.media/46963

利用手順

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-extras9.6がインストールされるようにします。

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のインストール

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 内で作業しています。

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敗

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       |

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

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.

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

> 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

> 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で接続し直します。

> 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のビルドを行います。

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インスタンスのインスタンスタイプを戻しておくのもありです。

> 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のブロックチェーンネットワークにアクセスできるように設定を追加します。

EC2インスタンス

$ vi /tmp/blockchain-explorer/app/platform/fabric/connection-profile/managed-blockchain.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:30001",
      "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"
      }
    }
  }
}

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

EC2インスタンス

$ vi /tmp/blockchain-explorer/app/platform/fabric/config.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 にログ出力されます。

EC2インスタンス

$ cd /tmp/blockchain-explorer/
$ ./start.sh


$ car logs/app/app.log

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

起動してホストのブラウザから http://EC2インスタンスのグローバルIP:8080/ にアクセスしてログイン画面が表示されたら、managed-blockchain.jsonで指定しているadminUseradminPasswordでログインします。

ログインできたらダッシュボードが表示されます。

やったぜ。

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

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://cloudpack.media/46963

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

元記事はこちら

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