6

我正在开发最新版本的超级账本作曲家(V0.13),并建立了一个具有多个角色的网络,每个角色都可以调用区块链中的选定交易。我现在想在区块链(?Historian?)中查询针对特定订单(定义的资产类型)执行的所有交易。

我使用了两种不同的方法来提取 Historian 数据,一种是通过直接 API 访问historian.getall(),另一种是通过定义的查询:

query getHistorianRecords {
  description: "get all Historian records"
  statement: SELECT org.hyperledger.composer.system.HistorianRecord

}

两个查询都成功,因为它们返回系统内的所有事务。每个前:

ValidatedResource {
    '$modelManager': ModelManager { modelFiles: [Object] },
    '$namespace': 'org.hyperledger.composer.system',
    '$type': 'HistorianRecord',
    '$identifier': '0c3274475fed3703692bb7344453ab0910686905451b41d5d08ff1b032732aa1',
    '$validator': ResourceValidator { options: {} },
    transactionId: '0c3274475fed3703692bb7344453ab0910686905451b41d5d08ff1b032732aa1',
    transactionType: 'org.acme.Z2BTestNetwork.CreateOrder',
    transactionInvoked: 
     Relationship {
       '$modelManager': [Object],
       '$namespace': 'org.acme.Z2BTestNetwork',
       '$type': 'CreateOrder',
       '$identifier': '0c3274475fed3703692bb7344453ab0910686905451b41d5d08ff1b032732aa1',
       '$class': 'Relationship' },
    eventsEmitted: [],
    transactionTimestamp: 2017-09-22T19:32:48.182Z }

我找不到并且需要的是一种针对单个订单查询交易历史的方法。订单的定义(部分列表)如下:

asset Order identified by orderNumber {
    o String orderNumber
    o String[] items
    o String status
    ...
    o String approved
    o String paid
    --> Provider provider
    --> Shipper shipper
    --> Buyer buyer
    --> Seller seller 
    --> FinanceCo financeCo 

我正在寻找的是一种机制,它允许我查询区块链以获取与Order with orderNumber = '009'. 我可以并且已经很容易找到订单#009 的当前状态,但我现在正在寻找针对该订单的交易历史。如何告诉 Historian 或 hyperledger-composer 系统中的其他服务向我提供该信息?

4

4 回答 4

6

您尝试做的事情完全有道理,但是历史学家还不支持它。此处正在跟踪此要求: https ://github.com/hyperledger/composer/issues/991

计划是将元数据添加到其中,HistorianRecord以捕获受交易影响的资产和参与者的 ID 以及执行的操作(删除、更新、创建、读取?)。

一旦到位,您将能够查询HistorianRecord引用给定资产/参与者 ID 的 s。

于 2017-09-23T10:32:02.460 回答
1

我的解决方法是让事务将结果作为事件发出并进行查询,然后通过 id 从 HistorianRecords 获取事务,该事务将包含之前作为事件发出的结果。

我在这里发布了详细的答案: https ://github.com/hyperledger/composer/issues/2458#issuecomment-383377837

于 2018-04-22T12:42:09.523 回答
0

一个好的解决方法是编写一个脚本函数来更新资产,将结果作为事件发出。并从 transactions 选项卡中的其余端点过滤它。

于 2018-07-10T04:48:42.813 回答
0

一种解决方法是为您的事务发出一个事件。提及资产作为事件的一个字段。请尝试以下代码。

let historian = await businessNetworkConnection.getHistorian(); let historianRecords = await historian.getAll(); for(let i=0; i< historianRecords.length;i++) {console.log(historianRecords[i].transactionId+ "-----> " + historianRecords[i].eventsEmitted[0].YOUR_ASSET_NAME);}

于 2019-04-30T11:53:47.890 回答