本作品采用署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進行許可,使用時請注明出處。
在fabric的chaincode開發時,有時候需要用到第三方庫提供的功能。這些庫有些是沒有go的實現,或開發者只提供了庫,這時候就需要從chaincode中調用第三方庫。而fabric的chaincode都是運行在docker容器中,此時就需要將需要用的第三方庫編譯到dockers容器中。
fabric官方支持四種語言的chaincode開發,分別為go、java、node和evm。這里以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 啟動網絡
啟動網絡的操作與靜態庫的操作一樣。