【问题标题】:Hyperledger fabric 1.2 service discovery errorHyperledger Fabric 1.2 服务发现错误
【发布时间】:2018-08-01 10:32:35
【问题描述】:

我使用 Hyperledger Fabric 1.2 构建了一个区块链集群,其中包含 3 个对等节点和 3 个排序节点。我可以通过 CLI 和 Java SDK 成功部署和调用链代码。一切正常。但是,当我注意到服务发现功能并尝试使用它时,我遇到了两个问题。首先,在我构建了发现工具并尝试使用它来获取一些发现的信息后,我无法访问对等点并获取如下消息

"连接发现服务失败:创建新服务失败 连接:超出上下文期限”

配置命令是

discover --configFile conf.yaml --userKey ./crypto-config/peerOrganizations/org1.forchain.com/peers/peer0.org1.forchain.com/msp/keystore/7458b29b1fb6a89768585430dbf0e522a40ff4aefe600fc1e4fafe62c3c972e4_sk --userCert ./crypto /peerOrganizations/org1.forchain.com/peers/peer0.org1.forchain.com/msp/signcerts/peer0.org1.forchain.com-cert.pem --MSP Org1MSP saveConfig

查询命令是

discover --configFile conf.yaml peers --channel lajiao --server localhost:6051

我猜这可能是由 TLS 配置引起的,所以我取消了 TLS 并再次尝试。这次我成功访问了peer并收到了一些消息,但是我遇到了另一个问题。当我使用 'discover peers xxx ' 命令时,我总是得到null 结果,实际上该通道中有两个对等点。当我使用'discover endorsers xxx' 命令时,我总是收到以下错误消息

'构造链码描述符失败:'

同时,peer log输出如下信息:

'主体集计算失败:链码未安装 背书政策要求的足够组织 2018-08-01 10:21:50.860 UTC [发现] chaincodeQuery -> ERRO 1441 失败 为链码链码构造描述符: ,: 链码没有安装在足够多的组织上 背书政策”

我可以确保链码已成功安装在所有对等节点中。而且我在实例化链码时没有使用背书策略。我认为这不是政策问题,因为我仍然可以调用链代码并提出交易。 我还尝试使用 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' 命令以及如何获取发现的信息?

【问题讨论】:

  • 请编辑您的消息并准确指定:(1) 用于配置配置文件的命令(如果使用一个),(2) 用于查询对等方的命令。
  • 问题已更新

标签: hyperledger-fabric hyperledger service-discovery


【解决方案1】:

对于配置命令 - 您需要通过 --peerTLSCA 传递 TLS 根 CA。请查看documentation 中的示例并采取相应措施。

现在 - 对于第二个问题,我认为对等方可能在频道中彼此不认识。

  1. 确保您在通道中定义了锚节点,并且两个节点都配置了外部端点。
  2. 如果您苦苦挣扎太久而无法解决问题,请随时在 chat.hyperledger.org 上向我 (yacovm) 发送问题。

【讨论】:

  • TLS 证书是强制性的吗?如果对等点以非 TLS 方式运行,则不需要。我说的对吗?
  • 嘿@yacovm。我有一个 docker compose 文件。当我不使用对等方的服务发现选项而不是使用 1.1 时尚时,代码工作正常。当我使用 SD 选项时,我在 Java sdk 中遇到 unkbown 主机异常,看起来无法以这种方式访问​​对等方。你能不能看看文件,让我知道我哪里出错了。以下是文件内容===>
  • 我认为您的评论被截断了,您可以在chat.hyperledger.org/channel/fabric-sdk-java中提问
  • 嘿,我评论了超级账本聊天。看看。
  • 你能标记我吗?还是您希望我扫描所有消息?
【解决方案2】:

您必须从频道中的每个组织添加一个锚节点,这为我解决了问题。服务发现需要锚节点,因为服务发现使用 gossip 协议 - 谢谢@yacovm

【讨论】:

    【解决方案3】:

    我偶然发现了一个类似的错误(关于服务发现),如下所示。

    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 文件)。

    据我了解,由于缺少此属性,在对等点上运行的发现服务无法相互通信以得出当前网络状况的结论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多