Fabric 系統鏈碼

什麼是系統鏈碼

fabric 自 1.0 版本開始,將鏈碼分爲系統鏈碼和普通鏈碼兩種。普通鏈碼(智能合約)用於實現業務邏輯,而系統鏈碼則是用於系統管理,例如 lscc、qscc等。
與普通鏈碼需要獨立沙盒環境運行不同,系統鏈碼在 peer 服務啓動時隨 peer 節點註冊,同 peer 節點一起運行。
在 fabric 1.0 版本時,系統鏈碼爲固定的 5 個:lscc、qscc、cscc、vscc、escc,這 5 個鏈碼功能固定,分別用於鏈碼生命週期管理、區塊/交易查詢、通道配置管理、交易背書和交易驗證。

什麼是系統鏈碼插件

系統鏈碼使用方便,但是由於其功能、邏輯固定,不利於擴展。在 1.1 版本開始,fabric 允許定製自己的 vscc 和 escc,這樣智能合約所能實現的交易模式會更加豐富。
實現這個功能就是 fabric 開始支持系統鏈碼插件,通過插件的形式達到動態註冊系統鏈碼的目的。

有哪些系統鏈碼

Hyperledger Fabric v1.1提供了幾個特殊的鏈碼來執行某些特殊的任務,這些鏈碼被稱爲系統鏈碼 (System Chaincode)。本文的目的是簡述這些鏈碼的實現、功能和用法。與用戶鏈碼類似,系統鏈碼也實現了 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

下面,將對每個系統鏈碼的功能以及使用進行闡述。值得注意的是,因爲我們可能需要傳輸golang結構體的序列化的protobuf bytes,用命令行(CLI)進行簡單的invoke/query可能不能使用系統鏈碼的提供的全部功能。因此,推薦使用SDK進行執行這些功能。在本文中,僅通過CLI執行invoke/query操作演示系統鏈碼的部分功能。

Configuration System Chaincode (CSCC)

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

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

JoinChain 方法用來使一個peer加入通道。它需要一個參數,即通道配置區塊的序列化的protobuf bytes,其中通道配置區塊作爲peer channel create命令的返回從orderer獲取。下面的CLI命令使peer加入名爲ch1的通道。在調用CSCC時,peer channel join命令負責讀取ch1.block並把它以bytes的形式傳入。但是,如果我們直接使用peer chaincode invoke來調用JoinChain方法,將ch1.block的內容放入CLI請求是比較困難的。

$ peer channel join -b ch1.block

GetConfigBlock 方法用於獲取給定通道的當前的配置區塊。它需要一個參數,即通道名字的byte形式。如下的兩條CLI命令都可以用於獲取通道mychannel的配置區塊。

$ 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結構和模擬執行config結構更新。如果要從一個通道添加或移除組織,必須獲取config tree來進行修改,並在調用SimulateConfigTree方法時,必須獲取CSCC的背書。

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的文件系統(/var/hyperledger/production/chaincodes)。它需要一個參數,即chaincode deployment spec (core/common/ccprovider/cdspackage.go)的序列化protobuf bytes。儘管我們可以通過傳入整個chaincode的內容來直接調用LSCC,但更好的做法是使用peer chaincode install命令,這個命令在其將通過讀取chaincode的內容對LSCC進行調用。

$ peer chaincode install -n mycc -v 1.0 -p 

github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

deploy方法用於在給定的通道上實例化合約。它可以接受五個參數,前兩個參數——通道的名字和chaincode deployment spec是必須的,其他是那個參數——背書策略、背書系統合約的名字和驗證系統合約的名字是可選的。

$ 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命令將從通道mychannel中獲取mycc合約的deployment spec。

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

getchaincodes方法用於獲取在部署在通道上的合約的列表。如下CLI命令從通道mychannel上獲取實例化的合約列表。

$ 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用於獲取合約的數據。

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

Query System Chaincode (QSCC)

QSCC 將特定的方法暴露給用戶,使得用戶可以查詢在block storage中存儲的區塊和交易。它提供五個方法:(i) GetChainInfo, (ii) GetBlockByNumber, (iii) GetBlockByHash, (iv) GetTransactionByID, (v) GetBlockByTxID。

GetBlockByNumber方法用於獲取序列化的區塊。下面的CLI命令從通道mychannel中獲取序號爲3的區塊。

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

其他方法類似。

Endorser System Chaincode (ESCC)

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

Validator System Chaincode (VSCC)

VSCC 被記賬節點(core/committer/txvalidator/validator.go)調用,來根據合約的背書策略驗證每個交易的簽名集合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章