该通道未配置任何具有“发现”角色的对等方

时间:2019-11-05 10:24:55

标签: 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.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]

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

3 个答案:

答案 0 :(得分:0)

虽然我一直在使用节点SDK,但是根据我经过的Java资源,您必须一直在使用'network-config'(。yaml / .json)文件连接您的应用程序(通过sdk)与您的网络。在其中将出现一个对等部分,其定义如下:https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/fixture/sdkintegration/network_configs/network-config.yaml#L76,您应在其中尝试添加 discover:true

但是,这里的要点是,默认情况下,discover属性为true,因此也可能是您错过了对等部分(尽管这是必填部分,所以发生这种情况的机会也很惨淡)在网络配置文件中,否则可能会丢失在docker文件中配置 CORE_PEER_GOSSIP_EXTERNALENDPOINT

答案 1 :(得分:0)

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

1。 在运行网络(对等)之前,将 CORE_PEER_GOSSIP_EXTERNALENDPOINT 信息添加到 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 )。

127.0.0.1 peer1.org1.example.com
127.0.0.1 peer1.org2.example.com
127.0.0.1 peer2.org2.example.com

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

答案 2 :(得分:0)

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

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()初始化频道时,它将重新启动完整的网络发现。