1. 程式人生 > >fabric部署e2e_cli單節點和first-network示例及相關錯誤

fabric部署e2e_cli單節點和first-network示例及相關錯誤

一、下載docker映象

e2e_cli示例裡有下載docker映象的指令碼download-dockerimages.sh,直接執行即可。
進入到e2e-cli路徑中

cd opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/
source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0

檢查下載的映象列表:

docker images

這裡寫圖片描述

二、啟動fabirc網路

fabric/examples/e2e_cli目錄下存有檔案network_setup.sh用於一鍵部署環境並測試chaincode示例程式碼。
首先把fabric切換到v1.0.0版本:

git checkout v1.0.0

在e2e_cli資料夾裡,執行如下指令碼:

./network_setup.sh up

這個做了如下操作:
1編譯生成Fabric公私鑰、證書的程式,程式在目錄:fabric/release/linux-amd64/bin

2基於configtx.yaml生成創世區塊和通道相關資訊,並儲存在channel-artifacts資料夾。

3基於crypto-config.yaml生成公私鑰和證書資訊,並儲存在crypto-config資料夾中。

4基於docker-compose-cli.yaml啟動1Orderer+4Peer+1CLI的Fabric容器。

5在CLI啟動的時候,會執行scripts/script.sh檔案,這個指令碼檔案包含了建立Channel,加入Channel,安裝Example02,執行Example02等功能。

最後執行完畢,我們可以看到這樣的介面:
這裡寫圖片描述

三、測試並關閉fabric網路

測試同我上一篇部落格的測試步驟。
以現在安裝好的Example02為例,在官方例子中,channel名字是mychannel,鏈碼的名字是mycc。首先進入cli:

docker exec -it cli bash

在cli容器裡查詢初始值:

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

可以看到餘額是90。
接著呼叫鏈碼,從“a”轉移20到“b”:

peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","20"]}}'  

再次查詢“a”和“b”的值:

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

查詢結果顯示,“a”的值為Query Result:70,“b”的值為Query Result:230。

最後關閉時首先執行exit命令退出cli容器,接著關閉fabric網路:

cd opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli

./network_setup.sh down

四、network_setup.sh分析

network_setup.sh其中包括兩個部分,一個是利用generateArtifacts.sh指令碼檔案配置組織關係和頒發證書,另一個是docker-compose-cli.yaml用於根據配置啟動叢集並測試chaincode的示例程式碼。
具體流程如下圖:
這裡寫圖片描述

4.1 generateArtifacts.sh指令碼檔案

generateArtifacts.sh包含三個函式:

generateCerts:使用cryptogen工具根據crypto-config.yaml來生成證書。
replacePrivateKey:將docker-compose-e2e-template.yaml文件中的ca私鑰替換成具體的私鑰。(本例中未使用)
generateChannelArtifacts:使用configtxgen工具根據configtx.yaml檔案來生成orderer
genesis block、channel configuration transaction、anchor peer update。

4.2 docker-compose-cli.yaml檔案

docker-compose-cli.yaml檔案根據組織關係啟動docker叢集,並在cli容器中執行command命令執行./scripts/script.sh指令碼檔案。
./scripts/script.sh指令碼包含以下函式:

createChannel:建立channel。 joinChannel:將每個peer節點加入channel。
updateAnchorPeers installChaincode:部署chaincode。
instantiateChaincode:初始化chaincode,並設定背書策略。 chaincodeQuery
chaincodeInvoke

五、fabric-samples的first-network部署

首先從GitHub上下載fabric-samples的原始碼並進入fabric-samples的first-network資料夾:

cd opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperleger/fabric-samples.git
cd fabric-samples/first-network

執行指令碼,生成MSP證書和創世區塊:

./byfn.sh -m generate

該命令做的主要操作如下:
1 用cryptogen工具生成證書
2 生成排序服務的創世區塊 ‘genesis.block’
3 生成通道配置交易 ‘channel.tx’
4 生成Org1MSP錨節點配置 ‘Org1MSPanchors.tx’
5 生成Org2MSP錨節點配置 ‘Org2MSPanchors.tx’
執行成功以後生成的Peer節點和排序服務節點的MSP證書檔案在目錄crypto-config下,包含四個Peer節點(分成兩個Org)和1個排序服務節點,排序後預設使用SOLO。
生成的創世區塊在目錄channel-artifacts下:

tree channel-artifacts
channel-artifacts
 ——Org1MSPanchors.tx
 ——Org2MSPanchors.tx
 ——channel.tx
 ——genesis.block

啟動超級賬本網路:

./byfn.sh -m up

byfn.sh會根據docker compose配置檔案docker-compose.yaml啟動超級賬本網路,還會執行scripts/script.sh指令碼安裝和例項化鏈碼,並執行簡單鏈碼呼叫和查詢操作。
成功後會出現和e2e_cli示例相同的END標識,指令碼自動執行的過程結束,但超級賬本網路還在繼續執行。
測試結束後呼叫指令碼關閉超級賬本網路:

./byfn.sh -m down

六、可能出現的問題

本人在執行這個例程的時候出現了很多問題,寫出來給大家做個參考。
在e2e_cli示例中:

Creating kafka2 ... 
Creating kafka1 ... 
Creating kafka2
Creating kafka3
Creating kafka0
Creating kafka3 ... done
Creating orderer.example.com ... 
Creating orderer.example.com ... done
Creating cli ... 
Creating cli ... done

____ _____ _ ____ _____ _____ ____ _____ 
/ ___| |_ _| / \ | _ \ |_ _| | ____| |___ \ | ____|
\___ \ | | / _ \ | |_) | | | _____ | _| __) | | _| 
___) | | | / ___ \ | _ < | | |_____| | |___ / __/ | |___ 
|____/ |_| /_/ \_\ |_| \_\ |_| |_____| |_____| |_____|

Channel name : mychannel
Check orderering service availability...
Attempting to fetch system channel 'testchainid' ...4 secs
Attempting to fetch system channel 'testchainid' ...33 secs
Attempting to fetch system channel 'testchainid' ...59 secs
2018-03-28 02:14:34.999 UTC [msp] GetLocalMSP -> DEBU 001 Returning existing local MSP
2018-03-28 02:14:35.098 UTC [msp] GetDefaultSigningIdentity -> DEBU 002 Obtaining default signing identity
2018-03-28 02:14:55.260 UTC [grpc] Printf -> DEBU 003 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: Error while dialing dial tcp: i/o timeout"; Reconnecting to {orderer.example.com:7050 <nil>}
Error: Error connecting due to rpc error: code = Unavailable desc = grpc: the connection is unavailable
Usage:
peer channel fetch <newest|oldest|config|(number)> [outputfile] [flags]

Flags:
-c, --channelID string In case of a newChain command, the channel ID to create.

Global Flags:
--cafile string Path to file containing PEM-encoded trusted certificate(s) for the ordering endpoint
--logging-level string Default logging level and overrides, see core.yaml for full syntax
-o, --orderer string Ordering service endpoint
--test.coverprofile string Done (default "coverage.cov")
--tls Use TLS when communicating with the orderer endpoint
-v, --version Display current version of fabric peer server

!!!!!!!!!!!!!!! Ordering Service is not available, Please try again ... !!!!!!!!!!!!!!!!
================== ERROR !!! FAILED to execute End-2-End Scenario ==================

或者

Cannot run peer because cannot init crypto, missing opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected].example.com/msp folder

或者

Attempting to Query PEER0 ...3 secs
Attempting to Query PEER0 ...6 secs
Attempting to Query PEER0 ...9 secs
Attempting to Query PEER0 ...12 secs
Attempting to Query PEER0 ...15 secs
Attempting to Query PEER0 ...18 secs
Attempting to Query PEER0 ...21 secs
Attempting to Query PEER0 ...24 secs
Attempting to Query PEER0 ...27 secs
Attempting to Query PEER0 ...30 secs
Attempting to Query PEER0 ...33 secs
Attempting to Query PEER0 ...37 secs
Attempting to Query PEER0 ...40 secs
Attempting to Query PEER0 ...43 secs
Attempting to Query PEER0 ...46 secs
Attempting to Query PEER0 ...49 secs
Attempting to Query PEER0 ...52 secs
Attempting to Query PEER0 ...55 secs
Attempting to Query PEER0 ...58 secs
Attempting to Query PEER0 ...61 secs

crypto證書找不到,說明沒有生成Fabric公私鑰、證書。檢視fabric/release/linux-amd64/bin資料夾,發現資料夾下無內容,也沒有crypto、configtxgen等檔案。有可能bin資料夾生成了但在其他目錄下。
可能原因是configtxgen版本不一致導致的。
branch版本、映象版本、configtxgen版本都應是1.0.0。
方法是通過版本切換和下載映象時指定版本使三者保持一致。
如果bin資料夾下還沒有檔案,手動執行bootstrap.1.0.0.sh下載,如果還沒有,那就參考下面的解決方法從別的地方拷。
其他錯誤資訊:

Error when setting up MSP from directory /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected].example.com/msp: err Could not load a valid signer certificate from directory /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected].example.com/msp/signcerts, err stat /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected].example.com/msp/signcerts: no such file or directory

其他錯誤:channel-artifacts資料夾裡沒有內容。
說明generate步驟沒做或者沒成功。

Error: Error endorsing chaincode: rpc error: code = Unknown desc = Error starting container: API error (404): {“message”:”network e2ecli_default not found”}

原因是:
e2e_cli目錄是固定的,啟動後會建立一個docker network以此為名字,這裡是e2e_cli。如果修改該目錄,要修改/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/base目錄下的peer-base.yaml
將網路名改成如下名稱即可

CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=e2e_cli_default

在first-network示例中:
報錯:

cryptogen tool not found. exiting

在執行first-network例子的上一層目錄下面要有一個bin資料夾,裡面放著需要的可執行檔案。
這裡寫圖片描述
操作:首先看一下,該目錄下面是否有一個指令碼:bootstrap-1.0.0.sh , 有即執行即可。
沒有的話: 你需要在fabric-samples目錄下面執行如下命令,將所需要的二進位制檔案下載下來:
curl -sSL https://goo.gl/eYdRbX | bash
執行完以後會在fabric-samples目錄下面建立一個bin目錄,下面放著所需要的所有的二進位制工具。
或者從fabric目錄下的bin資料夾中把檔案拷到fabric-samples中。

另外需注意,fabric原始碼的路徑最好和執行程式裡的配置的路徑和go安裝時配置的環境變數相對應,如我在環境變數裡設定的go的工作目錄為opt/gopath,我的fabric原始碼就下載到了opt/gopath/src/github.com/hyperledger。(我也不知道這個有沒有關係)