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