chaincode中使用第三方庫


本作品采用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請注明出處。

在fabric的chaincode開發時,有時候需要用到第三方庫提供的功能。這些庫有些是沒有go的實現,或開發者只提供了庫,這時候就需要從chaincode中調用第三方庫。而fabric的chaincode都是運行在docker容器中,此時就需要將需要用的第三方庫編譯到dockers容器中。

fabric官方支持四種語言的chaincode開發,分別為gojavanodeevm。這里以Go為例,介紹如何在chaincode中調用第三方庫。示例中用到的所有文件都可以從這里找到。

本文使用fabric-samples v1.4.6中提供的first-network來搭建fabric網絡。關於fabric網絡開發環境的搭建,詳見我的另一篇文章,這里就不再贅述了。

1 使用靜態庫

在fabric網絡中,默認啟用靜態庫支持。所以使用靜態庫時,只需將所需的靜態庫編譯到fabric鏡像中即可。研究過fabric源碼你會發現,fabric網絡的基本配置都是通過core.yaml文件提供的,chaincode的配置也不例外。

1.1 重編鏡像

在默認情況下,chaincode會在fabric-ccenv:latest中編譯成可執行程序,所以我們需要重寫編譯fabric-ccenv鏡像,將chaincode需要的所有依賴都打包到鏡像中,並將新生成的鏡像tag為latest

Dockerfile的內容如下:

From hyperledger/fabric-ccenv:1.4.6
COPY payload/calc.h /usr/local/include
COPy payload/libcalc.a /usr/local/lib

1.2 修改配置

在ccenv中生成的可執行程序會與chaincode.LANG.runtime指定的鏡像一起生成chaincode運行的容器,例如,golang的chaincode使用的時fabric-baseos:$(ARCH)-$(BASE_VERSION)鏡像。這里我把替換成了fabric-ccenv:latest,這樣可以保證chaincode運行時的所有依賴都能正常加載。

1.3 啟動網絡

本示例中使用的庫只提供了簡單的加減乘除功能。拿到后只需放到fabric-samples/chaincode/路徑下,將修改后的core.yaml映射到所有peer節點的/etc/hyperledger/fabric路徑下,即可使用first-network下的byfn.sh腳本啟動網絡。chaincode使用方法如下:

peer chaincode install -n calc -v 1.0 -l golang -p github.com/chaincode/calc
peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n calc -l golang -v 1.0 -c '{"Args":["init"]}' -P 'OR ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'
peer chaincode query -C mychannel -n calc -c '{"Args":["add","1","2"]}'

2 使用動態庫

2.1 重編鏡像

與使用靜態庫相同,使用動態庫時首先還是需要從新編譯ccenv鏡像,將所有的依賴都打包到鏡像中。

2.2 修改配置

chaincode.golang.runtime指定的鏡像替換成fabric-ccenv:latest。因為使用的go的chaincode,還需要將chaincode.golang.dynamicLink改為true來啟用動態庫鏈接。

2.3 啟動網絡

啟動網絡的操作與靜態庫的操作一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM