首页 > 解决方案 > Hyperledger Fabric 自定义链码实例化:如何修复“超出上下文截止日期”

问题描述

我正在使用此处找到的 Hyperledger Fabric 框架的“第一网络”示例,但我无法成功实例化自定义 Java 链代码文件。这是我正在运行的命令,它是成功启动脚本运行的命令的略微修改版本:

peer chaincode instantiate -o orderer.example.com:7050 --tls false --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n javacc -l java -v 1.4 -c '{"Args":["init","a","{10}","b","{20}"]}' --connTimeout 600s -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

当我运行此命令时,我收到以下错误:

Error: error getting broadcast client: orderer client failed to connect to orderer.example.com:7050: failed to create new connection: context deadline exceeded

在谷歌搜索之后,错误似乎相当简单:由于某种原因,我正在使用的客户端容器无法连接到我的 orderer 容器。但是,这对我来说没有意义,原因如下:

首先:我能够成功运行./byfn.sh up -v -c mychannel -s couchdb,它最初使用以下命令从客户端容器中安装并实例化了一些 golang 链代码(-v 1.0后来由 byfn.sh 脚本升级到 1.4 版):

peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/
peer chaincode instantiate -o orderer.example.com:7050 --tls false --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('\''Org1MSP.peer'\'','\''Org2MSP.peer'\'')'

第二:我能够从同一个客户端容器中成功安装(尽管没有实例化)我的自定义 Java 链代码:(peer chaincode install -n javacc -v 1.4 -l java -p /chaincode-application/chaincode-application我的 Java 链代码源的位置)

到目前为止,我已经研究了一些可能的途径。上面提到的网站确实有关于时间长度的说明:“请注意,Java 链代码实例化可能需要一些时间,因为它编译链代码并下载具有 Java 环境的 docker 容器。” 因此,我使用--connTimeout 600s(600 seconds = 10 minutes) 作为我的命令的一部分,但在等待指定的时间后我仍然得到错误。此外,当在我的本地 IntelliJ 中构建大约需要 3 秒时,在对等容器内部真的需要那么长时间吗?

我还尝试从我的客户端容器中点击 orderer 节点:root@7bbadf11e755:/opt/gopath/src/github.com/hyperledger/fabric/peer# curl orderer.example.com:7050,失败并显示以下消息:curl: (56) Recv failure: Connection reset by peer。这似乎表明我的客户端容器可以连接到 orderer 容器,但是 orderer 容器不知道如何处理空请求路径。据我所知,这是意料之中的,可能意味着问题不在我的 Docker Compose 设置中。我在 Docker Compose 文件中唯一更改的是关闭 TLS。

最后,我还为位于我的客户端内部的自定义 Java 链代码文件遵循了示例 Maven 项目设置。我有一个 pom.xml 文件,它指定了我的主类名称,以及一个“src”目录中的一些 Java 源文件,包括一个 Java 类,它具有Hyperledger Fabric 文档中指定implements的正确接口。Chaincode当我在容器外使用 maven 运行构建时,这些文件构建得很好。

有趣的是,我仅在一个对等节点上看到以下消息:

2019-04-11 02:11:36.056 UTC [endorser] callChaincode -> INFO 119 [][dc951a0d] Entry chaincode: name:"cscc" 
2019-04-11 02:11:36.060 UTC [endorser] callChaincode -> INFO 11a [][dc951a0d] Exit chaincode: name:"cscc"  (3ms)
2019-04-11 02:11:36.060 UTC [comm.grpc.server] 1 -> INFO 11b unary call completed {"grpc.start_time": "2019-04-11T02:11:36.055Z", "grpc.service": "protos.Endorser", "grpc.method": "ProcessProposal", "grpc.peer_address": "172.27.0.11:42744", "grpc.code": "OK", "grpc.call_duration": "5.7837ms"}

另一个对等节点从今天开始没有条目,排序节点也没有,我觉得这很好奇。

我试过用谷歌搜索错误。我确实发现了这个问题,这似乎正是我的问题,但只有一个答案不能解决问题,我不允许评论或投票。我也发现了这个,但由于我在本地运行所有 Hyperledger Fabric 节点,因此无法收集到任何关于我自己的问题的见解。我不知道如何解决这个问题。有谁知道为什么我仍然收到“超出上下文截止日期”消息?

标签: docker-composehyperledger-fabrichyperledger

解决方案


我在我的网络中重新启用了 TLS 并且错误消失了(发生了另一个错误,但这超出了我的问题范围 :))。似乎我没有像我想的那样禁用所有 TLS 设置。

感谢@Gari Singh 让我走上正轨!


推荐阅读