AWS
Blockchain
Hyperledger-fabric
managedBlockchain

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

Hyperledger Explorerって便利そうなツールがあったので、Amazon Managed Blockchainで構築したブロックチェーンネットワークが参照できないか試してみました。

ハマりポイントが多数ありましたので、よければご参考ください。

スクリーンショット_2019-06-08_11_19_09.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-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 でログインします。

スクリーンショット 2019-06-08 12.05.20.png

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

スクリーンショット_2019-06-08_11_19_09.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