【问题标题】:Hyperledger Fabric: How to return error in Java chaincode so it goes back to fabrik-java-sdk clientHyperledger Fabric:如何在 Java 链码中返回错误,使其返回到 fabrik-java-sdk 客户端
【发布时间】:2020-01-08 20:35:39
【问题描述】:

假设我的 Java 链代码(在 Fabric 1.4.4 上运行)想要抛出异常以表明要创建的新资产已经存在。我抛出一个带有问题或错误的 RunTimeException(在这种情况下,“合同 LL00001 已注册”),它记录在执行事务的对等节点中:

2019-11-29 20:15:37.807 UTC [peer.chaincode.nid1-blockchain-hapeer1-mrrc-0.1.4] func2 -> INFO 16a8ec Contract LL00001 already registered
2019-11-29 20:15:37.807 UTC [peer.chaincode.nid1-blockchain-hapeer1-mrrc-0.1.4] func2 -> INFO 16a8ed java.lang.RuntimeException: Contract LL00001 already registered

但是,在堆栈跟踪之后,我看到对等节点将其作为 500 错误返回,而没有包含我的错误描述或对 java 中的错误异常的任何引用(这是有道理的,因为该错误与语言无关):

2019-11-29 20:15:37.807 UTC [peer.chaincode.nid1-blockchain-hapeer1-mrrc-0.1.4] func2 -> INFO 16a8ff 20:15:37:804 SEVERE  org.hyperledger.fabric.shim.impl.ChaincodeInnvocationTask call                   [1f56a053] Invoke failed with error code 500. Sending ERROR

记录在我的客户端 java 应用程序(使用 fabrik-java-sdk)中:

org.hyperledger.fabric.sdk.exception.InvalidArgumentException: Proposal response is invalid.
    at org.hyperledger.fabric.sdk.ProposalResponse.getChaincodeActionResponsePayload(ProposalResponse.java:272)
    at ...

所以我只知道链码有问题,但我不知道问题是什么。如何获取错误类型和描述,以便向用户显示问题?现在我需要去对等节点检查那里的日志,看看是什么问题。

注意:我正在我的链码类中扩展新的 org.hyperledger.fabric.contract.ContractInterface。

更新:对等节点记录错误异常 (org.hyperledger.fabric.shim.ChaincodeException),并且似乎在 500 响应中正确返回了错误消息(“未找到文档”),如日志所示,但这消息未到达 Java SDK

2019-12-23 22:11:09.178 UTC [peer.chaincode.nid1-blockchain-hapeer1-mrrc-0.9.7] func2 -> INFO 5aa7 22:11:09:176 SEVERE  org.hyperledger.fabric.shim.impl.ChaincodeInnvocationTask call                   [12cc4ad0] Invoke failed with error code 500. Sending ERROR
2019-12-23 22:11:09.179 UTC [peer.chaincode.nid1-blockchain-hapeer1-mrrc-0.9.7] func2 -> INFO 5aa8 22:11:09:177 FINE    org.hyperledger.fabric.shim.impl.ChaincodeSupportClient$2 accept                 > sendToPeer 12cc4ad09a1feb7fc1246ac04bf69509204ca74368be2c7e4bbf0a503e90417f
2019-12-23 22:11:09.181 UTC [endorser] callChaincode -> INFO 5aa9 [mrrc][12cc4ad0] Exit chaincode: name:"mrrc"  (36ms)
2019-12-23 22:11:09.181 UTC [endorser] SimulateProposal -> ERRO 5aaa [mrrc][12cc4ad0] failed to invoke chaincode name:"mrrc" , error: transaction returned with failure: The document was not found 

编辑:这似乎是 Java SDK 中的错误。我在 Fabric 的 JIRA 中创建了一个 JIRA 问题: https://jira.hyperledger.org/browse/FABJ-508

【问题讨论】:

    标签: java hyperledger-fabric hyperledger-chaincode


    【解决方案1】:

    要将此错误返回到您的 fabric java sdk 客户端,一种方法是让您的链代码类扩展 ChaincodeBase 类(可以通过导入 org.hyperledger.fabric.shim 将其导入您的 java 程序中/strong> ),然后您可以在每个链代码方法中使用它的 newErrorResponse 方法来抛出您的自定义错误,您可以在其中提供错误字符串,因为它是第一个(或仅) 范围。您可以从织物样本存储库中查看此示例:

    https://github.com/hyperledger/fabric-samples/blob/master/chaincode/abstore/java/src/main/java/org/hyperledger/fabric-samples/ABstore.java#L28

    要查看 newErrorResponse 方法的重载实现,以便了解可以传递给它的其他可能参数,请遵循: p>

    https://jar-download.com/artifacts/org.hyperledger.fabric-chaincode-java/fabric-chaincode-shim/1.4.0/source-code/org/hyperledger/fabric/shim/ChaincodeBase.java

    更新:如果您使用较新的chaincodeInterface(如icordoba 所建议的)来代替您的chaincode 实现,那么您应该抛出一个可以通过导入org. hyperledger.fabric.shim.ChaincodeException,要实现相同的功能,您可以查看示例链代码here

    【讨论】:

    • 感谢 Udyan 的回复。如果我错了,请纠正我,但 ChaincodeBase 是开发 Java 链码的旧方法。我在我的代码中使用了新的 org.hyperledger.fabric.contract.ContractInterface。它使用注解 @Transaction() 来标记链码注解。我如何使用 ContractInterfact 而不是 ChaincodeBase 来做到这一点?谢谢。
    • @icordoba 这可能是一个错误,如果是,您可能想尝试在 jira.hyperledger.org 上提出问题。确保选择 fabric-chaincode-java 组件。
    • 预期的行为是什么?我的意思是,java-sdk-client 中捕获的异常和消息应该是什么?我不确定这是一个错误,但是在使用 sdk 执行该方法时我缺少一些东西。
    • 嗨@icordoba,实际上我在节点链代码上工作,所以不知道。请看一下最新的编辑,也许它可能是我们一直在寻找的那个。谢谢。
    • 谢谢@UdyanSharma。我尝试使用 ChaincodeException,但 Java 客户端仍然抛出 InvalidArgumentException。按照代码,我看到它只是检查响应是否无效并抛出 InvalidArgumentException(ProposalResponse.java 第 272 行),在我看来这是在这种情况下抛出的一个奇怪的异常)。我将在 JIRA 中添加问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多