TransactionRegistry 和 Historian 之间有什么区别?

What is the difference between the TransactionRegistry and the Historian?

假设我只想获取涉及特定资产的所有交易的列表(假设我需要对此进行查询?)。我应该使用 TransactionRegistry 还是 Historian?有什么区别?

我们为 Historian 打开了一个当前问题,以显示特定资产的变化/增量历史 - https://github.com/hyperledger/composer/issues/991 As a workaround you can do the following - so for sample network trade-network 资产商品(和交易 class 'Trade') 您可以创建一个查询,例如:

query selectTransaction {description: "choose specific commodity asset"
     statement: SELECT org.acme.biznet.Trade 
       WHERE (commodity == _$commodity ) } 

关于区别:

Historian 记录所有交易活动(例如创建资产、创建参与者、创建身份等 - 以及业务网络特定的自定义交易,如 'TransferAsset' 或 'PlaceOrder')包括(其中资产/参与者关心)发生了什么变化。

对于 TransactionRegistry 本身(即特定的 class - 比如 'TransferAsset' 或 'PlaceOrder'),它存储在那个 class 的事务注册表中 - 你可能有您的业​​务网络中有许多事务 classes。但是这里的任何内容都不会与其他活动相关,例如系统活动,这些活动也记录在 Historian 记录中。

查询 - 你会做这样的事情(例如在查询文件中):

query myTransactions{
description: "return all transactions made (ie system transactions)"
  statement: SELECT org.acme.sample.PlaceOrder
}

SELECT org.acme.sample.NAME_OF_TRANSACTION_CLASS

对于 Historian 查询 - 例如

SELECT org.hyperledger.composer.system.HistorianRecord WHERE (transactionType == 'myTranType'

在此处查看更多示例 -> https://www.ibm.com/developerworks/cloud/library/cl-create-powerful-blockchain-queries-with-hyperledger-composer/index.html

此外,要查看您正在分区的资产 ID 的交易数据(delta)——即可以通过交易 class 的 transactionInvoked 字段获得(例如 org.acme.trading.Trade 交易 class)。您可以将 REST API 与环回过滤器一起使用 - 例如(return 下面的承诺):

return this.httpClient.get('<a href="http://localhost:3000/api/Trade?filter=%7B%22include%22%3A%22resolve%22%7D" rel="nofollow noreferrer">http://localhost:3000/api/Trade?filter=%7B%22include%22%3A%22resolve%22%7D</a>', {withCredentials: true}).toPromise();` </p> <p>

return this.httpClient.get('<a href="http://localhost:3000/api/Trade?filter=%7B%22include%22%3A%22resolve%22%7D" rel="nofollow noreferrer">http://localhost:3000/api/Trade?filter=%7B%22include%22%3A%22resolve%22%7D</a>').toPromise();

它有 {"include":"resolve"} 过滤器来解析事务中的关系 class - 每个解析的事务都有事务增量。然后您可以查找有问题的资产 ID。

示例未解决交易 class(下面,后跟已解​​决的 txn class):

未解决:

[ { "$class": "org.acme.mynetwork.Trade", "commodity": "resource:org.acme.mynetwork.Commodity#1", "newOwner": "resource:org.acme.mynetwork.Trader#2", "transactionId": "354dca97fc6ac00aabbd923883e3ec2a3d09b8c75a54a8f536a88b6df31e8a0f", "timestamp": "2018-03-23T12:02:11.228Z" }, { "$class": "org.acme.mynetwork.Trade", "commodity": "resource:org.acme.mynetwork.Commodity#2", "newOwner": "resource:org.acme.mynetwork.Trader#1", "transactionId": "9da43acca718633ac8870e6ea34c3c9f481194e48bcdba42673570177091809f", "timestamp": "2018-03-23T12:02:31.294Z" } ] {"include":"resolve"} 作为过滤器解决: [ { "$class": "org.acme.mynetwork.Trade", "commodity": { "$class": "org.acme.mynetwork.Commodity", "tradingSymbol": "1", "description": "werwer", "mainExchange": "wrrewer", "quantity": 10, "owner": { "$class": "org.acme.mynetwork.Trader", "tradeId": "2", "firstName": "tes2t", "lastName": "test" } }, "newOwner": { "$class": "org.acme.mynetwork.Trader", "tradeId": "2", "firstName": "tes2t", "lastName": "test" }, "transactionId": "354dca97fc6ac00aabbd923883e3ec2a3d09b8c75a54a8f536a88b6df31e8a0f", "timestamp": "2018-03-23T12:02:11.228Z" }, { "$class": "org.acme.mynetwork.Trade", "commodity": { "$class": "org.acme.mynetwork.Commodity", "tradingSymbol": "2", "description": "Ut fugiat.", "mainExchange": "ACE2", "quantity": 10, "owner": { "$class": "org.acme.mynetwork.Trader", "tradeId": "1", "firstName": "test", "lastName": "test" } }, "newOwner": { "$class": "org.acme.mynetwork.Trader", "tradeId": "1", "firstName": "test", "lastName": "test" }, "transactionId": "9da43acca718633ac8870e6ea34c3c9f481194e48bcdba42673570177091809f", "timestamp": "2018-03-23T12:02:31.294Z" } ]