4

我正在尝试从 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]

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

4

3 回答 3

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,所以也可能是你错过了网络中的peer部分(虽然这是一个必需的部分,所以发生这种情况的机会也很渺茫) -config 文件,否则您可能缺少在 docker 文件中配置CORE_PEER_GOSSIP_EXTERNALENDPOINT

于 2019-11-06T07:44:30.873 回答
0

遵循这些步骤将有助于从客户端应用程序访问服务发现。

1. 在运行网络(peer)之前,将CORE_PEER_GOSSIP_EXTERNALENDPOINT信息添加到docker -compose.yml文件的peer服务中。如果我们为每个组织设置至少一个锚节点,将会很有帮助。

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 文件中的peer 信息,用于将应用程序与网络连接。

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 peer 的发现服务,并从通道中获取其他组织 peer 信息(例如 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

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

于 2020-02-25T11:10:21.977 回答
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() 初始化通道时,它将重新启动完整的网络发现。

于 2020-07-08T16:30:47.117 回答