Hyperledger Fabric:[Java] ContractException:无法将交易发送给订购者

Hyperledger Fabric: [Java] ContractException: Failed to send transaction to the orderer

我正在尝试提交一个名为 Plant 的交易,它设置了一些关于作物的信息。但是,当我提交此交易时,它会抛出 运行时间错误。

我为此编写了 Java 链码和 Java 应用程序代码,并使用官方 fabric-samples/commercial-paper 作为模板。 https://github.com/hyperledger/fabric-samples/tree/main/commercial-paper

我的 OS 是 Debian GNU/Linux 10 (Buster)。

这是我运行时的命令(提交交易)和相应的输出:

mvn exec:java -Dexec.mainClass="org.ghostpepperfarms.Plant":

Read wallet info from: ./wallet
log4j:WARN No appenders could be found for logger (org.hyperledger.fabric.sdk.helper.Config).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Use network channel: mychannel.
Use org.papernet.commercialpaper smart contract.
Submit PLANT transaction.
org.hyperledger.fabric.gateway.ContractException: Failed to send transaction to the orderer
        at org.hyperledger.fabric.gateway.impl.TransactionImpl.commitTransaction(TransactionImpl.java:145)
        at org.hyperledger.fabric.gateway.impl.TransactionImpl.submit(TransactionImpl.java:96)
        at org.hyperledger.fabric.gateway.impl.ContractImpl.submitTransaction(ContractImpl.java:50)
        at org.ghostpepperfarms.Plant.main(Plant.java:52)
        at org.codehaus.mojo.exec.ExecJavaMojo.run(ExecJavaMojo.java:254)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: The proposal responses have 3 inconsistent groups with 0 that are invalid. Expected all to be consistent and none to be invalid.
        at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
        at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2022)
        at org.hyperledger.fabric.gateway.impl.TransactionImpl.commitTransaction(TransactionImpl.java:139)
        ... 5 more
Caused by: java.lang.IllegalArgumentException: The proposal responses have 3 inconsistent groups with 0 that are invalid. Expected all to be consistent and none to be invalid.
        at org.hyperledger.fabric.sdk.Channel.doSendTransaction(Channel.java:5574)
        at org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:5533)
        at org.hyperledger.fabric.gateway.impl.TransactionImpl.commitTransaction(TransactionImpl.java:138)
        ... 5 more

它说提案响应中有两个不一致的组 - 我假设这意味着智能合约是不确定的。

但这对我来说似乎是不可能的,因为这个交易只是设置了一些字段的值,并没有使用日期或时间之类的东西。 (我不确定这是否有帮助,但我会提到我已经初始化了所有 class 字段,它们都是 String 类型,带有 "" 。)

Logspout 之前显示了 peer0 的一些错误。org1.example,但我再也看不到它们了

peer0.org1.example:

peer0.org1.example.com|2021-06-24 05:18:41.568 UTC [endorser] callChaincode -> INFO 0ed finished chaincode: cscc duration: 1ms channel=mychannel txID=36052783
peer0.org1.example.com|2021-06-24 05:18:41.568 UTC [comm.grpc.server] 1 -> INFO 0ee unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=192.168.0.1:53514 grpc.code=OK grpc.call_duration=2.659998ms
peer0.org1.example.com|2021-06-24 05:18:41.657 UTC [comm.grpc.server] 1 -> INFO 0ef unary call completed grpc.service=discovery.Discovery grpc.method=Discover grpc.peer_address=192.168.0.1:53514 grpc.code=OK grpc.call_duration=1.084295ms
peer0.org1.example.com|2021-06-24 05:18:41.745 UTC [comm.grpc.server] 1 -> INFO 0f0 unary call completed grpc.service=discovery.Discovery grpc.method=Discover grpc.peer_address=192.168.0.1:53514 grpc.code=OK grpc.call_duration=1.758468ms
              couchdb0|[notice] 2021-06-24T05:18:43.549103Z nonode@nohost <0.7862.0> e9b3562462 couchdb0:5984 192.168.0.9 admin GET /mychannel__lifecycle/namespaces%2Ffields%2Fpapercontract%2FSequence?attachments=true 200 ok 8
peer0.org1.example.com|2021-06-24 05:18:43.572 UTC [endorser] callChaincode -> INFO 0f1 finished chaincode: papercontract duration: 0ms channel=mychannel txID=035152c5
peer0.org1.example.com|2021-06-24 05:18:43.572 UTC [endorser] SimulateProposal -> ERRO 0f2 failed to invoke chaincode papercontract, error: txid: 035152c550d3095fb04a42d9cad6c4a9a739d83a2b680bd705eb35715116b331(mychannel) exists
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*TransactionContexts).Create
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/transaction_contexts.go:45
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*Handler).Execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/handler.go:1163
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*ChaincodeSupport).execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/chaincode_support.go:272
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*ChaincodeSupport).Invoke
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/chaincode_support.go:202
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*ChaincodeSupport).Execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/chaincode_support.go:155
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*SupportImpl).Execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/support.go:126
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).callChaincode
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:119
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).SimulateProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:187
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).ProcessProposalSuccessfullyOrError
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:398
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:340
peer0.org1.example.com|github.com/hyperledger/fabric/core/handlers/auth/filter.(*expirationCheckFilter).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/handlers/auth/filter/expiration.go:61
peer0.org1.example.com|github.com/hyperledger/fabric/core/handlers/auth/filter.(*filter).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/handlers/auth/filter/filter.go:32
peer0.org1.example.com|github.com/hyperledger/fabric-protos-go/peer._Endorser_ProcessProposal_Handler.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/hyperledger/fabric-protos-go/peer/peer.pb.go:107
peer0.org1.example.com|github.com/hyperledger/fabric/internal/peer/node.unaryGrpcLimiter.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/internal/peer/node/grpc_limiters.go:51
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/hyperledger/fabric/common/grpclogging.UnaryServerInterceptor.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/common/grpclogging/server.go:92
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/hyperledger/fabric/common/grpcmetrics.UnaryServerInterceptor.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/common/grpcmetrics/interceptor.go:31
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:34
peer0.org1.example.com|github.com/hyperledger/fabric-protos-go/peer._Endorser_ProcessProposal_Handler
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/hyperledger/fabric-protos-go/peer/peer.pb.go:109
peer0.org1.example.com|google.golang.org/grpc.(*Server).processUnaryRPC
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:1180
peer0.org1.example.com|google.golang.org/grpc.(*Server).handleStream
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:1503
peer0.org1.example.com|google.golang.org/grpc.(*Server).serveStreams.func1.2
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:843
peer0.org1.example.com|runtime.goexit
peer0.org1.example.com| /usr/local/go/src/runtime/asm_amd64.s:1374
peer0.org1.example.com|error sending
peer0.org1.example.com|failed to execute transaction 035152c550d3095fb04a42d9cad6c4a9a739d83a2b680bd705eb35715116b331
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.processChaincodeExecutionResult
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/chaincode_support.go:161
peer0.org1.example.com|github.com/hyperledger/fabric/core/chaincode.(*ChaincodeSupport).Execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/chaincode/chaincode_support.go:156
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*SupportImpl).Execute
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/support.go:126
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).callChaincode
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:119
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).SimulateProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:187
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).ProcessProposalSuccessfullyOrError
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:398
peer0.org1.example.com|github.com/hyperledger/fabric/core/endorser.(*Endorser).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/endorser/endorser.go:340
peer0.org1.example.com|github.com/hyperledger/fabric/core/handlers/auth/filter.(*expirationCheckFilter).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/handlers/auth/filter/expiration.go:61
peer0.org1.example.com|github.com/hyperledger/fabric/core/handlers/auth/filter.(*filter).ProcessProposal
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/core/handlers/auth/filter/filter.go:32
peer0.org1.example.com|github.com/hyperledger/fabric-protos-go/peer._Endorser_ProcessProposal_Handler.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/hyperledger/fabric-protos-go/peer/peer.pb.go:107
peer0.org1.example.com|github.com/hyperledger/fabric/internal/peer/node.unaryGrpcLimiter.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/internal/peer/node/grpc_limiters.go:51
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/hyperledger/fabric/common/grpclogging.UnaryServerInterceptor.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/common/grpclogging/server.go:92
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/hyperledger/fabric/common/grpcmetrics.UnaryServerInterceptor.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/common/grpcmetrics/interceptor.go:31
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1.1.1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:25
peer0.org1.example.com|github.com/grpc-ecosystem/go-grpc-middleware.ChainUnaryServer.func1
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go:34
peer0.org1.example.com|github.com/hyperledger/fabric-protos-go/peer._Endorser_ProcessProposal_Handler
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/github.com/hyperledger/fabric-protos-go/peer/peer.pb.go:109
peer0.org1.example.com|google.golang.org/grpc.(*Server).processUnaryRPC
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:1180
peer0.org1.example.com|google.golang.org/grpc.(*Server).handleStream
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:1503
peer0.org1.example.com|google.golang.org/grpc.(*Server).serveStreams.func1.2
peer0.org1.example.com| /go/src/github.com/hyperledger/fabric/vendor/google.golang.org/grpc/server.go:843
peer0.org1.example.com|runtime.goexit
peer0.org1.example.com| /usr/local/go/src/runtime/asm_amd64.s:1374 channel=mychannel txID=035152c5
peer0.org1.example.com|2021-06-24 05:18:43.572 UTC [endorser] ProcessProposal -> WARN 0f3 Failed to invoke chaincode channel=mychannel chaincode=papercontract error="error in simulation: failed to execute transaction 035152c550d3095fb04a42d9cad6c4a9a739d83a2b680bd705eb35715116b331: error sending: txid: 035152c550d3095fb04a42d9cad6c4a9a739d83a2b680bd705eb35715116b331(mychannel) exists"
peer0.org1.example.com|2021-06-24 05:18:43.572 UTC [comm.grpc.server] 1 -> INFO 0f4 unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=192.168.0.1:53536 grpc.code=OK grpc.call_duration=1.851699ms

在不同的设置中似乎存在类似的问题: Hyperledger Fabric endorsement failing: txid exists

更多信息:正如@bestbeforetoday 所建议的,我在尝试之后分析了提案响应有效负载(虽然使用了对等链代码调用)之前用mvn执行。

似乎有3个payload对应3个不一致的组,我发现'splitKey'只出现在一个payload响应中,其余字段的顺序在每个payload中都不一样。

插入新行和制表符后看起来像这样:

对等链代码调用

Error: could not assemble transaction:
ProposalResponsePayloads do not match -
proposal response: version:1 response:<status:200

payload:"{
    \"field1\":\"\",
    \"field2\":\"\",
    \"field3\":\"\",
    \"field4\":\"\",
    \"field5\":\"\"}" >
    
payload:"\n 5-015<674[=13=]572%05769T344X302\"f\r603250\n302>\n\n_lifecycle20\n.\n(namespaces/fields/papercontract/Sequence2[=13=]206200\n\rpapercontract260230\n0[=13=]0SpiceList[=13=]0bhut jolokia[=13=]026[=13=]7{
    \"field1\":\"\",
    \"field2\":\"\",
    \"field4\":\"\",
    \"splitKey\":[\"bhut jolokia\"],
    \"field3\":\"\",
    \"field5\":\"\"}"}
    
20[=13=]700[=13=]122[=13=]7{
    \"field1\":\"\",
    \"field3\":\"\",
    \"field4\":\"\",
    \"field2\":\"\",
    \"field5\":\"\"}"}
    
\"22\rpapercontract2[=13=]10" endorsement:<endorser:"\n[=13=]7Org4MSP22[=13=]6-----BEGIN CERTIFICATE-----\nMIICKTCCAc+gAwIBAgIRAJhO/KCN82dUT2ZWdlM5uREwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzQuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzQuZXhhbXBsZS5jb20wHhcNMjEwNjI1MDQxMjAwWhcNMzEwNjIzMDQxMjAw\nWjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjAub3Jn\nNC5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGKB9vyBmDC9\nW9IGOaA7qlpAHUu2zuHxZGhuwcxqQSDY63/6L2Hpxhg3uVBhtxcOiROJvfZmjOxb\nkZxt2P25D9ujTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud\nIwQkMCKAIIEDOx3pOppcqaQjtVPfOozh9/NnLuOCB7UWNlSKndMZMAoGCCqGSM49\nBAMCA0gAMEUCIQDkmp/qnb0DpwPlRYSPH6Cv0JE4HkgKgoY9FUAFVR6rpwIgEsXH\nDn2uHMeio475cLoKbayZo87BRDsykM1rBNl1/bI=\n-----END CERTIFICATE-----\n" signature:"0D[=13=]2 3v357I >12[=13=]713o65v3355r76105z13[=13=]5e[=13=]2 `10!2v67H3m607616[=13=]00< 76U0RV4065H" > 

这是造成不一致的原因吗?为什么 splitKey 只出现在一个响应中?以及如何强制字段的顺序保持一致?

如何解决此错误?

您应该能够使用 getProposalResponses() method. The structure of those proposal response objects loosely aligns with the protobuf messages returned from endorsing peers, defined hereContractException 获得提案回复。您或许可以检查这些提案回复,找出它们之间的差异。

提案响应负载需要逐字节相同。可能导致意外不匹配的一种情况的示例是,如果您使用 JSON 格式的数据,要么写入分类帐键,要么作为交易函数的 return 值。即使 JSON 内容在逻辑上是相同的,如果 JSON 解析器对内容的排序或格式不同,提案响应将不再是逐字节相同的。这不一定是你的情况,只是说明有一些异常情况可能会导致此类问题。

您的交易 ID 错误乍一看好像您正在提交与已提交的交易 ID 相同的新交易,或者多次重新提交同一交易。当然,每笔交易都必须有一个唯一的交易 ID。与先前提交的事务具有相同 ID 的任何事务都将失败。 SDK 应根据客户端身份和随机生成的随机数生成交易 ID,因此交易 ID 冲突通常不会偶然发生。