dev模式
dev模式不是Fabric 2.0引入的,1.x版本就已存在的。對於Fabric 2.0來說,可以構建外部的鏈碼容器,對於運維和開發調試來說,變得越來越方便。在2.0版本之前,鏈碼是通過節點執行和維護的。開發模式在鏈碼“編碼/編譯/運行/調試”的開發生命週期中很有用。本節不考慮外部鏈碼的情形,後續會有博客去介紹外部鏈碼。
基礎環境
確保已下載Fabric2.0版本鏡像及二進制工具;已克隆fabric-samples。
實踐
fabric-samples 目錄下執行:
cd chaincode-docker-devmode
測試過程需要開啓3個shell窗口,假設爲shell1 ,shell2,shell3
shell1啓動網絡
fabric-samples/chaincode-docker-devmode目錄下執行:
docker-compose -f docker-compose-simple.yaml up
上邊的命令啓動了一個網絡,網絡的排序模式爲 SingleSampleMSPSolo ,並且以“開發模式” 啓動了 peer 節點。它還啓動了另外兩個容器 :一個是鏈碼環境,另一個是和鏈碼交互的 CLI。值得注意的一點是Peer 節點不會使用 TLS 因爲 dev 模式不支持 TLS。
shell2編譯並啓動鏈碼
fabric-samples/chaincode-docker-devmode目錄下執行:
docker exec -it chaincode sh
執行成功,應該看到/opt/gopath/src/chaincode $
繼續輸入命令:
cd sacc
go build
此時可能報錯:
/opt/gopath/src/chaincode/sacc $ go build
go: github.com/hyperledger/[email protected]: Get https://proxy.golang.org/github.com/hyperledger/fabric-chaincode-go/@v/v0.0.0-20190823162523-04390e015b85.mod: dial tcp 34.64.4.81:443: i/o timeout
這是因爲由於被牆無法下載依賴。這裏設置go代理爲阿里雲並重新執行 go build:
export GOPROXY=http://mirrors.aliyun.com/goproxy/
go build
運行鏈碼:
CORE_CHAINCODE_ID_NAME=mycc:0 CORE_PEER_TLS_ENABLED=false ./sacc -peer.address peer:7052
鏈碼從 peer 節點啓動並且日誌表示鏈碼成功註冊到了 peer 節點上。注意,在這個階段鏈碼沒有關聯任何通道。這個過程通過 instantiate 命令的之後的步驟完成。
shell3使用鏈碼
即使在 --peer-chaincodedev 模式下,仍然需要安裝鏈碼,這樣鏈碼才能正常地通過生命週期系統鏈碼的檢查。這個需求能會在未來的版本中移除。
進入 CLI 容器來執行這些調用:
docker exec -it cli bash
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
現在執行一個調用來將 “a” 的值改爲 20
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc
最後,查詢 a ,返回結果:20
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
測試新鏈碼
前面測試過程中,使用的是fabric-samples/chaincode/sacc下的鏈碼,實際測試時可以通過更改掛載路徑,以便測試不同鏈碼。