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

如今全部的文件都已經準備完畢,咱們能夠啓動fabric網絡了。git

 

一.啓動orderer節點

在orderer服務器上運行:github

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

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

運行完畢後咱們可使用docker ps看到運行了一個名字爲orderer.example.com的容器。docker

 

二.啓動peer節點

2.1安裝couchdb

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

docker pull klaemo/couchdb

couchDB在啓動的時候須要指定一個本地文件夾映射成CouchDB的數據存儲文件夾,因此咱們能夠在當前用戶的目錄下建立一個文件夾用於存放數據。bash

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個正在運行的容器。curl

 

接下來切回到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
相關文章
相關標籤/搜索