Hyperledger Fabric 链码(3) 生命周期和API
1. Chaincode的5個生命周期命令
- 鏈碼打包
- 鏈碼安裝
eg.peer chaincode install ccpack.out - 鏈碼實例化
eg. peer.sh chaincode instantiate -n mycc -v 0 -c ‘{“Args”:[“init”,“a”,“100”,“b”,“200”]}’ -C mychannel - 鏈碼升級(當鏈碼的代碼發生改變時,就需要升級鏈碼)
- 鏈碼簽名
2. peer命令提供了8個子命令管理鏈碼
- Install
- instantiate
- invoke
- list
- package
- query
- signpackage
- upgrade
3.鏈碼API(主要是shim包提供,分為5類)
3.1 參數解析API:用來獲取參數的賬本數據狀態
-
GetStringArgs() []string
返回調用鏈碼時指定提供的參數列表(以字符串數組形式返回) -
GetFunctionAndParameters() (function string, params []string)
返回調用鏈碼時在交易提案中指定提供的被調用的函數名稱及函數的參數列表(以字符串數組形式返回) -
GetArgsSlice() ([]byte, error)
返回提交交易提案時提供的參數列表(以字節串數組形式返回) -
GetArgs() [][]byte
返回調用鏈碼時在交易提案中指定提供的被調用的函數名稱及函數的參數列表(以字符串數組形式返回)
3.2 操作API:對賬本數據查詢、更新等
-
GetState(key string) ([]byte, error)
查詢賬本,返回指定鍵對應的值 -
PutState(key string, value []byte) error
嘗試添加/更新賬本中的一對鍵值。 這一對鍵值會被添加到寫集合中,等待 Committer 進一步確認,驗證通過后才會真正寫入到賬本 -
DelState(key string) error
嘗試刪除賬本中的一對鍵值。 同樣,對該對鍵值刪除會添加到寫集合中,等待 Committer 進一步確認,驗證通過后才會真正寫入到賬本 -
GetStateByRange(startKey, endKey string) (StateQueryIteratorInterface, error)
查詢指定范圍的鍵值,startKey 和 endkey 分別指定開始(包括)和終止(不包括),當為空時默認是最大范圍。 返回結果是一個迭代器結構,可以按照字典序迭代每個鍵值對,最后需要調用 Close() 方法關閉 -
GetHistoryForKey(key string) (HistoryQueryIteratorInterface, error)
返回指定鍵的所有歷史值。該方法的使用需要節點配置中打開歷史數據庫特性(ledger.history.enableHistoryDatabase=true) -
CreateCompositeKey(objectType string, attributes []string) (string, error)
給定一組屬性(attributes),將這些屬性組合起來構造返回一個復合鍵。eg.CreateComositeKey(“name-age”,[]string{“Alice”, “12”}); -
SplitCompositeKey(compositeKey string) (string, []string, error)
將指定的復合鍵進行分割,拆分成構造復合鍵時所用的屬性 -
GetStateByPartialCompositeKey(objectType string, keys []string)
根據局部的復合鍵(前綴)返回所有匹配的鍵值,即與賬本中的鍵進行前綴匹配。返回結果是一個迭代器結構,可以按照字典序迭代每個鍵值對,最后需要調用 Close() 方法關閉
(StateQueryIteratorInterface, error) -
GetQueryResult(query string) (StateQueryIteratorInterface, error)
對(支持富查詢功能的)狀態數據庫進行富查詢,返回結果是一個迭代器結構,目前只支持 CouchDB。注意該方法不會被 Committer 重新執行進行驗證,所以不能用于更新賬本狀態的交易中
注意: 通過 put 寫入的數據狀態不能立刻 get 到,因為 put 只是鏈碼執行的模擬交易(防止重復提交攻擊),并不會真正將狀態保存到賬本中,必須經過 Orderer 達成共識之后,將數據狀態保存在區塊中,然后保存在各 peer 節點的賬本中。
3.3 交易信息獲取API:獲取提交的交易信息
-
GetTxID() string
返回交易提案中指定的交易 ID。一般情況下,交易 ID 是客戶端提交提案時由 Nonce 隨機串和簽名者身份信息哈希產生的數字摘要 -
GetChannelID() string
返回交易提案中指定的 Channel ID -
GetTxTimestamp() (*timestamp.Timestamp, error)
返回交易被創建時的客戶端打上的的時間戳。這個時間戳是直接從交易 ChannnelHeader 中提取的,所以在所以背書節點處看到的值都相同 -
GetBinding() ([]byte, error)
返回交易的 binding 信息。交易的 binding 信息是將交提案的 nonse、Creator、epoch 等信息組合起來哈希得到數字摘要 -
GetSignedProposal() (*pb.SignedProposal, error)
返回該 stub 的 SignedProposal 結構,包括了跟交易提案相關的所有數據 -
GetCreator() ([]byte, error)
返回該交易提交者的身份信息(用戶證書)。 從 SignedProposal 中的 SignatureHeader.Creator 提取 -
GetTransient() (map[string][]byte, error)
返回交易中帶有的一些臨時信息。從 ChaincodeProposalPayload.transient 提取,可以存放與應用相關的保密信息,該信息不會被寫入到賬本
3.4 事件處理API:與事件處理相關
-
GetPrivateData(collection, key string) ([]byte, error)
根據指定的 key,從指定的私有數據集中查詢對應的私有數據 -
PutPrivateData(collection string, key string, value []byte) error
將指定的 key 與 value 保存到私有數據集中 -
DelPrivateData(collection, key string) error
根據指定的 key 從私有數據集中刪除相應的數據 -
GetPrivateDataByRange(collection, startKey, endKey string) (StateQueryIteratorInterface, error)
根據指定的開始與結束 key 查詢范圍(不包含結束key)內的私有數據 -
GetPrivateDataByPartialCompositeKey(collection, objectType string, keys []string) (StateQueryIteratorInterface, error)
根據給定的部分組合鍵的集合,查詢給定的私有狀態 -
GetPrivateDataQueryResult(collection, query string) (StateQueryIteratorInterface, error)
根據指定的查詢字符串執行富查詢 (只支持支持富查詢的 CouchDB)
3.5 對私有數據操作的API:專門對私有數據操作
-
SetEvent(name string, payload []byte) error
設定當這個交易在 Committer 處被認證通過,寫入到區塊時發送的事件(event),一般由 Client 監聽 -
InvokeChaincode(chaincodeName string, args [][]byte, channel string) pb.Response
調用另外一個鏈碼的 Invoke 方法。 如果被調用鏈碼在同一個通道內,則添加其讀寫集合信息到調用交易;否則執行調用但不影響讀寫集合信息// 如果 channel 為空,則默認為當前通道。目前僅限讀操作,同時不會生成新的交易
總結
以上是生活随笔為你收集整理的Hyperledger Fabric 链码(3) 生命周期和API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (chap3 数据链路) 介质型网络
- 下一篇: Hyperledger Fabric 私