4 votes

Le canal n'est pas configuré avec des pairs ayant le rôle 'discover'.

J'essaie d'effectuer une transaction à partir de java fabric SDK. Je suis capable d'interroger les données correctement à partir du nœud, mais lorsque je fais une transaction, j'obtiens l'erreur suivante :

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]

Comment configurer les pairs avec le rôle 'discover' ?

0voto

Udyan Sharma Points 31

J'ai utilisé le SDK node, mais d'après les ressources java que j'ai parcourues, vous avez dû utiliser un fichier 'network-config'(.yaml/.json) pour connecter votre application (via le SDK) à votre réseau. Dans ce fichier, il y a une section peer qui est définie comme suit : https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/fixture/sdkintegration/network_configs/network-config.yaml#L76 vous devez essayer d'ajouter découvrir : vrai .

Cependant, le point ici est que cette propriété de découverte est vraie par défaut, donc le cas pourrait également être que vous avez manqué la section peer (bien que ce soit une section obligatoire, donc les chances que cela se produise sont également faibles) dans le fichier de configuration du réseau ou vous pourriez manquer la configuration de la propriété de découverte. CORE_PEER_GOSSIP_EXTERNALENDPOINT dans votre fichier docker.

0voto

iOS-Developer84 Points 351

Les étapes suivantes vous aideront à accéder à la découverte de services à partir de l'application cliente.

1. Avant d'exécuter le réseau (pair), ajoutez le CORE_PEER_GOSSIP_EXTERNALENDPOINT des informations au service homologue de docker-compose.yml dossier. Il sera utile de fixer au moins un pair d'ancrage à chaque organisation.

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

Le point de terminaison externe aidera les pairs d'autres organisations à trouver le pair.

2. Mettez à jour les informations sur les pairs du fichier networkConnection.yml avec découvrir : vrai qui est utilisé pour connecter l'application avec le réseau.

channels:
  testchannel:
    peers:
      peer1.org1.example.com:
        endorsingPeer: true
        chaincodeQuery: true
        ledgerQuery: true
        eventSource: true
        discover: true

3. Activer la découverte pendant la création de la passerelle à partir de l'application

Gateway.Builder builder = Gateway.createBuilder();
...     
builder.discovery(true).identity(wallet, userName).networkConfig(connectionProfile);
// Connect to gateway using application specified parameters
gateway = builder.connect();

Après avoir exécuté l'application, elle utilisera le service de découverte du pair peer1.org1.example.com et obtiendra des informations sur les pairs des autres organisations (par exemple peer2.org2.example.com, peer1.org2.example.com) à partir du canal.

J'espère que cela résoudra votre problème.

Mais il ne fonctionnera pas avec les domaines (peer1.org1.example.com, peer1.org2.example.com, peer2.org2.example.com) car les domaines ne sont pas liés à l'IP actuelle. Vous devez ajouter la route dans votre /etc/hosts pour tester l'application ( Mettez à jour 127.0.0.1 avec l'adresse IP souhaitée. ).

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

Exécutez à nouveau l'application client et vérifiez si elle fonctionne correctement.

0voto

Srikumar S Points 16

Si vous avez ajouté le pair par programme, vous pouvez définir les rôles du pair au moment de l'ajout. Voici un extrait

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

Ensuite, lorsque vous initialiserez le canal en utilisant newChannel.initialize(), il réinitialisera la découverte complète du réseau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X