Fabric--链码的概念与使用
鏈碼的概念與使用
概念:
Chaincode: 鏈上代碼, 簡稱鏈碼, 一般是指用戶編寫的應(yīng)用代碼
鏈碼被部署在Fabric網(wǎng)絡(luò)節(jié)點(diǎn)上,
? Peer 節(jié)點(diǎn)
? – 背書節(jié)點(diǎn)
? – commit節(jié)點(diǎn)
? – Leader節(jié)點(diǎn)
? – 錨節(jié)點(diǎn)
運(yùn)行在隔離沙盒(當(dāng)前為Docker容器)中,
并通過gRPC協(xié)議與相應(yīng)的Peer節(jié)點(diǎn)進(jìn)行交互, 以操作分布式賬本中的數(shù)據(jù)
protobuf
分類
鏈碼一般分為:
- 用戶鏈碼
- 系統(tǒng)鏈碼
用戶鏈碼
由應(yīng)用開發(fā)人員使用Go(Java/JS)語言編寫基于區(qū)塊鏈分布式賬本的狀態(tài)及處理邏輯
運(yùn)行在鏈碼容器中, 通過Fabric提供的接口與賬本平臺(tái)進(jìn)行交互
系統(tǒng)鏈碼
負(fù)責(zé)Fabric節(jié)點(diǎn)自身的處理邏輯, 包括系統(tǒng)配置、背書、校驗(yàn)等工作
系統(tǒng)鏈碼僅支持Go語言, 在Peer節(jié)點(diǎn)啟動(dòng)時(shí)會(huì)自動(dòng)完成注冊(cè)和部署
系統(tǒng)鏈碼共有五種類型:
配置系統(tǒng)鏈碼(CSCC)
CSCC: Configuration System Chaincode
負(fù)責(zé)賬本和鏈的配置管理
背書管理系統(tǒng)鏈碼(ESCC)
ESCC: Endorsement System Chaincode
負(fù)責(zé)背書(簽名)過程, 并可以支持對(duì)背書策略進(jìn)行管理
對(duì)傳入的鏈碼提案的模擬運(yùn)行結(jié)果進(jìn)行簽名, 之后創(chuàng)建響應(yīng)消息返回給客戶端
生命周期系統(tǒng)鏈碼(LSCC)
LSCC: Lifecycle System Chaincode
負(fù)責(zé)對(duì)用戶鏈碼的生命周期進(jìn)行管理
鏈碼生命周期包括安裝、部署、升級(jí)、權(quán)限管理、獲取信息等環(huán)節(jié).
查詢系統(tǒng)鏈碼(QSCC)
QSCC: Query System Chaincode
負(fù)責(zé)提供賬本和鏈的信息查詢功能
驗(yàn)證系統(tǒng)鏈碼(VSCC)
VSCC: Verification System Chaincode
交易提交前根據(jù)背書策略進(jìn)行檢查
驗(yàn)證過程:
鏈碼生命周期
管理Chaincode的生命周期四個(gè)命令:
安裝, 實(shí)例化, 升級(jí), 打包, 簽名
package, install,instantiate,upgrade
未來還會(huì)支持stop和start命令, 來禁用和重新啟用鏈代碼
鏈代碼成功安裝和實(shí)例化后,鏈代碼處于活動(dòng)狀態(tài)(正在運(yùn)行),可通過invoke命令調(diào)用處理事務(wù)
鏈代碼可以在安裝后隨時(shí)升級(jí)
安裝鏈碼
install命令將鏈碼的源碼和環(huán)境等內(nèi)容封裝為一個(gè)鏈碼安裝打包文件(Chaincode Install Package, CIP), 并傳輸?shù)奖硶?jié)點(diǎn).
背書節(jié)點(diǎn)解析后一般會(huì)保存在$CORE_PEER_FILESYSTEMPATH/chaincodes目錄下
安裝鏈碼只需要與Peer交互
進(jìn)入到sacc目錄
$ cd ~/hyfa/fabric-samples/chaincode/sacc/構(gòu)建Chaincode
$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim$ go build --tags nopkcs11命令解釋
go get: 根據(jù)要求和實(shí)際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并對(duì)它們進(jìn)行編譯和安裝
-u: 利用網(wǎng)絡(luò)來更新已有代碼包及其依賴包。默認(rèn)情況下,該命令只會(huì)從網(wǎng)絡(luò)上下載本地不存在的代碼包,而不會(huì)更新已有的代碼包
go build: 加上可編譯的go源文件可以得到一個(gè)可執(zhí)行文件
如果在執(zhí)行 go build --tags nopkcsll 命令時(shí)出現(xiàn)如下錯(cuò)誤
$GOPATH/src/github.com/hyperledger/fabric/vendor/github.com/miekg/pkcs11/pkcs11.go:26:18: fatal error: ltdl.h: No such file or directory compilation terminated.解決方式: 安裝 libltdl-dev $ sudo apt install libltdl-dev使用開發(fā)模式測(cè)試
正常情況下chaincode由對(duì)等體啟動(dòng)和維護(hù)。然而,在“開發(fā)模式”下,鏈碼由用戶構(gòu)建并啟動(dòng)
如果沒有安裝Hyperledger Fabric Samples請(qǐng)先安裝
如果沒有下載Docker images請(qǐng)先下載
跳轉(zhuǎn)至fabric-samples的chaincode-docker-devmode目錄
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/使用docker images查看Docker鏡像信息(顯示本地Docker Registry)
$ sudo docker images會(huì)看到如下輸出
REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-tools latest b7bfddf508bc About an hour ago 1.46GB hyperledger/fabric-tools x86_64-1.1.0 b7bfddf508bc About an hour ago 1.46GB hyperledger/fabric-orderer latest ce0c810df36a About an hour ago 180MB hyperledger/fabric-orderer x86_64-1.1.0 ce0c810df36a About an hour ago 180MB hyperledger/fabric-peer latest b023f9be0771 About an hour ago 187MB hyperledger/fabric-peer x86_64-1.1.0 b023f9be0771 About an hour ago 187MB hyperledger/fabric-javaenv latest 82098abb1a17 About an hour ago 1.52GB hyperledger/fabric-javaenv x86_64-1.1.0 82098abb1a17 About an hour ago 1.52GB hyperledger/fabric-ccenv latest c8b4909d8d46 About an hour ago 1.39GB hyperledger/fabric-ccenv x86_64-1.1.0 c8b4909d8d46 About an hour ago 1.39GB ......使用三個(gè)終端
終端1 啟動(dòng)網(wǎng)絡(luò)
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/該目錄下有 myc.tx 文件
啟動(dòng)網(wǎng)絡(luò)
$ sudo docker-compose -f docker-compose-simple.yaml up -d終端2 建立并啟動(dòng)鏈碼
打開第二個(gè)終端, 進(jìn)入到chaincode-docker-devmode 目錄
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/進(jìn)入CLI
chaincode容器的作用是為發(fā)簡化的方式建立并啟動(dòng)鏈碼
$ sudo docker exec -it chaincode bash命令提示符變?yōu)?
root@858726aed16e:/opt/gopath/src/chaincode#
編譯
進(jìn)入sacc目錄編譯chaincode
root@858726aed16e:/opt/gopath/src/chaincode# cd sacc root@858726aed16e:/opt/gopath/src/chaincode/sacc# go build運(yùn)行chaincode
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./saccmycc: 鏈碼名稱
0: 鏈碼初始版本號(hào)
終端3 使用鏈碼
安裝及實(shí)例化
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/ $ sudo docker exec -it cli bash進(jìn)入CLI容器后執(zhí)行如下命令安裝及實(shí)例化chaincode
容器中已經(jīng)有 myc.block 、 myc.tx 兩個(gè)文件, 可以直接使用
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 0 peer chaincode instantiate -n mycc -v 0 -c '{"Args":["a","10"]}' -C myc調(diào)用
進(jìn)行調(diào)用,將a的值更改為20
peer chaincode invoke -n mycc -c '{"Args":["set", "a", "20"]}' -C myc執(zhí)行成功, 輸出如下內(nèi)容
...... ...... Chaincode invoke successful. result: status:200 payload:"20" ......查詢
查詢a的值
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc執(zhí)行成功, 輸出: Query Result: 20
打包鏈碼及簽名
通過將鏈碼相關(guān)數(shù)據(jù)進(jìn)行封裝, 可以實(shí)現(xiàn)對(duì)其進(jìn)行打包和簽名操作
打包
peer chaincode package -n mycc -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out-s: 創(chuàng)建角色支持的CC部署規(guī)范包, 而不是原始的CC部署規(guī)范
-S: 如果創(chuàng)建CC部署規(guī)范方案角色支持,也與本地MSP簽名
-i: 指定實(shí)例化策略
打包后的文件, 可以直接用于install操作, 如:
? peer chaincode install ccpack.out
簽名
對(duì)一個(gè)打包文件進(jìn)行簽名操作(添加當(dāng)前MSP簽名到簽名列表中)
peer chaincode signpackage ccpack.out signedccpack.out升級(jí)鏈碼
退出終端3, 停止終端2的服務(wù)
終端2中重新運(yùn)行chaincode
$ sudo docker exec -it chaincode bashcd sacc go build CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:1 ./sacc注意版本為 1.0, 舊版本為 0
終端3
打開終端3, 進(jìn)入CLI容器
$ sudo docker exec -it cli bash安裝及升級(jí)
peer chaincode install -p chaincodedev/chaincode/sacc -n mycc -v 1peer chaincode upgrade -n mycc -v 1 -c '{"Args":["a", "100"]}' -C myc注意版本號(hào)必須一致
在對(duì)某鏈碼代碼升級(jí)前, 推薦先將所有該鏈碼的容器停止, 并從Peer上備份并移除舊鏈碼部署文件. 之后先在個(gè)別Peer節(jié)點(diǎn)上部署新鏈碼, 對(duì)原有數(shù)據(jù)進(jìn)行測(cè)試, 成功后再在其它節(jié)點(diǎn)上進(jìn)行升級(jí)操作
查詢
查詢a的值
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc執(zhí)行成功, 輸出: Query Result:100
總結(jié)
以上是生活随笔為你收集整理的Fabric--链码的概念与使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--测试链码
- 下一篇: Fabric--使用多通道