日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Fabric--链码的概念与使用

發(fā)布時(shí)間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Fabric--链码的概念与使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈碼的概念與使用

概念:

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)證過程:

  • 首先解析出交易結(jié)構(gòu), 并對(duì)交易結(jié)構(gòu)格式進(jìn)行校驗(yàn)
  • 檢查交易的讀集合中元素版本跟本地賬本中版本一致
  • 檢查帶有合法的背書信息(主要是檢查簽名信息)
  • 通過則返回正確, 否則返回錯(cuò)誤消息
  • 鏈碼生命周期

    管理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 ./sacc

    mycc: 鏈碼名稱

    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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。