1. 查詢(xún)支持翻頁(yè)
Fabric提供支持翻頁(yè)的查詢(xún)接口劳澄,可以設(shè)置書(shū)簽(頁(yè)面起始位置)和頁(yè)面大小。
適用場(chǎng)景
對(duì)于請(qǐng)求范圍數(shù)據(jù)蜈七,數(shù)據(jù)記錄數(shù)過(guò)多的情況秒拔,可以使用Fabric新增的翻頁(yè)查詢(xún)功能,免除代碼中自己實(shí)現(xiàn)翻頁(yè)邏輯宪潮。
技術(shù)實(shí)現(xiàn)
Fabric實(shí)現(xiàn)了翻頁(yè)邏輯的代碼溯警,通過(guò)設(shè)置書(shū)簽記錄頁(yè)面起始位置。對(duì)于LevelDB狡相,返回的書(shū)簽是本次查詢(xún)結(jié)果最后一條記錄的下一條記錄的key梯轻;對(duì)于CouchDB,F(xiàn)abric并沒(méi)有使用它的skip和limit參數(shù)尽棕,使用了bookmark參數(shù)喳挑。
接口
合約新增的支持翻頁(yè)的查詢(xún)函數(shù)包括如下:
GetStateByRangeWithPagination(startKey, endKey string, pageSize int32, bookmark string) (StateQueryIteratorInterface, *pb.QueryResponseMetadata, error)
GetStateByPartialCompositeKeyWithPagination(objectType string, keys []string, pageSize int32, bookmark string) (StateQueryIteratorInterface, *pb.QueryResponseMetadata, error)
// 該接口僅支持CouchDB
GetQueryResultWithPagination(query string, pageSize int32, bookmark string) (StateQueryIteratorInterface, *pb.QueryResponseMetadata, error)
實(shí)際操作
【此處參照f(shuō)abric-sample中提供的marbles02合約示例√舷ぃ】
合約可以通過(guò)如下代碼獲得從指定位置開(kāi)始的指定頁(yè)面大小的數(shù)據(jù):
resultsIterator, responseMetadata, err := stub.GetStateByRangeWithPagination(startKey, endKey, int32(pageSize), bookmark)
if err != nil {
return shim.Error(err.Error())
}
defer resultsIterator.Close()
其中StartKey和endKey是范圍的開(kāi)始值(包括在內(nèi)伊诵,如果設(shè)置為空字符串“”,則從開(kāi)頭處開(kāi)始)和結(jié)束值(不包括在內(nèi)回官,如果設(shè)置為空字符串“”曹宴,則包括結(jié)尾),和GetStateByRange函數(shù)一致歉提。pageSize為頁(yè)面大械烟埂;bookmark是頁(yè)面開(kāi)始的位置苔巨,如果是leveldb則為key的值版扩,如果是couchdb則為類(lèi)似“g1AAAAA-eJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYqz5yYWJeWkGoKkOWDSyBJZABxmEgs”的字符串。如果設(shè)置bookmark為空字符串“”侄泽,則默認(rèn)從startKey開(kāi)始礁芦。
返回的responseMetadata中包括兩個(gè)字段:FetchedRecordsCount是本次查詢(xún)獲取的記錄數(shù)目,Bookmark是下一頁(yè)開(kāi)始的位置悼尾。
2. 合約支持Java
Fabric合約原先支持Golang和Node.js柿扣,現(xiàn)在提供對(duì)Java的支持。
3. 廢除event hub
Fabric事件的查詢(xún)可以通過(guò)兩種方式:event hub和peer channel-based event service诀豁。其中窄刘,后者在release 1.1中已經(jīng)支持。
- Event hub:每當(dāng)產(chǎn)生新的區(qū)塊舷胜,則發(fā)送事件通知娩践;
- 基于通道的事件服務(wù)(peer channel-based event service):可以查詢(xún)指定channel下的指定區(qū)塊范圍內(nèi)的事件信息。
而Fabric 1.3將不再支持event hub烹骨。
適用場(chǎng)景
事件查詢(xún)可以用于執(zhí)行交易后查詢(xún)交易是否寫(xiě)入?yún)^(qū)塊且有效翻伺,也可以用于回溯以往的區(qū)塊中的事件。
接口
peer channel-based event service提供以下接口支持:
// PeerDeliverClient defines the interface for a peer deliver clienttype
PeerDeliverClient interface {
Deliver(ctx context.Context, opts ...grpc.CallOption) (api.Deliver, error)
DeliverFiltered(ctx context.Context, opts ...grpc.CallOption) (api.Deliver, error)
}