搭建基於hyperledger fabric的聯盟社區(五) --啟動Fabric網絡


現在所有的文件都已經准備完畢,我們可以啟動fabric網絡了。

 

一.啟動orderer節點

在orderer服務器上運行:

cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli

docker-compose -f docker-compose-orderer.yaml up -d

運行完畢后我們可以使用docker ps看到運行了一個名字為orderer.example.com的容器。

 

二.啟動peer節點

2.1安裝couchdb

我們要為每一個peer安裝一個couchdb,先切換到peer0.org1服務器上。之前在獲取hyperledger fabric鏡像的時候已經獲得了couchdb的鏡像,執行docker images命令可以看到hyperledger/fabric-couchdb這個鏡像,但是啟動這個鏡像的時候經常出現問題自動關閉,我們也可以再pull一個官方發布的couchdb。

docker pull klaemo/couchdb

couchDB在啟動的時候需要指定一個本地文件夾映射成CouchDB的數據存儲文件夾,所以我們可以在當前用戶的目錄下創建一個文件夾用於存放數據。

mkdir couchdb

下載完成后,我們只需要執行以下命令即可啟用一個CouchDB的實例:

docker run -p 5984:5984 -d --name my-couchdb -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -v ~/couchdb:/opt/couchdb/data klaemo/couchdb
啟動后我們打開瀏覽器,訪問peer0.org1的IP的5984端口的URL,peer0.org1的IP是10.0.2.11,那么URL是:
http://10.0.2.11:5984/_utils
這個時候我們就可以看到CouchDB的Web管理界面了。輸入用戶名admin密碼password即可進入。

2.2啟動peer節點和CLI容器

命令為:


cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
docker-compose -f docker-compose-peer0org1.yaml up –d

運行完畢后我們使用docker ps應該可以看到3個正在運行的容器。

 

接下來切回到peer0.org2.example.com服務器。運行相同的命令:

mkdir couchdb
docker run -p 5984:5984 -d --name my-couchdb -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=password -v ~/couchdb:/opt/couchdb/data klaemo/couchdb
cd ~/go/src/github.com/hyperledger/fabric/examples/e2e_cli
docker-compose -f docker-compose-peer0org2.yaml up –d

現在我們整個Fabric網絡已經成型,接下來是創建channel和運行ChainCode。

 

三.創建channel

我們切換到peer0.org1.example.com服務器上,使用該服務器上的cli來運行創建Channel和運行ChainCode的操作。先用以下命令進入CLI內部Bash:

docker exec -it cli bash

創建Channel的命令是peer channel create,我們前面創建Channel的配置區塊時,指定了Channel的名字是mychannel,那么這里我們必須創建同樣名字的Channel。

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA

執行該命令后,系統會提示:

2017-10-30 18:30:35.210 UTC [channelCmd] readBlock -> DEBU 020 Received block:0

系統會在cli內部的當前目錄創建一個mychannel.block文件,這個文件非常重要,接下來其他節點要加入這個Channel就必須使用這個文件。

 

四.各個peer加入channel

還是在peer0.org1的CLI上,我們要將這個Peer加入mychannel就很簡單,只需要運行如下命令:

peer channel join -b mychannel.block

系統返回消息:

2017-10-30 18:40:21.405 UTC [channelCmd] executeJoin -> INFO 006 Peer joined the channel!

 

修改cli的環境變量,使其指向peer0.org2

CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer channel join -b mychannel.block

這樣peer0.org1和peer0.org2就都已經加入channel了。

注:這一切都是我在peer0.org1的cli內完成的,這是由於加入channel依賴 [channel-ID].block文件,而且在peer0.org1服務器的cli內也留有了peer0.org2的證書文件,因此兩個節點的加入都在一個cli內完成了。其實當一個節點創建channel以后可以把[channel-ID].block文件從容器內拷貝到主機,再分發給其他節點,這樣其他節點就可以通過[channel-ID].block加入channel了。當cli容器被銷毀時該容器下所有的文件都會被銷毀,但是如果備份了[channel-ID].block,那么即使所有的peer和cli被銷毀了,也可以再次通過[channel-ID].block加入channel、同步區塊。

 

五.更新錨節點

關於AnchorPeer,其實我的每個組織只有一個peer節點,所以更新不更新錨節點也不重要。

對於Org1來說,peer0.org1是錨節點,我們需要切換到peer0.org1服務器上並更新錨節點:

CORE_PEER_LOCALMSPID="Org1MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

另外對於Org2,peer0.org2是錨節點,切換到peer0.org2服務器上然后執行如下命令:

CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls true --cafile $ORDERER_CA

 

六.chaincode的安裝與運行

以上,整個Fabric網絡和Channel都准備完畢,接下來我們來安裝和運行ChainCode。社區聯盟的chaincode代碼已經在上一章貼上了。

6.1安裝chaincode

在cli上為每一個peer安裝鏈上代碼

,用peer chaincode install命令可以安裝指定的ChainCode並對其命名:

CORE_PEER_LOCALMSPID="Org1MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/community

安裝的過程其實就是對CLI中指定的代碼進行編譯打包,並把打包好的文件發送到Peer,等待接下來的實例化。

切換到peer0.org2服務器,給peer0.org2安裝鏈上代碼:

CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/community

 

6.2實例化chaincode

實例化鏈上代碼主要是在Peer所在的機器上對前面安裝好的鏈上代碼進行包裝,生成對應Channel的Docker鏡像和Docker容器。並且在實例化時我們可以指定背書策略。我們在peer0.org1服務器的cli內運行以下命令完成實例化:

CORE_PEER_LOCALMSPID="Org1MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp 
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA -C mychannel -n mycc -v 1.0 -c '{"Args":["init"]}' -P "OR      ('Org1MSP.member','Org2MSP.member')"

使用docker ps可以看到有新的容器 dev-peer0.org1.example.com-mycc-1.0正在運行。

 

6.3在一個peer發起交易 

我們可以調用initLedger功能,該功能會初始化兩個帖子。對應的代碼:

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile $ORDERER_CA -C mychannel -n mycc -c '{"Args":["initLedger"]}'

 

6.4在另一個節點上查詢帖子

前面的操作都是在org1下面做的,那么處於同一個區塊鏈(同一個Channel下)的org2,是否會看org1的更改呢?切換到peer0.org2服務器,由於mycc已經在前面org1的時候實例化了,也就是說對應的區塊已經生成了,所以在org2不能再次初始化。我們直接運行查詢命令:

CORE_PEER_LOCALMSPID="Org2MSP" 
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt 
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp 
CORE_PEER_ADDRESS=peer0.org2.example.com:7051

peer chaincode query -C mychannel -n mycc -c '{"Args":["queryPost","POST1"]}'

因為peer0.org2也需要生成Docker鏡像,創建對應的容器,才能通過容器返回結果,所以等的時間會稍長一點。我們回到Ubuntu終端,執行docker ps,可以看到peer0.org2也多了一個容器:dev-peer0.org2.example.com-mycc-1.0 

 

七. 查看日志

這樣整個區塊鏈網絡算是正式跑通了!如果想知道orderer和peer之間具體都發生了些什么我們可以進入對應的服務器,輸入命令:

docker logs -f orderer.example.com
docker logs -f peer0.org1.example.com
docker logs -f peer0.org2.example.com

這樣就可以查看對應的日志,也可以查詢報錯。

 

八.出錯記錄

8.1 阿里雲問題

在前言里說過了,生成創世區塊失敗,但是容器連接沒有問題,在docker-compose文件里每個容器里加如下一條環境變量即可解決。

GODEBUG=netdns=go

 

8.2 容器連接問題

peer無法連接couchdb,cli無法和orderer通信,都是timeout。首先因為容器把端口都映射在主機上了,在外網都可以訪問,但是在容器內curl主機端口卻失敗。原因就是防火牆把宿主機的容器給牆了,關閉防火牆即可解決。

sudo ufw disable

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM