Hyperledger fabric 通道未配置任何具有';发现';角色

Hyperledger fabric 通道未配置任何具有';发现';角色,hyperledger-fabric,hyperledger-fabric-sdk-java,Hyperledger Fabric,Hyperledger Fabric Sdk Java,我正在尝试从java fabric SDK执行一个事务。我能够从节点正确查询数据,但在执行事务时,我遇到以下错误: org.hyperledger.fabric.sdk.exception.ServiceDiscoveryException: The channel is not configured with any peers with the 'discover' role at org.hyperledger.fabric.sdk.Channel.sendTransactionP

我正在尝试从java fabric SDK执行一个事务。我能够从节点正确查询数据,但在执行事务时,我遇到以下错误:

org.hyperledger.fabric.sdk.exception.ServiceDiscoveryException: The channel is not configured with any peers with the 'discover' role
    at org.hyperledger.fabric.sdk.Channel.sendTransactionProposalToEndorsers(Channel.java:3955) ~[fabric-sdk-java-1.4.5.jar:na]
    at org.hyperledger.fabric.gateway.impl.TransactionImpl.sendTransactionProposal(TransactionImpl.java:155) ~[fabric-gateway-java-1.4.0.jar:na]
    at org.hyperledger.fabric.gateway.impl.TransactionImpl.submit(TransactionImpl.java:91) ~[fabric-gateway-java-1.4.0.jar:na]
    at org.hyperledger.fabric.gateway.impl.ContractImpl.submitTransaction(ContractImpl.java:50) ~[fabric-gateway-java-1.4.0.jar:na]

如何配置具有“discover”角色的对等方?

尽管我一直在使用node SDK,但根据我阅读的java资源,您必须使用“network config”(.yaml/.json)文件(通过SDK)将应用程序与网络连接起来。其中会出现一个对等部分,其定义如下:,您应该尝试添加discover:true


然而,这里的要点是,这个discover属性默认为true,因此情况也可能是您可能错过了对等部分(虽然这是必需的部分,所以发生这种情况的可能性也很小)在网络配置文件中,或者您可能缺少在docker文件中配置核心\u对等\u八卦\u外部端点。

以下步骤将有助于从客户端应用程序访问服务发现

1. 在运行网络(对等)之前,将核心\u对等\u八卦\u外部端点信息添加到docker compose.yml文件的对等服务中。如果我们为每个组织至少设置一个锚节点,这将非常有用

services:
  peer1.org1.example.com:
     environment:
        - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:5051
        # Need to change the peer domain and port with your desired value 
        - CORE_PEER_GOSSIP_USELEADERELECTION=true
        - CORE_PEER_GOSSIP_ORGLEADER=false
外部端点将帮助来自其他组织的对等方找到对等方

2. 使用discover:true更新networkConnection.yml文件中的对等信息,该文件用于将应用程序连接到网络

channels:
  testchannel:
    peers:
      peer1.org1.example.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
        discover: true
3. 在从应用程序创建网关期间启用发现

Gateway.Builder builder = Gateway.createBuilder();
...     
builder.discovery(true).identity(wallet, userName).networkConfig(connectionProfile);
// Connect to gateway using application specified parameters
gateway = builder.connect();
运行应用程序后,它将使用peer1.org1.example.com对等方的发现服务,并从通道中获取其他组织对等方信息(例如peer2.org2.example.com、peer1.org2.example.com)

希望它能解决你的问题

但它不会与域(peer1.org1.example.com、peer1.org2.example.com、peer2.org2.example.com)一起运行,因为域与实际IP没有绑定。 您需要在/etc/hosts文件中添加路由以测试应用程序(使用所需的IP更新127.0.0.1


再次运行客户端应用程序并检查其是否正常工作。

如果您已通过编程方式添加了对等方,则可以在添加时设置对等方的角色。这里是一个片段

newChannel.joinPeer(peer, Channel.PeerOptions.createPeerOptions().setPeerRoles(EnumSet.of(Peer.PeerRole.EVENT_SOURCE, Peer.PeerRole.SERVICE_DISCOVERY))); //Add more roles as you see if

然后,当您使用newChannel.initialize()初始化通道时,它将重新初始化完整的网络发现。

您好,我也有同样的问题,但我的Java sdk客户端应用程序中没有network-config.yaml。它工作正常,除了我不能使用发现,因为我得到相同的错误。我使用shell“peer join”命令加入了通道。我是否应该使用任何特殊的“peer”命令来启用该discover角色?不是peer命令,但可能会有帮助。我不确定这一点,但在略读一点之后,我想这一定是您要找的。对于步骤1,我可以知道
CORE\u PEER\u GOSSIP\u useLeaderRelection
CORE\u PEER\u GOSSIP\u ORGLEADER
的目的是什么吗?它们是否要与
CORE\u PEER\u GOSSIP\u EXTERNALENDPOINT
一起使用?@user10931326简言之,是的。外部端点是其他对等方使用发现进行通信的点。你可以从下面的链接中找到领导人选举的全部细节
newChannel.joinPeer(peer, Channel.PeerOptions.createPeerOptions().setPeerRoles(EnumSet.of(Peer.PeerRole.EVENT_SOURCE, Peer.PeerRole.SERVICE_DISCOVERY))); //Add more roles as you see if