1

假设我的 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

4

1 回答 1

0

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

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

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

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建议的)来代替您的链码实现,那么您应该抛出一个可以通过导入 org.hyperledger.fabric.shim.ChaincodeException 导入的 ChaincodeException 类的实例,以实现相同的效果,您可以在此处查看示例链代码

于 2019-11-30T10:19:43.860 回答