1、環境架構說明:
系統採用容器的方式運行,構建過程簡單、各組件分工清晰:
1.Docker-compose:Docker 容器管理;
2.Go lang SDK:Go 語言開發、編譯環境;
3.Git:git 鏡像複製與提交;
4.Rest Client: rest API 測試;
容器主要運行有:MemberSrv 和Peer;
2.部署環境準備
3.安裝與部署
3.1從 DockerHub上拉取鏡像
a. 安裝和部署Docker以及docker-compose,詳細過程見《使用docker compose部署服務》。
b.拉取鏡像
[root@docker fabric]#docker pull hyperledger/fabric-peer:latest #拉取peer的鏡像[root@docker fabric]#docker pull hyperledger/fabric-membersrvc:latest#拉取memberserver的鏡像[root@docker fabric]# docker images#確認鏡像拉取成功REPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/nginx latest 19146d5729dc 2 days ago 181.6 MBdocker.io/hyperledger/fabric-membersrvc latest b3654d32e4f9 9 weeks ago 1.417 GBdocker.io/hyperledger/fabric-peer latest 21cb00fb27f4 9 weeks ago 1.423 GB
3.2 Docker-compose.yml 編寫
[root@docker fabric]# pwd/opt/fabric[root@docker fabric]# lsdocker-compose.yml docker-compose.yml.old INFO[root@docker fabric]# more docker-compose.ymlmembersrvc: image: hyperledger/fabric-membersrvc ports: - "7054:7054" command: membersrvcvp0: image: hyperledger/fabric-peer ports: - "7050:7050" - "7051:7051" - "7053:7053" environment: - CORE_PEER_ADDRESSAUTODETECT=true - CORE_VM_ENDPOINT=unix:///var/run/docker.sock - CORE_LOGGING_LEVEL=DEBUG - CORE_PEER_ID=vp0 - CORE_PEER_PKI_ECA_PADDR=membersrvc:7054 - CORE_PEER_PKI_TCA_PADDR=membersrvc:7054 - CORE_PEER_PKI_TLSCA_PADDR=membersrvc:7054 - CORE_SECURITY_ENABLED=true - CORE_SECURITY_ENROLLID=test_vp0 - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT volumes: - /var/run/:/var/run/ links: - membersrvc command: sh -c "sleep 5; peer node start --peer-chaincodedev"[root@docker fabric]#
3.3 啟動
儲存 docker-compose.yml 到/opt/fabric目錄,運行docker-compose up 命令啟動2個容器(MemberServer和Peer).
到此,我們可以具備啟動和運行chaincode,並進行許可權管理的Fabric(雖然只有一個Peer):
[root@docker fabric]# docker-compose upCreating fabric_membersrvc_1Creating fabric_vp0_1Attaching to fabric_membersrvc_1, fabric_vp0_1
直到開機記錄顯示如下內容,說明啟動成功:
運行docker-compose ps 可以看到服務和對應的連接埠映射:
另外,常用操作:
[root@docker fabric]# docker-compose logs -f vp0#查看日誌[root@docker fabric]# docker-compose exec vp0 bash#exec到vp0
3.4運行與發布Chaincode
a.進入到peer裡 $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go 目錄下:
[root@docker fabric]# docker-compose exec vp0 bash
我們發現這個目錄裡有很多用例chaincode程式(基於go語言編寫),我們選擇chaincode_example2進行部署與測試。
b.部署chaincode_example。
拷貝chaincode_example02 到$GOPATH/src
root@e33e7f4dceb3:/opt/gopath/src# cp $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02.go $GOPATH/src/
c.在$GOPATH/src中進行編譯
root@e33e7f4dceb3:/opt/gopath/src# go build ./chaincode_example02.go root@e33e7f4dceb3:/opt/gopath/src# lschaincode_example02 chaincode_example02.go github.com
編譯成功會在 GOPATH/src目錄產生chaincodeexample02檔案。d.發布chaincode在 GOPATH/src目錄產生chaincode_example02檔案。 d.發布chaincode 在GOPATH/src 下運行
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
直至出現“Received REGISTERED”字樣,代表成功。
3.5 deploy,invoke與query chaincode
a.login
CLI方式:
peer network login #使用者名稱和密碼在 membersrvc.yaml 檔案裡
Rest 方式:
b.deploy
CLI 方式
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'
Rest 方式:
c.Invoke
CLI 方式
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Args": ["invoke", "a", "b", "10"]}'
a 向b 轉10塊錢後,可以看到a 變成90,b變成210
Aval = 90, Bval = 210
Rest 方式:
d. query
CLI方式:
peer chaincode query -l golang -n mycc -c '{"Args": ["query", "b"]}' -u jim
Rest 方式:
查詢到b 得到了10塊錢,查a 的話,會得到-10.
總結:
1.上述過程示範了Fabric的搭建過程;
2.示範了chaincode的部署、共識執行和查詢;
3.示範了通過CLI和Rest api 方式與peer進行互動;
提示:chaincode chaincode_example02.go 用常式序社區上下載(https://raw.githubusercontent.com/hyperledger/fabric/master/examples/chaincode/go/chaincode_example02/chaincode_example02.go)的有問題,編譯不能通過,query時會逾時:
vp0_1 | 07:49:12.906 [rest] processChaincodeInvokeOrQuery -> ERRO af8 Error when querying chaincode: Error:Failed to execute transaction or query(Timeout expired while executing transaction)
peer 裡會出現:
14:57:01.368 [shim] DEBU : [ca1a01d3]Handling ChaincodeMessage of type: RANGE_QUERY_STATE(state:ready) Error starting Simple chaincode: Error handling message: [ca1a01d3-33e8-4fc2-be69-5ff8064f9b1a]Chaincode handler FSM cannot handle message (RANGE_QUERY_STATE) with payload size (10) while in state: ready
解決辦法:
採用$GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02,不用下載的。