Hyperledger Fabric v1.1提供了幾個特殊的鏈碼來執(zhí)行某些特殊的任務(wù),這些鏈碼被稱為系統(tǒng)鏈碼 (System Chaincode)。本文的目的是簡述這些鏈碼的實現(xiàn)改橘、功能和用法谍夭。與用戶鏈碼類似箩帚,系統(tǒng)鏈碼也實現(xiàn)了 Init() 和 Invoke() 方法璧帝。Fabric中一共有五種合約:
- Configuration System Chaincode (CSCC) -- core/scc/cscc/configure.go
- Life Cycle System Chaincode (LSCC) -- core/scc/lscc/lscc.go
- Query System Chaincode (QSCC) -- core/scc/qscc/query.go
- Endorser System Chaincode (ESCC) -- core/scc/escc/endorser_onevalidsignature.go
- Validator System Chaincode (VSCC) -- core/scc/vscc/validator_onevalidsignature.go
下面,將對每個系統(tǒng)鏈碼的功能以及使用進行闡述芋哭。值得注意的是沉衣,因為我們可能需要傳輸golang結(jié)構(gòu)體的序列化的protobuf bytes,用命令行(CLI)進行簡單的invoke/query可能不能使用系統(tǒng)鏈碼的提供的全部功能减牺。因此豌习,推薦使用SDK進行執(zhí)行這些功能。在本文中拔疚,僅通過CLI執(zhí)行invoke/query操作演示系統(tǒng)鏈碼的部分功能肥隆。
1. Configuration System Chaincode (CSCC)
CSCC 管理peer上通道相關(guān)的信息以及執(zhí)行通道配置交易。它提供五個方法:(i) JoinChain, (ii) GetConfigBlock, (iii) GetConfigTree, (iv) SimulateConfigTreeUpdate, (v) GetChannels草雕。
下面將介紹這些功能的使用巷屿。所有的命令都是在sample network (參考setup)中的指向peer0的客戶端中執(zhí)行的固以。為了運行CSCC相關(guān)的命令墩虹,我們需要在CLI命令中使用peer channel和peer chaincode。
JoinChain 方法用來使一個peer加入通道憨琳。它需要一個參數(shù)诫钓,即通道配置區(qū)塊的序列化的protobuf bytes,其中通道配置區(qū)塊作為peer channel create命令的返回從orderer獲取篙螟。下面的CLI命令使peer加入名為ch1的通道菌湃。在調(diào)用CSCC時,peer channel join命令負責讀取ch1.block并把它以bytes的形式傳入遍略。但是惧所,如果我們直接使用peer chaincode invoke來調(diào)用JoinChain方法,將ch1.block的內(nèi)容放入CLI請求是比較困難的绪杏。
$ peer channel join -b ch1.block
GetConfigBlock 方法用于獲取給定通道的當前的配置區(qū)塊下愈。它需要一個參數(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
GetConfigTree和SimulateConfigTreeUpdate用于獲取config結(jié)構(gòu)和模擬執(zhí)行config結(jié)構(gòu)更新履因。如果要從一個通道添加或移除組織障簿,必須獲取config tree來進行修改,并在調(diào)用SimulateConfigTree方法時栅迄,必須獲取CSCC的背書站故。
2. Life Cycle System Chaincode (LSCC)
LSCC 用于管理鏈碼的生命周期——在peer上安裝、在通道上部署和升級毅舆、用戶從運行中的鏈碼獲取信息世蔗。它提供了八個方法:(i) install, (ii) deploy, (iii) upgrade, (iv) getid, (v) getdepspec, (vi) getccdata, (vii) getchaincodes, (viii) getinstalledchaincodes。
install方法用于存儲chaincode程序到peer的文件系統(tǒng)(/var/hyperledger/production/chaincodes)朗兵。它需要一個參數(shù)污淋,即chaincode deployment spec (core/common/ccprovider/cdspackage.go)的序列化protobuf bytes。盡管我們可以通過傳入整個chaincode的內(nèi)容來直接調(diào)用LSCC余掖,但更好的做法是使用peer chaincode install命令寸爆,這個命令在其將通過讀取chaincode的內(nèi)容對LSCC進行調(diào)用。
$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
deploy方法用于在給定的通道上實例化合約盐欺。它可以接受五個參數(shù)赁豆,前兩個參數(shù)——通道的名字和chaincode deployment spec是必須的,其他是那個參數(shù)——背書策略冗美、背書系統(tǒng)合約的名字和驗證系統(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上獲取實例化的合約列表。
$ peer chaincode query -C mychannel -n lscc -c '{"Args":["getchaincodes"]}'
getinstalledchaincodes方法用于獲取在peer上安裝的合約的列表属韧。
$ peer chaincode query -C "" -n lscc -c '{"Args":["getinstalledchaincodes"]}'
upgrade方法用于升級合約安拟。
$ 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 將特定的方法暴露給用戶宵喂,使得用戶可以查詢在block storage中存儲的區(qū)塊和交易糠赦。它提供五個方法:(i) GetChainInfo, (ii) GetBlockByNumber, (iii) GetBlockByHash, (iv) GetTransactionByID, (v) GetBlockByTxID。
GetBlockByNumber方法用于獲取序列化的區(qū)塊锅棕。下面的CLI命令從通道m(xù)ychannel中獲取序號為3的區(qū)塊拙泽。
$ peer chaincode query -C mychannel -n qscc -c '{"Args":["GetBlockByNumber", "mychannel", "3"]}'
其他方法類似。
4. Endorser System Chaincode (ESCC)
ESCC 被背書節(jié)點(core/endorser/endorser.go)調(diào)用裸燎。背書節(jié)點在執(zhí)行交易之后顾瞻,將它的前面放在transaction response message中。其中顺少,transaction response message也包括交集執(zhí)行的結(jié)果朋其,如交易狀態(tài)王浴、合約事件和read/write set等。一個調(diào)用功能可以包含5-7個參數(shù)梅猿,即Header氓辣、ChaincodeProposalPayload、ChaincodeID袱蚓、Response钞啸、simulation result、events喇潘、payload visibility体斩。
5. Validator System Chaincode (VSCC)
VSCC 被記賬節(jié)點(core/committer/txvalidator/validator.go)調(diào)用,來根據(jù)合約的背書策略驗證每個交易的簽名集合。