Hyperledger Fabric 1.3 特性调研之其他(三
1. 查询支持翻页
Fabric提供支持翻页的查询接口,可以设置书签(页面起始位置)和页面大小。
适用场景
对于请求范围数据,数据记录数过多的情况,可以使用Fabric新增的翻页查询功能,免除代码中自己实现翻页逻辑。
技术实现
Fabric实现了翻页逻辑的代码,通过设置书签记录页面起始位置。对于LevelDB,返回的书签是本次查询结果最后一条记录的下一条记录的key;对于CouchDB,Fabric并没有使用它的skip和limit参数,使用了bookmark参数。
接口
合约新增的支持翻页的查询函数包括如下:
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)
实际操作
【此处参照fabric-sample中提供的marbles02合约示例。】
合约可以通过如下代码获得从指定位置开始的指定页面大小的数据:
resultsIterator, responseMetadata, err := stub.GetStateByRangeWithPagination(startKey, endKey, int32(pageSize), bookmark)
if err != nil {
return shim.Error(err.Error())
}
defer resultsIterator.Close()
其中StartKey和endKey是范围的开始值(包括在内,如果设置为空字符串“”,则从开头处开始)和结束值(不包括在内,如果设置为空字符串“”,则包括结尾),和GetStateByRange函数一致。pageSize为页面大小;bookmark是页面开始的位置,如果是leveldb则为key的值,如果是couchdb则为类似“g1AAAAA-eJzLYWBgYMpgSmHgKy5JLCrJTq2MT8lPzkzJBYqz5yYWJeWkGoKkOWDSyBJZABxmEgs”的字符串。如果设置bookmark为空字符串“”,则默认从startKey开始。
返回的responseMetadata中包括两个字段:FetchedRecordsCount是本次查询获取的记录数目,Bookmark是下一页开始的位置。
2. 合约支持Java
Fabric合约原先支持Golang和Node.js,现在提供对Java的支持。
3. 废除event hub
Fabric事件的查询可以通过两种方式:event hub和peer channel-based event service。其中,后者在release 1.1中已经支持。
- Event hub:每当产生新的区块,则发送事件通知;
- 基于通道的事件服务(peer channel-based event service):可以查询指定channel下的指定区块范围内的事件信息。
而Fabric 1.3将不再支持event hub。
适用场景
事件查询可以用于执行交易后查询交易是否写入区块且有效,也可以用于回溯以往的区块中的事件。
接口
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)}