搭建區塊鏈瀏覽器——基於hyperledger fabric 1.0,MySQL容器
Contents
區塊鏈瀏覽器是hyperledger官方項目,能夠可視化的查看區塊鏈的詳細信息,包括區塊信息/詳情,交易信息/詳情,節點信息,鏈碼信息等...本文介紹如何搭建區塊鏈瀏覽器
環境要求
- nodejs 6.9.x (Note that v7.x is not yet supported)
- mysql 5.7 or greater
- Hyperledger Fabric 1.0
- docker 17.06.2-ce [https://www.docker.com/community-edition]
- docker-compose 1.14.0 [https://docs.docker.com/compose/]
分支選擇
- 注意根據自己部署的fabric版本以及數據庫類型來選擇不同的分支。目前支持的數據庫類型有兩種:
- PostgreSQL
- MySQL
因為感覺MySQL相對普遍一些,所以我選擇的是MySQL。查看各個分支的README文件,reactbranch這個分支符合我的要求(fabric1.0+MySQL)
克隆倉庫
# 進入自己開發的目錄(這里只是例子,可以改成自己想要的目錄)
$ cd /home/chy
# 克隆倉庫
$ git clone https://github.com/hyperledger/blockchain-explorer.git
# 切換到合適的分支
$ git checkout reactbranch
- 倉庫中README文件已經講述了基本的部署步驟。這些部分我就不再贅述,主要是介紹我實際搭建過程中與他的步驟不同的地方。
- 我並沒有直接安裝MySQL在宿主機,而是使用docker容器
- 我使用的是自己之前搭建好的網絡,而不是他提供的sample網絡
數據庫搭建
- 作為一個web應用,區塊鏈瀏覽器需要連接單獨的數據庫,用於存儲一些運行產生的數據。
- 本着不折騰的原則,我這里單獨開了一個Mysql的docker容器,通過端口映射的方式訪問。
# 拉取MySQL鏡像,版本號>=5.7
$ docker pull MySQL:5.7
# 啟動MySQL容器
# -v 掛載目錄,將剛才克隆的目錄掛載到docker容器下
# -p 將docker的3306端口映射到宿主機的33060端口
# -d 后台運行
$ docker run --name MySQL-Explorer -e MYSQL_ROOT_PASSWORD=password -v /home/chy/blockchain-explorer:/explore -p 33060:3306 -d mysql
- 啟動數據庫容器后,進入容器,導入數據庫
# 進入容器終端
$ docker exec -it MySQL-Explorer bash
# 導入數據庫(用戶名,密碼,sql文件路徑換成自己的)
$ mysql -u<username> -p < db/fabricexplorer.sql
修改配置文件
-
在項目目錄中,有一個
config.json
文件,這個文件規定了區塊鏈網絡各種參數- 每個節點,組織,用戶的tls,msp憑證
- 各節點的地址grpcs://IP:port
-
這個config.json要根據自己創建網絡之初的那些配置文件來寫,必須完全對應起來,才能跑通

一個節點的配置示例
-
連接數據庫的配置
- 在config.json里邊的mysql字段修改
-
mysql字段
-
我所遇到的一個問題
db/mysqlservice.js
中端口號默認是3306,所以沒有連上我的容器- 解決:以下是我的修改方式,僅供參考
-
我的修改方式
-
運行服務
$ npm install
$ ./start.sh
訪問本機的8080端口,最終結果如圖

運行效果
附錄:我的配置文件
僅供參考
{
"network-config": {
"org1": {
"name": "sy_org1",
"mspid": "SyOrg1MSP",
"peer1": {
"requests": "grpcs://127.0.0.1:7051",
"events": "grpcs://127.0.0.1:7053",
"server-hostname": "peer0.org1.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org1.qklszzngsy.com/peers/peer0.org1.qklszzngsy.com/tls/ca.crt"
},
"peer2": {
"requests": "grpcs://127.0.0.1:8051",
"events": "grpcs://127.0.0.1:8053",
"server-hostname": "peer1.org1.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org1.qklszzngsy.com/peers/peer1.org1.qklszzngsy.com/tls/ca.crt"
},
"peer3": {
"requests": "grpcs://127.0.0.1:8054",
"events": "grpcs://127.0.0.1:8056",
"server-hostname": "peer2.org1.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org1.qklszzngsy.com/peers/peer2.org1.qklszzngsy.com/tls/ca.crt"
},
"admin": {
"key": "../MilkTrace/crypto-config/peerOrganizations/org1.qklszzngsy.com/users/Admin@org1.qklszzngsy.com/msp/keystore",
"cert": "../MilkTrace/crypto-config/peerOrganizations/org1.qklszzngsy.com/users/Admin@org1.qklszzngsy.com/msp/signcerts"
}
},
"org2": {
"name": "sy_org2",
"mspid": "SyOrg2MSP",
"peer1": {
"requests": "grpcs://127.0.0.1:9051",
"events": "grpcs://127.0.0.1:9053",
"server-hostname": "peer0.org2.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org2.qklszzngsy.com/peers/peer0.org2.qklszzngsy.com/tls/ca.crt"
},
"peer2": {
"requests": "grpcs://127.0.0.1:10051",
"events": "grpcs://127.0.0.1:10053",
"server-hostname": "peer1.org2.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org2.qklszzngsy.com/peers/peer1.org2.qklszzngsy.com/tls/ca.crt"
},
"peer3": {
"requests": "grpcs://127.0.0.1:10073",
"events": "grpcs://127.0.0.1:10075",
"server-hostname": "peer2.org2.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org2.qklszzngsy.com/peers/peer2.org2.qklszzngsy.com/tls/ca.crt"
},
"admin": {
"key": "../MilkTrace/crypto-config/peerOrganizations/org2.qklszzngsy.com/users/Admin@org2.qklszzngsy.com/msp/keystore",
"cert": "../MilkTrace/crypto-config/peerOrganizations/org2.qklszzngsy.com/users/Admin@org2.qklszzngsy.com/msp/signcerts"
}
},
"org3": {
"name": "sy_org3",
"mspid": "SyOrg3MSP",
"peer1": {
"requests": "grpcs://127.0.0.1:10054",
"events": "grpcs://127.0.0.1:10066",
"server-hostname": "peer0.org3.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org3.qklszzngsy.com/peers/peer0.org3.qklszzngsy.com/tls/ca.crt"
},
"peer2": {
"requests": "grpcs://127.0.0.1:10067",
"events": "grpcs://127.0.0.1:10069",
"server-hostname": "peer1.org3.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org3.qklszzngsy.com/peers/peer1.org3.qklszzngsy.com/tls/ca.crt"
},
"peer3": {
"requests": "grpcs://127.0.0.1:10070",
"events": "grpcs://127.0.0.1:10072",
"server-hostname": "peer2.org3.qklszzngsy.com",
"tls_cacerts": "../MilkTrace/crypto-config/peerOrganizations/org3.qklszzngsy.com/peers/peer2.org3.qklszzngsy.com/tls/ca.crt"
},
"admin": {
"key": "../MilkTrace/crypto-config/peerOrganizations/org3.qklszzngsy.com/users/Admin@org3.qklszzngsy.com/msp/keystore",
"cert": "../MilkTrace/crypto-config/peerOrganizations/org3.qklszzngsy.com/users/Admin@org3.qklszzngsy.com/msp/signcerts"
}
}
},
"host":"localhost",
"port":"8080",
"channel": "mychannel",
"GOPATH":"../artifacts",
"keyValueStore":"/tmp/fabric-client-kvs",
"eventWaitTime":"30000",
"mysql":{
"host":"localhost",
"port":"33060",
"database":"fabricexplorer",
"username":"root",
"passwd":"password"
}
}