【翻譯】Hyperledger Fabric v1.1 中的系統(tǒng)鏈碼

Hyperledger Fabric 交易流

Hyperledger Fabric v1.1提供了幾個(gè)特殊的鏈碼來執(zhí)行某些特殊的任務(wù),這些鏈碼被稱為系統(tǒng)鏈碼 (System Chaincode)。本文的目的是簡(jiǎn)述這些鏈碼的實(shí)現(xiàn)、功能和用法。與用戶鏈碼類似,系統(tǒng)鏈碼也實(shí)現(xiàn)了 Init()Invoke() 方法。Fabric中一共有五種合約:

  1. Configuration System Chaincode (CSCC) -- core/scc/cscc/configure.go
  2. Life Cycle System Chaincode (LSCC) -- core/scc/lscc/lscc.go
  3. Query System Chaincode (QSCC) -- core/scc/qscc/query.go
  4. Endorser System Chaincode (ESCC) -- core/scc/escc/endorser_onevalidsignature.go
  5. Validator System Chaincode (VSCC) -- core/scc/vscc/validator_onevalidsignature.go

下面,將對(duì)每個(gè)系統(tǒng)鏈碼的功能以及使用進(jìn)行闡述。值得注意的是,因?yàn)槲覀兛赡苄枰獋鬏攇olang結(jié)構(gòu)體的序列化的protobuf bytes,用命令行(CLI)進(jìn)行簡(jiǎn)單的invoke/query可能不能使用系統(tǒng)鏈碼的提供的全部功能。因此,推薦使用SDK進(jìn)行執(zhí)行這些功能。在本文中,僅通過CLI執(zhí)行invoke/query操作演示系統(tǒng)鏈碼的部分功能。

1. Configuration System Chaincode (CSCC)

CSCC 管理peer上通道相關(guān)的信息以及執(zhí)行通道配置交易。它提供五個(gè)方法:(i) JoinChain, (ii) GetConfigBlock, (iii) GetConfigTree, (iv) SimulateConfigTreeUpdate, (v) GetChannels

下面將介紹這些功能的使用。所有的命令都是在sample network (參考setup)中的指向peer0的客戶端中執(zhí)行的。為了運(yùn)行CSCC相關(guān)的命令,我們需要在CLI命令中使用peer channelpeer chaincode

JoinChain 方法用來使一個(gè)peer加入通道。它需要一個(gè)參數(shù),即通道配置區(qū)塊的序列化的protobuf bytes,其中通道配置區(qū)塊作為peer channel create命令的返回從orderer獲取。下面的CLI命令使peer加入名為ch1的通道。在調(diào)用CSCC時(shí),peer channel join命令負(fù)責(zé)讀取ch1.block并把它以bytes的形式傳入。但是,如果我們直接使用peer chaincode invoke來調(diào)用JoinChain方法,將ch1.block的內(nèi)容放入CLI請(qǐng)求是比較困難的。

$ peer channel join -b ch1.block

GetConfigBlock 方法用于獲取給定通道的當(dāng)前的配置區(qū)塊。它需要一個(gè)參數(shù),即通道名字的byte形式。如下的兩條CLI命令都可以用于獲取通道mychannel的配置區(qū)塊。

$ peer chaincode query -C "mychannel" -n cscc -c '{"Args":["GetConfigBlock", "mychannel"]}'

peer channel fetch -o orderer0:7050 config -c mychannel

GetChannels方法用于獲取peer目前所加入的通道。如下的兩條CLI命令都可以用于獲取所有的通道。

$ peer chaincode query -C "" -n cscc -c '{"Args":["GetChannels"]}'

$ peer channel list

GetConfigTreeSimulateConfigTreeUpdate用于獲取config結(jié)構(gòu)和模擬執(zhí)行config結(jié)構(gòu)更新。如果要從一個(gè)通道添加或移除組織,必須獲取config tree來進(jìn)行修改,并在調(diào)用SimulateConfigTree方法時(shí),必須獲取CSCC的背書。

2. Life Cycle System Chaincode (LSCC)

LSCC 用于管理鏈碼的生命周期——在peer上安裝、在通道上部署和升級(jí)、用戶從運(yùn)行中的鏈碼獲取信息。它提供了八個(gè)方法:(i) install, (ii) deploy, (iii) upgrade, (iv) getid, (v) getdepspec, (vi) getccdata, (vii) getchaincodes, (viii) getinstalledchaincodes。

install方法用于存儲(chǔ)chaincode程序到peer的文件系統(tǒng)(/var/hyperledger/production/chaincodes)。它需要一個(gè)參數(shù),即chaincode deployment spec (core/common/ccprovider/cdspackage.go)的序列化protobuf bytes。盡管我們可以通過傳入整個(gè)chaincode的內(nèi)容來直接調(diào)用LSCC,但更好的做法是使用peer chaincode install命令,這個(gè)命令在其將通過讀取chaincode的內(nèi)容對(duì)LSCC進(jìn)行調(diào)用。

$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

deploy方法用于在給定的通道上實(shí)例化合約。它可以接受五個(gè)參數(shù),前兩個(gè)參數(shù)——通道的名字和chaincode deployment spec是必須的,其他是那個(gè)參數(shù)——背書策略、背書系統(tǒng)合約的名字和驗(yàn)證系統(tǒng)合約的名字是可選的。

$ peer chaincode instantiate -o orderer0:7050 -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP', 'Org2MSP')"

getdepspec方法用于獲取安裝在peer上的合約的chaincode deployment spec。下面的CLI命令將從通道m(xù)ychannel中獲取mycc合約的deployment spec。

$ peer chaincode query -C mychannel -n lscc -c '{"Args":["getdepspec", "mychannel", "mychannel"]}'

getchaincodes方法用于獲取在部署在通道上的合約的列表。如下CLI命令從通道m(xù)ychannel上獲取實(shí)例化的合約列表。

$ peer chaincode query -C mychannel -n lscc -c '{"Args":["getchaincodes"]}'

getinstalledchaincodes方法用于獲取在peer上安裝的合約的列表。

$ peer chaincode query -C "" -n lscc -c '{"Args":["getinstalledchaincodes"]}'

upgrade方法用于升級(jí)合約。

$ peer chaincode upgrade -o orderer0:7050 -C mychannel -n mycc -v 2.0 -c '{"Args":["reinit"]}' -P "OR ('Org1MSP', 'Org2MSP')"

getid用于獲取合約的id

$ peer chaincode query -C mychannel -n lscc -c '{"Args":["getid","mychannel","mycc"]}'

getccdata用于獲取合約的數(shù)據(jù)。

$ peer chaincode query -C mychannel -n lscc -c '{"Args":["getccdata","mychannel","mycc"]}'

3. Query System Chaincode (QSCC)

QSCC 將特定的方法暴露給用戶,使得用戶可以查詢?cè)赽lock storage中存儲(chǔ)的區(qū)塊和交易。它提供五個(gè)方法:(i) GetChainInfo, (ii) GetBlockByNumber, (iii) GetBlockByHash, (iv) GetTransactionByID, (v) GetBlockByTxID。

GetBlockByNumber方法用于獲取序列化的區(qū)塊。下面的CLI命令從通道m(xù)ychannel中獲取序號(hào)為3的區(qū)塊。

$ peer chaincode query -C mychannel -n qscc -c '{"Args":["GetBlockByNumber", "mychannel", "3"]}'

其他方法類似。

4. Endorser System Chaincode (ESCC)

ESCC 被背書節(jié)點(diǎn)(core/endorser/endorser.go)調(diào)用。背書節(jié)點(diǎn)在執(zhí)行交易之后,將它的前面放在transaction response message中。其中,transaction response message也包括交集執(zhí)行的結(jié)果,如交易狀態(tài)、合約事件和read/write set等。一個(gè)調(diào)用功能可以包含5-7個(gè)參數(shù),即Header、ChaincodeProposalPayload、ChaincodeID、Response、simulation result、events、payload visibility。

5. Validator System Chaincode (VSCC)

VSCC 被記賬節(jié)點(diǎn)(core/committer/txvalidator/validator.go)調(diào)用,來根據(jù)合約的背書策略驗(yàn)證每個(gè)交易的簽名集合。

譯自:System Chaincodes in Hyperledger Fabric v1.1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容