如何在使用 hyperledger-composer 实现的区块链中查找资产的交易历史记录?
How do I find the history of transactions for an Asset in a blockchain implemented using hyperledger-composer?
我正在研究 hyperledger-composer (V0.13) 的最新版本,并构建了一个具有多个角色的网络,每个角色都可以调用区块链中的选定交易。我现在想查询区块链(?Historian?)以获取针对特定订单(定义的资产类型)执行的所有交易。
我使用了两种不同的方法来提取 Historian 数据,一种是通过直接 API 访问 historian.getall()
,另一种是通过定义的查询:
query getHistorianRecords {
description: "get all Historian records"
statement: SELECT org.hyperledger.composer.system.HistorianRecord
}
两个查询都成功,因为它们 return 系统内的所有事务。每个前任:
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 系统中的其他服务给我该信息?
您尝试做的事情完全有道理,但是 Historian 尚不支持它。正在此处跟踪此要求:
https://github.com/hyperledger/composer/issues/991
计划将元数据添加到 HistorianRecord
中,以捕获受交易影响的资产和参与者的 ID 以及执行的操作(删除、更新、创建、读取?)。
完成后,您将能够查询引用给定 asset/participant id 的 HistorianRecord
。
我的解决方法是让事务将结果作为事件发出,然后进行查询,然后通过 id 从 HistorianRecords 中获取事务,其中将包含之前作为事件发出的结果。
我在这里发布了详细的答案:
https://github.com/hyperledger/composer/issues/2458#issuecomment-383377837
一个好的解决方法是编写一个脚本函数来更新资产,将结果作为事件发出。并从交易选项卡中的其余端点过滤它。
一种解决方法是为您的交易发出一个事件。提及 ASSET 作为事件的一个字段。请尝试以下代码。
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);}
我正在研究 hyperledger-composer (V0.13) 的最新版本,并构建了一个具有多个角色的网络,每个角色都可以调用区块链中的选定交易。我现在想查询区块链(?Historian?)以获取针对特定订单(定义的资产类型)执行的所有交易。
我使用了两种不同的方法来提取 Historian 数据,一种是通过直接 API 访问 historian.getall()
,另一种是通过定义的查询:
query getHistorianRecords {
description: "get all Historian records"
statement: SELECT org.hyperledger.composer.system.HistorianRecord
}
两个查询都成功,因为它们 return 系统内的所有事务。每个前任:
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 系统中的其他服务给我该信息?
您尝试做的事情完全有道理,但是 Historian 尚不支持它。正在此处跟踪此要求: https://github.com/hyperledger/composer/issues/991
计划将元数据添加到 HistorianRecord
中,以捕获受交易影响的资产和参与者的 ID 以及执行的操作(删除、更新、创建、读取?)。
完成后,您将能够查询引用给定 asset/participant id 的 HistorianRecord
。
我的解决方法是让事务将结果作为事件发出,然后进行查询,然后通过 id 从 HistorianRecords 中获取事务,其中将包含之前作为事件发出的结果。
我在这里发布了详细的答案: https://github.com/hyperledger/composer/issues/2458#issuecomment-383377837
一个好的解决方法是编写一个脚本函数来更新资产,将结果作为事件发出。并从交易选项卡中的其余端点过滤它。
一种解决方法是为您的交易发出一个事件。提及 ASSET 作为事件的一个字段。请尝试以下代码。
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);}