在 hyperledger farbic 中通过 TxID 获取交易详细信息

问题描述

我目前正在运行 hyperledger fabric v2.2。我已经使用 contractapi 开发了链码,并使用 fabric-sdk-go/pkg/gateway

开发了应用程序

如何获取交易状态和交易负载我知道contractapi中提供的GetHistoryByKey()但这对我的应用程序不起作用。

我知道有 hyperledger-explorer 可用于通过 TxID 搜索交易,但我的用例是我的应用程序将通过 TxID 进行查询,然后它将验证该特定交易 (TxID) 的状态。

此外,我尝试使用 fabsdk 来实现这一点,但是当我尝试使用 fabsdk.New() 创建实例化 fabsdk 时出现错误。我正在使用 fabric-sample 项目的 connection-profile.json 似乎存在一些兼容性问题。

我得到的错误是:

Failed to create identity manager provider: Failed to initialize identity manager for organization: MyOrgName: Either a cryptopath or an embedded list of users is required

在启动和运行网络时使用了相同的连接配置文件,一切似乎都运行良好。我能够提交和评估交易。

解决方

系统链码嵌入在对等点本身中。所以我们需要设置目标,否则它只会给出发现错误,因为合约 QSCC 没有明确部署在频道上。

确保检查 core.yaml 文件 channel.system - 系统链码应该被启用 channel.system.qscc: enable

qsccContract := network.GetContract("qscc")
txn,err := qsccContract.CreateTransaction("GetTransactionByID",gateway.WithEndorsingPeers("peer0.org1.com:8051"))
if err != nil {
    fmt.Printf("Failed to create transaction: %s\n",err)
    return
}

result,err := txn.Evaluate("mychannel","4b1175335bdfe074d516a69df180ed6bc14591543eb26c10e21df2c67602b2dc")
if err != nil {
    fmt.Printf("Failed to submit transaction: %s\n",err)
    return
}

fmt.Println(string(result))

注意:结果需要解码为人类可读

解决方法

您的客户端应用程序可以使用适合您的编程语言的客户端 SDK 来评估 GetTransactionByID 系统链码上的 qscc 交易函数,该链码可用于所有对等点。此交易函数将交易 ID 作为其唯一参数,并返回一个 peer.ProcessedTransaction protobuf,其中包含交易信封和验证码。