Hyperledger Composer历史库

Hyperledger Composer Historian是一个专门记录成功交易的库,包括提交他们的参与者和身份。历史库将交易存储为在Hyperledger Composer系统命名空间中定义的一个HistorianRecord资产。

历史库是Hyperledger Composer系统级实体。为了将历史库作为访问控制的资源,历史库必须被引用为:org.hyperledger.composer.system.HistorianRecord

请注意:所有参与者必须有创建HistorianRecord资产的权限。如果交易是由无权创建HistorianRecord资产的参与者提交的,则交易将失败。

HistorianRecord资产

历史库将成功的交易存储为HistorianRecord资产。只要交易成功完成,HistorianRecord就会创建一个资产并添加到历史库中。Record资产在系统命名空间中定义,并具有以下定义:

  1. asset HistorianRecord identified by transactionId {
  2. o String transactionId
  3. o String transactionType
  4. --> Transaction transactionInvoked
  5. --> Participant participantInvoking optional
  6. --> Identity identityUsed optional
  7. o Event[] eventsEmitted optional
  8. o DateTime transactionTimestamp
  9. }
  • String transactionId,创建HistorianRecord资产的交易的transactionId 。
  • String transactionType,创建HistorianRecord资产的交易类别。
  • Transaction transactionInvoked,一个创建HistorianRecord资产的交易的关联。
  • Participant participantInvoking, 一个指向提交交易的参与者的关联。
  • Identity identityUsed ,一个指向提交交易的身份的关联。
  • Event[] eventsEmitted ,一个包含交易发出的任何事件的可选属性。
  • DateTime transactionTimestamp,创建HistorianRecord资产的交易的时间戳。

所有HistorianRecord资产都有关联指向创建它们的交易、调用交易的参与者和提交交易时使用的身份。希望获得这些属性的应用程序必须解析这种关联。

系统交易

Hyperledger Composer运行时所做的几个操作被归类为交易。这些“系统交易”是在Hyperledger Composer系统模型中定义的。以下将添加HistorianRecord资产:

  • 添加、删除和更新资产

  • 添加、删除和更新参与者

  • 签发、绑定、激活和撤销身份

  • 更新业务网络定义

保护历史库数据

作为一个库(registry),访问历史库数据可以通过访问控制规则来控制。但是,作为系统级实体,历史库的资源名称始终是org.hyperledger.composer.system.HistorianRecord

以下访问控制规则让成员只能看到自己提交交易的历史库数据。

  1. rule historianAccess{
  2. description: "Only allow members to read historian records referencing transactions they submitted."
  3. participant(p): "org.example.member"
  4. operation: READ
  5. resource(r): "org.hyperledger.composer.system.HistorianRecord"
  6. condition: (r.participantInvoking.getIdentifier() == p.getIdentifier())
  7. action: ALLOW
  8. }

获取历史库数据

历史库的数据可以使用API调用或查询来获取。

在历史库中使用客户端和REST API

HistorianRecord资产可以使用REST API 调用system/historiansystem/historian/{id}返回。

在使用REST API时,GET调用system/historian将返回所有历史数据。这个调用应该小心使用,返回不受限制,可能会导致大量的数据被返回。

system/historian/{id}使用REST API的GET调用将返回HistorianRecord指定的资产。

查询历史库

历史库可以像其他库(registry)一样查询。例如,返回所有HistorianRecord资产的典型查询如下所示:

  1. .then(() => {
  2. return businessNetworkConnection.getHistorian();
  3. }).then((historian) => {
  4. return historian.getAll();
  5. }).then((historianRecords) => {
  6. console.log(prettyoutput(historianRecords));
  7. })

由于这是一个“getAll”调用,它可能会返回大量的数据。因此,查询部分记录的能力很重要。一个典型的例子就是根据时间来选择记录。这使用了按交易时间戳(超过某时间点)选择记录的查询能力。返回的记录可以用相同的方式处理。

  1. let now = new Date();
  2. now.setMinutes(10); // set the date to be time you want to query from
  3. let q1 = businessNetworkConnection.buildQuery('SELECT org.hyperledger.composer.system.HistorianRecord ' +
  4. 'WHERE (transactionTimestamp > _$justnow)');
  5. return businessNetworkConnection.query(q1,{justnow:now});

可以使用更高级的查询; 例如,以下查询选择并返回“添加”、“更新”和“移除”资产系统交易。

  1. // build the special query for historian records
  2. let q1 = businessNetworkConnection.buildQuery(
  3. `SELECT org.hyperledger.composer.system.HistorianRecord
  4. WHERE (transactionType == 'AddAsset' OR transactionType == 'UpdateAsset' OR transactionType == 'RemoveAsset')`
  5. );
  6. return businessNetworkConnection.query(q1);

接下来是什么?