天天看點

Fabric Chaincode 開發者模式調試開發者模式

在fabric開發中,chaincode的測試是一個令人比較頭疼的問題,一是由于實際情況中chaincode中的存儲和查詢是依賴于peer節點上的狀态資料庫的,是以無法在本地直接測試;二是由于chaincode是運作于容器中的,這導緻我們很難擷取在代碼中列印的日志。

如果直接在實際開發環境中測試chaincode就更麻煩了,每一次調試都需要重新開機整個網絡(有可能還是多機部署的),并且要建立和加入通道,安裝以及執行個體化鍊碼,這嚴重影響了測試的效率。下面介紹兩種測試鍊碼的手段,一種是開發者 (dev) 模式,在本地單機搭建一個簡單的網絡來進行測試;另一種是單元測試 (UT),可以無需啟動節點環境,自動化測試所有接口。

開發者模式

環境分析

使用開發者調試環境,需要先下載下傳

fabric-samples

,置于

$GOPATH/src

下。開發者調試目錄位于:

fabric-samples/chaincode-docker-devmode
           

首先分析一下目錄中的 

docker-compose-simple.yaml

 檔案:

該網絡中包含1個orderer節點,1個peer節點,1個chaincode容器(負責運作我們要測試的鍊碼),1個cli容器(負責發送請求來測試鍊碼)。

有兩點需要注意的:

  • 在cli容器的

    command

    項中可以看見,啟動後會自動執行目前目錄下的

    script.sh

    腳本,該腳本會自動建立名為

    myc

    的通道,并且将節點加入。是以我們隻需要安裝和執行個體化鍊碼即可。
  • 在chaincode容器的

    volumes

    中可以看見這樣一條映射:
    - ./../chaincode:/opt/gopath/src/chaincode
               
    說明

    fabric-samples/chaincode

    目錄會映射到容器内部,這也是我們待測試鍊碼需要放置的地方。為了友善管理,我們可以在該目錄下為每個鍊碼再配置設定一個目錄,然後把要測試的鍊碼放在其中。(當然也可以直接修改映射指向自己chaincode的實際路徑)。

測試過程

終端一:啟動網絡

首先進入開發者模式目錄:

cd fabric-samples/chaincode-docker-devmode
           

啟動網絡:

docker-compose -f docker-compose-simple.yaml up
           

當看到

Going to wait for newer blocks

時表示啟動成功,此時網絡中存在四個容器(1 orderer,1 peer, 1 chaincode, 1 cli),建立了通道myc并将peer成功加入。

終端二:編譯鍊碼

進入chaincode容器

docker exec -it chaincode bash
           

編譯想要測試的chaincode:

cd sacc
go build
           

成功執行後單目前目錄下會出現生成的可執行檔案。此時需要啟動這個可執行檔案:

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./sacc
           

注:這裡有個不解的小問題,官網教程中的端口是peer:7051,并且目前peer确實也在監聽7051,但是寫成7051就會報錯:

Error starting SimpleAsset chaincode: error sending chaincode REGISTER

當出現

starting up ...

的提示就說明鍊碼啟動成功了,在這個終端二裡可以輸出chaincode中的日志(比如通過

fmt.Print()

列印的内容)。

終端三:在cli中測試鍊碼

進入cli容器:

docker exec -it cli bash
           

安裝和執行個體化鍊碼(執行個體化設定了a的初始值10):

peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0
peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc
           

進行測試:

調用set()接口将a的值設定為20:

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

調用get()接口查詢a的值,發現a的值已經更新為20,測試完畢。

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

繼續閱讀