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'
此外,要查看您正在分区的资产 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"
}
]
假设我只想获取涉及特定资产的所有交易的列表(假设我需要对此进行查询?)。我应该使用 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'
此外,要查看您正在分区的资产 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"
}
]