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://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
がインストールされるようにします。
# パッケージのインストール
$ 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のインストール
$ 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
内で作業しています。
# /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敗
$ 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 |
必要なパッケージのインストールとテスト
$ 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のビルドを行います。
$ 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のブロックチェーンネットワークにアクセスできるように設定を追加します。
$ vi /tmp/blockchain-explorer/app/platform/fabric/connection-profile/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"
}
}
}
}
追加した設定が読み込まれるようにします。
$ vi /tmp/blockchain-explorer/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
にログ出力されます。
$ 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
でログインします。
ブロックチェーンネットワーク内のブロックやトランザクションなどが可視化されてブロックチェーンが可動していることが確認できるようになります。どんな情報が可視化されるのかは下記が参考になります。
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