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)
}

你可能感兴趣的:(Hyperledger Fabric 1.3 特性调研之其他(三))