我使用Hyperledger Fabric 1.2构建一个区块链集群,其中包含3个对等方和3个订购者。我可以通过CLI和Java SDK成功部署和调用chaincode。一切正常。但是,当我注意到服务发现功能并尝试使用它时,我遇到了两个问题。首先,在构建发现工具并尝试使用它来获取一些发现的信息之后,我无法访问对等方并按照以下方式获取消息
”无法连接到发现服务:无法创建新服务 连接:超出上下文截止日期”
配置命令为
发现--configFile conf.yaml --userKey ./crypto-config/peerOrganizations/org1.forchain.com/peers/peer0.org1.forchain.com/msp/keystore/7458b29b1fb6a89768585430dbf0e522a40ff4aefe600fc1e4fafe62c3config-cuser4 /peerOrganizations/org1.forchain.com/peers/peer0.org1.forchain.com/msp/signcerts/peer0.org1.forchain.com-cert.pem --MSP Org1MSP saveConfig
查询命令是
发现--configFile conf.yaml对等点--channel lajiao --server localhost:6051
我猜可能是由TLS配置引起的,因此我取消了TLS,然后重试。这次我成功访问了对等方并收到了一些消息,但是遇到了另一个问题。当我使用“ discover peers xxx”命令时,总是得到null
的结果,实际上该通道中有两个对等端。当我使用'discover endorsers xxx'
命令时,总是收到以下错误消息
“链码的构造描述符失败:”
同时,对等日志输出以下消息:
'主体集计算失败:链码未安装在 认可政策要求的足够的组织机构2018-08-01 10:21:50.860 UTC [发现] chaincodeQuery-> ERRO 1441失败 为链码链码构造描述符: ,:链码未安装在所需的足够的组织上 认可政策”
我可以确保将链码成功安装在所有对等方中。实例化chaincode时,我没有使用背书策略。我认为这不是政策问题,因为我仍然可以调用chaincode并提出交易。 我还尝试使用Java SDK,发现可以获取订购者节点信息,但无法获取其他对等节点或链码信息。日志始终输出:“发现链码名称为空。”。但是链代码肯定是实例化的,可以通过SDK调用。我参考了“ org.hyperledger.fabric.sdkintegration.ServiceDiscoveryIT”中的测试代码,一些关键的Java代码如下:
channel.addPeer(peer, createPeerOptions().setPeerRoles(EnumSet.of(Peer.PeerRole.SERVICE_DISCOVERY,Peer.PeerRole.LEDGER_QUERY, Peer.PeerRole.EVENT_SOURCE,Peer.PeerRole.CHAINCODE_QUERY)));
channel.initialize();
System.out.println("================ orderer ===============");
for (Orderer orderer : channel.getOrderers()) {
System.out.println(orderer.getName());
}
System.out.println("================ peer ===============");
for (Peer p: channel.getPeers()) {
System.out.println(p.getName());
}
System.out.println("================ chaincode ===============");
for (String s: channel.getDiscoveredChaincodeNames()) {
System.out.println(s);
}
那么,如何在TLS配置下使用'discover'命令以及如何获取发现的信息?
答案 0 :(得分:0)
对于config命令-您需要通过-peerTLSCA 传递TLS根CA。请查看documentation中的示例并采取相应措施。
现在-对于第二个问题,我认为同行可能在渠道中彼此不认识。
答案 1 :(得分:0)
我偶然发现了一个类似的错误(关于服务发现),如下所示。
Go Fabric客户端日志:
Failed to get endorsing peers: error getting channel response for channel [myc]:
Discovery status Code: (11) UNKNOWN. Description: error received from Discovery Server:
failed constructing descriptor for chaincodes:<name:"mycc">
对等日志:
Failed constructing descriptor for chaincode chaincodes:<name:"mycc" > ,:
cannot satisfy any principal combination
当我为CORE_PEER_GOSSIP_EXTERNALENDPOINT
环境属性提供对等配置的正确值时(在我的情况下为docker yaml文件),此问题已解决。
据我了解,由于缺少此属性,对等方上运行的发现服务无法相互通信以得出当前网络的外观的结论。
答案 2 :(得分:0)
您必须在渠道中的每个组织中添加一个锚点对等方,这为我解决了这个问题。服务发现使用八卦协议,因此服务发现需要锚点对等体-谢谢@yacovm