溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hyperledger Fabric 鏈碼(智能合約)基本操作

發(fā)布時(shí)間:2020-07-24 08:30:51 來(lái)源:網(wǎng)絡(luò) 閱讀:25073 作者:暗黑魔君 欄目:編程語(yǔ)言

目錄

  1. 鏈碼概念
  2. 鏈碼操作

一.鏈碼概念

1.基本概念

Fabric的智能合約稱為鏈碼(chaincode),分為系統(tǒng)鏈碼和用戶鏈碼。系統(tǒng)鏈碼用來(lái)實(shí)現(xiàn)系統(tǒng)層面的功能,用戶鏈碼實(shí)現(xiàn)用戶的應(yīng)用功能。鏈碼被編譯成一個(gè)獨(dú)立的應(yīng)用程序,運(yùn)行于隔離的Docker容器中。

和以太坊相比,F(xiàn)abric鏈碼和底層賬本是分開的,升級(jí)鏈碼時(shí)并不需要遷移賬本數(shù)據(jù)到新鏈碼當(dāng)中,真正實(shí)現(xiàn)了邏輯與數(shù)據(jù)的分離,同時(shí),鏈碼采用Go、Java、Nodejs語(yǔ)言編寫。

2.數(shù)據(jù)流向

Fabric鏈碼通過(guò)gprc與peer節(jié)點(diǎn)交互

(1)當(dāng)peer節(jié)點(diǎn)收到客戶端請(qǐng)求的輸入(propsal)后,會(huì)通過(guò)發(fā)送一個(gè)鏈碼消息對(duì)象(帶輸入信息,調(diào)用者信息)給對(duì)應(yīng)的鏈碼。

(2)鏈碼調(diào)用ChaincodeBase里面的invoke方法,通過(guò)發(fā)送獲取數(shù)據(jù)(getState)和寫入數(shù)據(jù)(putState)消息,向peer節(jié)點(diǎn)獲取賬本狀態(tài)信息和發(fā)送預(yù)提交狀態(tài)。

(3)鏈碼發(fā)送最終輸出結(jié)果給peer節(jié)點(diǎn),節(jié)點(diǎn)對(duì)輸入(propsal)和 輸出(propsalreponse)進(jìn)行背書簽名,完成第一段簽名提交。

(4)之后客戶端收集所有peer節(jié)點(diǎn)的第一段提交信息,組裝事務(wù)(transaction)并簽名,發(fā)送事務(wù)到orderer節(jié)點(diǎn)排隊(duì),最終orderer產(chǎn)生區(qū)塊,并發(fā)送到各個(gè)peer節(jié)點(diǎn),把輸入和輸出落到賬本上,完成第二段提交過(guò)程。

3.鏈碼類型

3.1 用戶鏈碼

由應(yīng)用開發(fā)人員使用Go( Java/JS)語(yǔ)言編寫基于區(qū)塊鏈分布式賬本的狀態(tài)及處理邏輯,運(yùn)行在鏈碼容器中, 通過(guò)Fabric提供的接口與賬本平臺(tái)進(jìn)行交互

3.2系統(tǒng)鏈碼

負(fù)責(zé)Fabric節(jié)點(diǎn)自身的處理邏輯, 包括系統(tǒng)配置、背書、校驗(yàn)等工作

系統(tǒng)鏈碼僅支持Go語(yǔ)言, 在Peer節(jié)點(diǎn)啟動(dòng)時(shí)會(huì)自動(dòng)完成注冊(cè)和部署

系統(tǒng)鏈碼共有五種類型

配置系統(tǒng)鏈碼(CSCC) Configuration System Chaincode

-- 負(fù)責(zé)賬本和鏈的配置管理

背書管理系統(tǒng)鏈碼(ESCC) Endorsement System Chaincode

-- 負(fù)責(zé)背書(簽名)過(guò)程, 并可以支持對(duì)背書策略進(jìn)行管理

生命周期系統(tǒng)鏈碼(LSCC) Lifecycle System Chaincode

-- 負(fù)責(zé)對(duì)用戶鏈碼的生命周期進(jìn)行管理

-- 鏈碼生命周期包括安裝、部署、升級(jí)、權(quán)限管理、獲取信息等環(huán)節(jié).

查詢系統(tǒng)鏈碼(QSCC) Query System Chaincode

-- 負(fù)責(zé)提供賬本和鏈的信息查詢功能

驗(yàn)證系統(tǒng)鏈碼(VSCC) Verification System Chaincode

交易提交前根據(jù)背書策略進(jìn)行檢查 驗(yàn)證過(guò)程:

(1) 首先解析出交易結(jié)構(gòu), 并對(duì)交易結(jié)構(gòu)格式進(jìn)行校驗(yàn)

(2) 檢查交易的讀集合中元素版本跟本地賬本中版本一致

(3) 檢查帶有合法的背書信息(主要是檢查簽名信息)

(4) 通過(guò)則返回正確, 否則返回錯(cuò)誤消息

二.鏈碼操作

管理Chaincode的生命周期四個(gè)命令
安裝 install
實(shí)例化 instantiate
升級(jí) upgrade
打包 package
簽名 signpackage

未來(lái)還會(huì)支持 stop 和 start 命令, 來(lái)禁用和重新啟用鏈代碼

鏈代碼成功安裝和實(shí)例化后,鏈代碼處于活動(dòng)狀態(tài)(正在運(yùn)行),可通過(guò) invoke 命令調(diào)用處理事務(wù)

鏈代碼可以在安裝后隨時(shí)升級(jí)

1.啟動(dòng)開發(fā)模式

(1) 下載鏈碼API

go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim

參數(shù)說(shuō)明:

go get: 根據(jù)要求和實(shí)際情況從互聯(lián)網(wǎng)上下載或更新指定的代碼包及其依賴包,并進(jìn)行編譯和安裝

-u: 利用網(wǎng)絡(luò)來(lái)更新已有代碼包及其依賴包。默認(rèn)情況下,該命令只會(huì)從網(wǎng)絡(luò)上下 載本地不存在的代碼包,而不會(huì)更新已有的代碼包

go build: 加上可編譯的go源文件可以得到一個(gè)可執(zhí)行文件

(2) 進(jìn)入開發(fā)模式

正常情況下chaincode由對(duì)等體啟動(dòng)和維護(hù)。然而,在“開發(fā)模式”下,鏈碼由用戶構(gòu)建并啟動(dòng) ,前提保證前期通過(guò)docker-compose -f docker-compose-cli.yaml up -d創(chuàng)建的網(wǎng)絡(luò)處于關(guān)閉狀態(tài)

cd /home/bruce/hyfa/fabric-samples/chaincode-docker-devmode

$ docker-compose  -f docker-compose-simple.yaml  up -d //啟動(dòng)開發(fā)環(huán)境

查看啟動(dòng)的容器

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                            NAMES
1bf418435b45        hyperledger/fabric-ccenv     "/bin/bash -c 'sleep…"   6 seconds ago       Up 4 seconds                                                         chaincode
96aa47625135        hyperledger/fabric-tools     "/bin/bash -c ./scri…"   6 seconds ago       Up 4 seconds                                                         cli
e88a7faa98bc        hyperledger/fabric-peer      "peer node start --p…"   7 seconds ago       Up 6 seconds        0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer
e946e0472e7b        hyperledger/fabric-orderer   "orderer"                8 seconds ago       Up 7 seconds        0.0.0.0:7050->7050/tcp                           orderer

2.啟動(dòng)鏈碼

docker exec -it chaincode bash  #進(jìn)入chaincode容器
  • 編譯鏈碼

    root@1bf418435b45:/opt/gopath/src/chaincode# cd sacc/
    root@1bf418435b45:/opt/gopath/src/chaincode/sacc# go build //編譯sacc.go

  • 運(yùn)行鏈碼

    CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=devcc1:0 ./sacc

-- 鏈碼名稱:devcc1

-- 鏈碼初始版本號(hào): 0

3.安裝并實(shí)例化

$ docker exec  -it cli  bash  #進(jìn)入cli容器
  • 安裝鏈碼

    $ peer chaincode install -p chaincodedev/chaincode/sacc -n devcc1 -v 0

  • 鏈碼實(shí)例化

    $ peer chaincode instantiate -n devcc1 -v 0 -c '{"Args":["brucefeng","100"]}' -C myc

  • 查詢bruce賬戶的余額

    peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc

命令返回

2018-07-13 09:22:12.753 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C08C4DEA1DA0510...71756572790A09627275636566656E67 
2018-07-13 09:22:12.753 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: 3DBE7633D80A2F903926D8A72CDFF8F88594434892B661B2D0999A67F11571ED 
100
  • 調(diào)用鏈碼,修改賬戶余額

    $ peer chaincode invoke -n devcc1 -c '{"Args":["set","brucefeng","200"]}' -C myc

命令返回

2018-07-13 09:24:18.538 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 0a8 Chaincode invoke successful. result: status:200 payload:"200" 
  • 查詢最新余額

    peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc

命令返回

2018-07-13 09:25:40.418 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C0894E0A1DA0510...71756572790A09627275636566656E67 
2018-07-13 09:25:40.418 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: EE8F9C3A592373E9DACB9BD69C08C46343A49EA3EA49DDD26545221642323C94 
200

4.鏈碼打包與簽名

通過(guò)將鏈碼相關(guān)數(shù)據(jù)進(jìn)行封裝, 可以實(shí)現(xiàn)對(duì)其進(jìn)行打包和簽名操作

  • 鏈碼打包

    peer chaincode package -n devcc1 -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" devcc1.out

參數(shù)說(shuō)明:

-s: 創(chuàng)建角色支持的CC部署規(guī)范包, 而不是原始的CC部署規(guī)范

-S: 如果創(chuàng)建CC部署規(guī)范方案角色支持,也與本地MSP簽名

-i: 指定實(shí)例化策略

命令返回

2018-07-13 09:28:07.353 UTC [msp/identity] Sign -> DEBU 040 Sign: plaintext: 0A2E080112280A1B636861696E636F64...455254494649434154452D2D2D2D2D0A 
2018-07-13 09:28:07.353 UTC [msp/identity] Sign -> DEBU 041 Sign: digest: 337C515704E41942E87B914B8C06C5D7AC17A0FC9C4F9CD01D8A76602A6D1680 
2018-07-13 09:28:07.353 UTC [chaincodeCmd] chaincodePackage -> DEBU 042 Packaged chaincode into deployment spec of size <2209>, with args = [devcc1.out]

文件查看

root@96aa47625135:/opt/gopath/src/chaincodedev# ls -l  devcc1.out  
-rwx------ 1 root root 2209 Jul 13 09:28 devcc1.out
  • 簽名

對(duì)一個(gè)打包文件進(jìn)行簽名操作(添加當(dāng)前MSP簽名到簽名列表中)

peer chaincode signpackage devcc1.out signeddevcc1.out

命令返回

2018-07-13 09:36:07.115 UTC [msp/identity] Sign -> DEBU 037 Sign: plaintext: 0A2E080112280A1B636861696E636F64...455254494649434154452D2D2D2D2D0A 
2018-07-13 09:36:07.115 UTC [msp/identity] Sign -> DEBU 038 Sign: digest: 337C515704E41942E87B914B8C06C5D7AC17A0FC9C4F9CD01D8A76602A6D1680 
Wrote signed package to signeddevcc1.out successfully

5.升級(jí)鏈碼

  • 重新啟動(dòng)鏈碼(容器:chaincode)

參考2.啟動(dòng)鏈碼的編譯鏈碼與啟動(dòng)鏈碼

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=devcc1:1 ./sacc

-- 鏈碼版本號(hào)修改為: 1

  • 重新安裝鏈碼(容器:cli)

    $ peer chaincode install -p chaincodedev/chaincode/sacc -n devcc1 -v 1

注意版本號(hào)必須一致

在對(duì)某鏈碼代碼升級(jí)前, 推薦先將所有該鏈碼的容器停止, 并從Peer上備份并移除舊 鏈碼部署文件. 之后先在個(gè)別Peer節(jié)點(diǎn)上部署新鏈碼, 對(duì)原有數(shù)據(jù)進(jìn)行測(cè)試, 成功后再在其它節(jié)點(diǎn)上進(jìn)行升級(jí)操作

  • 升級(jí)鏈碼(容器:cli)

    $ peer chaincode upgrade -n devcc1 -v 1 -c '{"Args":["bruce", "800"]}' -C myc

命令返回

2018-07-13 09:47:12.397 UTC [msp/identity] Sign -> DEBU 0aa Sign: digest: 4D430EB0D48AD5235F21F39D473B9C18C6B199F41289E9DBEA24E6BFF18A2CC1 
2018-07-13 09:47:12.397 UTC [chaincodeCmd] upgrade -> DEBU 0ab Get Signed envelope
2018-07-13 09:47:12.397 UTC [chaincodeCmd] chaincodeUpgrade -> DEBU 0ac Send signed envelope to orderer
  • 查詢用戶余額

    $ peer chaincode query -n devcc1 -c '{"Args":["query","bruce"]}' -C myc #新用戶bruce

命令返回

2018-07-13 09:49:53.445 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C08C1EBA1DA0510...1A0E0A0571756572790A056272756365 
2018-07-13 09:49:53.445 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: 229B5B1B788011E2C539D63122E2403E88432B9F8304018D607085EFFCF9188F 
800

$peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc #老用戶brucefeng

命令返回

2018-07-13 09:52:31.230 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACA070A6208031A0B08DFECA1DA0510...71756572790A09627275636566656E67 
2018-07-13 09:52:31.230 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: F6D314D991E18ED26E8B62A1D9338FF37318951ABA777BC015FCFE6D53BB53E9 
200
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI