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 here 从 ContractException
获得提案回复。您或许可以检查这些提案回复,找出它们之间的差异。
提案响应负载需要逐字节相同。可能导致意外不匹配的一种情况的示例是,如果您使用 JSON 格式的数据,要么写入分类帐键,要么作为交易函数的 return 值。即使 JSON 内容在逻辑上是相同的,如果 JSON 解析器对内容的排序或格式不同,提案响应将不再是逐字节相同的。这不一定是你的情况,只是说明有一些异常情况可能会导致此类问题。
您的交易 ID 错误乍一看好像您正在提交与已提交的交易 ID 相同的新交易,或者多次重新提交同一交易。当然,每笔交易都必须有一个唯一的交易 ID。与先前提交的事务具有相同 ID 的任何事务都将失败。 SDK 应根据客户端身份和随机生成的随机数生成交易 ID,因此交易 ID 冲突通常不会偶然发生。
我正在尝试提交一个名为 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 here 从 ContractException
获得提案回复。您或许可以检查这些提案回复,找出它们之间的差异。
提案响应负载需要逐字节相同。可能导致意外不匹配的一种情况的示例是,如果您使用 JSON 格式的数据,要么写入分类帐键,要么作为交易函数的 return 值。即使 JSON 内容在逻辑上是相同的,如果 JSON 解析器对内容的排序或格式不同,提案响应将不再是逐字节相同的。这不一定是你的情况,只是说明有一些异常情况可能会导致此类问题。
您的交易 ID 错误乍一看好像您正在提交与已提交的交易 ID 相同的新交易,或者多次重新提交同一交易。当然,每笔交易都必须有一个唯一的交易 ID。与先前提交的事务具有相同 ID 的任何事务都将失败。 SDK 应根据客户端身份和随机生成的随机数生成交易 ID,因此交易 ID 冲突通常不会偶然发生。