如何通过交易ID获取资产与参与者状态及交易历史查询咨询
问题解答
一、如何通过交易ID获取资产和参与者的状态
你可以通过REST API或Composer SDK两种方式实现,具体步骤如下:
方法1:使用REST API
- 首先调用
GET /system/historian/{transactionId}接口,获取对应的HistorianRecord记录。这个记录里的transactionInvoked字段会指向实际执行的交易资源(比如创建参与者、更新资产的交易)。 - 解析
transactionInvoked的值:它的格式是resource:{命名空间}.{类型}#{ID},比如resource:org.example.biznet.Customer#C001。从中拆分出资产/参与者的类型和ID。 - 调用对应的资产或参与者查询接口:
- 如果是参与者,用
GET /participants/{参与者类型}#{参与者ID}(比如GET /participants/org.example.biznet.Customer#C001)获取当前状态。 - 如果是资产,用
GET /assets/{资产类型}#{资产ID}(比如GET /assets/org.example.biznet.Asset#A001)获取当前状态。
- 如果是参与者,用
方法2:使用Composer SDK
如果你用代码开发,可以通过SDK直接查询:
- 先建立与业务网络的连接:
const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection; const businessNetworkConnection = new BusinessNetworkConnection(); await businessNetworkConnection.connect('admin@your-network'); - 根据交易ID获取HistorianRecord:
const historianRecord = await businessNetworkConnection.getHistorianRecord('你的交易ID'); - 解析
transactionInvoked,提取资源类型和ID:const resourceRef = historianRecord.transactionInvoked; const [type, id] = resourceRef.split('#'); const resourceType = type.replace('resource:', ''); - 获取对应的资产或参与者:
const resource = await businessNetworkConnection.getResource(resourceType, id); console.log(resource); // 输出资产/参与者的当前状态
二、关于GET /system/historian返回的HistorianRecord格式说明
你看到的返回格式是Composer系统日志记录的标准结构,每个字段的含义如下:
$class:标识这条记录是Hyperledger Composer内置的org.hyperledger.composer.system.HistorianRecord类型,用于系统的序列化与反序列化处理。transactionId:该交易的唯一全局标识符,也就是你用来查询的ID。transactionType:实际执行的交易的完全限定类名,比如org.hyperledger.composer.system.AddParticipant是系统内置的添加参与者交易,如果你是自定义交易,这里会显示你自己定义的交易类(比如org.example.biznet.TransferAsset)。transactionInvoked:指向触发该日志记录的具体交易资源的引用。因为HistorianRecord是系统的审计日志,它只保存交易的引用而非完整内容,你可以通过这个引用去查询交易的详细信息,或者从中提取关联的资产/参与者ID(如第一部分所述)。
另外,HistorianRecord通常还包含其他有用字段,比如timestamp(交易执行的时间戳)、identityUsed(执行该交易的用户身份)等,这些信息可以帮你做审计和追溯。
内容的提问来源于stack exchange,提问作者HARESH
相关产品推荐
相关产品推荐

