Déploiement binaire Hyperledger Fabric des nœuds pairs

3 nœuds orderer ; organisation org1 avec deux nœuds pairs, peer0 et peer1 ; organisation org2 avec deux nœuds pairs, peer0 et peer1 ; | Nœud | IP hôte | Hôtes | Ports | |---|---|---|---| | cli | 192.168.1.66 | N/A | N/A | | orderer0 | 192.168.1.66 | orderer0.example.com | 7050, 8443, 9443 | | orderer1 | 192.168.1.66 | orderer1.example.com | 8050, 8444, 9444 | | orderer2 | 192.168.1.66 | orderer2.example.com | 9050, 8445, 9445 | | org1-peer0 | 192.168.1.66 | peer0.org1.example.com | 7051, 7052, 9446, 8125 | | org1-peer1 | 192.168.1.66 | peer1.org1.example.com | 8051, 7053, 9447, 8126 | | org2-peer0 | 192.168.1.66 | peer0.org2.example.com | 9051, 7054, 9448, 8127 | | org2-peer1 | 192.168.1.66 | peer1.org2.example.com | 10051, 7055, 9449, 8128 |

vim /etc/hosts

# Ajouter

192.168.1.66 orderer0.example.com
192.168.1.66 orderer1.example.com
192.168.1.66 orderer2.example.com

192.168.1.66 peer0.org1.example.com
192.168.1.66 peer1.org1.example.com

192.168.1.66 peer0.org2.example.com
192.168.1.66 peer1.org2.example.com

Déploiement du nœud org1-peer0

Éditer le fichier core.yaml : ```

Copyright IBM Corp. Tous droits réservés.

SPDX-License-Identifier: Apache-2.0

###############################################################################

Section Pair

############################################################################### peer:

# L'identifiant pair fournit un nom pour cette instance pair et est utilisé lors
# du nommage des ressources docker.
id: peer0.org1.example.com

# Le networkId permet une séparation logique des réseaux et est utilisé lors
# du nommage des ressources docker.
networkId: dev

# L'adresse de l'interface réseau locale sur laquelle ce pair écoutera.
# Par défaut, il écoutera sur toutes les interfaces réseau
listenAddress: 192.168.1.66:7051

# Le point de terminaison que ce pair utilise pour écouter les connexions chaincode entrantes.
# Si ceci est commenté, l'adresse d'écoute est sélectionnée pour être
# l'adresse du pair (voir ci-dessous) avec le port 7052
chaincodeListenAddress: 192.168.1.66:7052

# Le point de terminaison que le chaincode pour ce pair utilise pour se connecter au pair.
# Si ce n'est pas spécifié, l'adresse chaincodeListenAddress est sélectionnée.
# Et si chaincodeListenAddress n'est pas spécifié, l'adresse est sélectionnée à partir de
# l'adresse pair (voir ci-dessous). Si l'adresse pair spécifiée est invalide alors elle
# reviendra à l'IP détectée automatiquement (IP locale) quelle que soit la valeur de
# addressAutoDetect du pair.
chaincodeAddress: 192.168.1.66:7052

# Lorsqu'utilisé comme configuration pair, cela représente le point de terminaison vers d'autres pairs
# dans la même organisation. Pour les pairs dans d'autres organisations, voir
# gossip.externalEndpoint pour plus d'informations.
# Lorsqu'utilisé comme configuration CLI, cela signifie le point de terminaison pair pour interagir avec
address: 192.168.1.66:7051

# Si le pair doit déterminer programmatiquement son adresse
# Ce cas est utile pour les conteneurs docker.
# Lorsqu'il est défini sur true, cela remplacera l'adresse pair.
addressAutoDetect: false

# Paramètres pour le serveur passerelle du pair.
gateway:
    # Si la passerelle est activée pour ce pair.
    enabled: true
    # endorsementTimeout est la durée pendant laquelle la passerelle attend une réponse
    # des autres pairs approuvant avant de retourner une erreur de délai d'attente au client.
    endorsementTimeout: 30s
    # dialTimeout est la durée pendant laquelle la passerelle attend une connexion
    # aux autres nœuds du réseau.
    dialTimeout: 2m


# Paramètres de maintien de connexion pour le serveur pair et les clients
keepalive:
    # L'intervalle est la durée après laquelle si le serveur ne voit
    # aucune activité du client, il envoie un ping au client pour voir s'il est vivant
    interval: 7200s
    # Le délai d'expiration est la durée pendant laquelle le serveur attend une réponse
    # du client après avoir envoyé un ping avant de fermer la connexion
    timeout: 20s
    # MinInterval est le temps minimum autorisé entre les pings clients.
    # Si les clients envoient des pings plus fréquemment, le serveur pair
    # les déconnectera
    minInterval: 60s
    # Paramètres de maintien de connexion client pour communiquer avec d'autres nœuds pairs
    client:
        # L'intervalle est le temps entre les pings vers les nœuds pairs. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds pairs
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds pairs avant de fermer la connexion
        timeout: 20s
    # Paramètres de maintien de connexion DeliveryClient pour la communication avec les nœuds
    # d'ordonnancement.
    deliveryClient:
        # L'intervalle est le temps entre les pings vers les nœuds d'ordonnancement. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds d'ordonnancement.
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds d'ordonnancement avant de fermer la connexion
        timeout: 20s


# Configuration liée à la diffusion
gossip:
    # Ensemble d'amorçage pour initialiser la diffusion avec.
    # C'est une liste d'autres pairs que ce pair contacte au démarrage.
    # Important : Les points de terminaison ici doivent être des points de terminaison de pairs dans la même
    # organisation, car le pair refuserait de se connecter à ces points de terminaison
    # sauf s'ils sont dans la même organisation que le pair.
    bootstrap: 192.168.1.66:7051

    # NOTE : Les paramètres orgLeader et useLeaderElection sont mutuellement exclusifs.
    # Les définir tous deux à true entraînerait l'arrêt du pair
    # puisque c'est un état indéfini. Si les pairs sont configurés avec
    # useLeaderElection=false, assurez-vous qu'il y a au moins 1 pair dans l'
    # organisation dont orgLeader est défini sur true.

    # Définit si le pair initialisera un algorithme dynamique pour
    # la sélection du "leader", où le leader est le pair qui établit
    # la connexion avec le service d'ordonnancement et utilise le protocole
    # de livraison pour extraire les blocs de registre du service d'ordonnancement.
    useLeaderElection: false
    # Définit statiquement le pair comme "leader" d'une organisation,
    # ce qui signifie que le pair actuel maintiendra la connexion
    # avec le service d'ordonnancement et diffusera les blocs entre les pairs de
    # sa propre organisation. Plusieurs pairs ou tous les pairs d'une organisation
    # peuvent être configurés comme leaders d'organisation, afin qu'ils puissent tous
    # extraire directement les blocs du service d'ordonnancement.
    orgLeader: true

    # Intervalle pour les interrogations du traqueur d'appartenance
    membershipTrackerInterval: 5s

    # Remplace le point de terminaison que le pair publie aux pairs
    # dans son organisation. Pour les pairs dans des organisations étrangères
    # voir 'externalEndpoint'
    endpoint:
    # Nombre maximum de blocs stockés en mémoire
    maxBlockCountToStore: 10
    # Temps maximum entre les poussées de messages consécutives (unité : milliseconde)
    maxPropagationBurstLatency: 10ms
    # Nombre maximum de messages stockés jusqu'à ce qu'un poussage soit déclenché vers les pairs distants
    maxPropagationBurstSize: 10
    # Nombre de fois qu'un message est poussé vers les pairs distants
    propagateIterations: 1
    # Nombre de pairs sélectionnés vers lesquels pousser les messages
    propagatePeerNum: 3
    # Détermine la fréquence des phases de tirage (unité : seconde)
    # Doit être supérieur à digestWaitTime + responseWaitTime
    pullInterval: 4s
    # Nombre de pairs à partir desquels effectuer le tirage
    pullPeerNum: 3
    # Détermine la fréquence de tirage des messages d'information d'état provenant des pairs (unité : seconde)
    requestStateInfoInterval: 4s
    # Détermine la fréquence de poussage des messages d'information d'état vers les pairs (unité : seconde)
    publishStateInfoInterval: 4s
    # Temps maximum pendant lequel un message d'information d'état est conservé avant expiration
    stateInfoRetentionInterval:
    # Temps à partir duquel les certificats sont inclus dans les messages Alive (unité : seconde)
    publishCertPeriod: 10s
    # Devons-nous ignorer la vérification des messages de bloc ou non (actuellement non utilisé)
    skipBlockVerification: false
    # Délai de connexion (unité : seconde)
    dialTimeout: 3s
    # Délai de connexion (unité : seconde)
    connTimeout: 2s
    # Taille du tampon des messages reçus
    recvBuffSize: 20
    # Taille du tampon des messages envoyés
    sendBuffSize: 200
    # Temps d'attente avant que le moteur de tirage traite les résumés entrants (unité : seconde)
    # Devrait être légèrement inférieur à requestWaitTime
    digestWaitTime: 1s
    # Temps d'attente avant que le moteur de tirage supprime le nonce entrant (unité : millisecondes)
    # Devrait être légèrement supérieur à digestWaitTime
    requestWaitTime: 1500ms
    # Temps d'attente avant que le moteur de tirage termine le tirage (unité : seconde)
    responseWaitTime: 2s
    # Intervalle de vérification de vie (unité : seconde)
    aliveTimeInterval: 5s
    # Délai d'expiration de vie (unité : seconde)
    aliveExpirationTimeout: 25s
    # Intervalle de reconnexion (unité : seconde)
    reconnectInterval: 25s
    # Nombre maximum de tentatives de connexion à un pair
    maxConnectionAttempts: 120
    # Facteur d'expiration des messages pour les messages de vie
    msgExpirationFactor: 20
    # Ceci est un point de terminaison publié aux pairs en dehors de l'organisation.
    # Si ce n'est pas défini, le pair ne sera pas connu des autres organisations.
    externalEndpoint:
    # Configuration du service d'élection de leader
    election:
        # Temps le plus long que le pair attend pour une appartenance stable pendant le démarrage de l'élection de leader (unité : seconde)
        startupGracePeriod: 15s
        # Intervalle des échantillons d'appartenance de diffusion pour vérifier sa stabilité (unité : seconde)
        membershipSampleInterval: 1s
        # Temps écoulé depuis le dernier message de déclaration avant que le pair décide d'effectuer l'élection de leader (unité : seconde)
        leaderAliveThreshold: 10s
        # Temps entre l'envoi du message de proposition par le pair et sa déclaration comme leader (envoi du message de déclaration) (unité : seconde)
        leaderElectionDuration: 5s

    pvtData:
        # pullRetryThreshold détermine la durée maximale pendant laquelle les données privées correspondant à un bloc donné
        # seront tentées d'être extraites des pairs jusqu'à ce que le bloc soit validé sans les données privées
        pullRetryThreshold: 60s
        # Lorsque les données privées entrent dans le magasin temporaire, elles sont associées à la hauteur du registre du pair à ce moment-là.
        # transientstoreMaxBlockRetention définit la différence maximale entre la hauteur actuelle du registre lors de la validation,
        # et les données privées résidant dans le magasin temporaire qui sont garanties de ne pas être purgées.
        # Les données privées sont purgées du magasin temporaire lorsque des blocs avec des séquences qui sont des multiples
        # de transientstoreMaxBlockRetention sont validés.
        transientstoreMaxBlockRetention: 1000
        # pushAckTimeout est le temps maximum d'attente pour une reconnaissance de chaque pair
        # lors de la poussée des données privées au moment de l'appui.
        pushAckTimeout: 3s
        # Marge de tirage Block to live, utilisée comme tampon
        # pour empêcher le pair d'essayer de tirer les données privées
        # des pairs qui seront bientôt purgées dans les N prochains blocs.
        # Cela aide un pair nouvellement joint à rattraper plus rapidement
        # la hauteur actuelle de la blockchain.
        btlPullMargin: 10
        # le processus de réconciliation est effectué dans une boucle infinie, tandis que dans chaque itération le réconciliateur essaie de
        # tirer des autres pairs les blocs manquants les plus récents avec une limitation de taille de lot maximale.
        # reconcileBatchSize détermine la taille de lot maximale des données privées manquantes qui seront réconciliées dans une
        # seule itération.
        reconcileBatchSize: 10
        # reconcileSleepInterval détermine le temps que le réconciliateur dort de la fin d'une itération jusqu'au début
        # de la prochaine itération de réconciliation.
        reconcileSleepInterval: 1m
        # reconciliationEnabled est un indicateur qui indique si la réconciliation des données privées est activée ou non.
        reconciliationEnabled: true
        # skipPullingInvalidTransactionsDuringCommit est un indicateur qui indique si le tirage des données privées
        # des transactions invalides provenant d'autres pairs doit être ignoré pendant le temps de validation et tiré
        # uniquement via le réconciliateur.
        skipPullingInvalidTransactionsDuringCommit: false
        # implicitCollectionDisseminationPolicy spécifie la politique de dissémination pour la collection implicite propre au pair.
        # Lorsqu'un pair approuve une proposition qui écrit dans sa propre collection implicite, les valeurs ci-dessous remplacent les valeurs par défaut
        # pour la dissémination des données privées.
        # Notez que cela s'applique à tous les canaux auxquels le pair a rejoint. L'implication est que requiredPeerCount doit
        # être inférieur au nombre de pairs dans un canal qui a le plus petit nombre de pairs de l'organisation.
        implicitCollectionDisseminationPolicy:
           # requiredPeerCount définit le nombre minimum de pairs éligibles auxquels le pair doit réussir
           # à disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 0.
           requiredPeerCount: 0
           # maxPeerCount définit le nombre maximum de pairs éligibles auxquels le pair tentera de
           # disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 1.
           maxPeerCount: 1

    # Configuration liée au transfert d'état de la diffusion
    state:
        # indique si le transfert d'état est activé ou non
        # la valeur par défaut est false, c'est-à-dire que le transfert d'état est actif
        # et veille à synchroniser les blocs manquants permettant
        # au pair en retard de rattraper la vitesse du reste du réseau.
        # Gardez à l'esprit que lorsque peer.gossip.useLeaderElection est vrai
        # et qu'il y a plusieurs pairs dans l'organisation,
        # ou peer.gossip.useLeaderElection est faux ainsi que
        # peer.gossip.orgleader étant faux, le registre du pair peut être en retard
        # par rapport aux autres pairs et ne rattrapera jamais le rythme en raison du transfert d'état
        # étant désactivé.
        enabled: false
        # checkInterval intervalle pour vérifier si le pair est suffisamment en retard pour
        # demander des blocs via le transfert d'état d'un autre pair.
        checkInterval: 10s
        # responseTimeout durée d'attente pour la réponse de transfert d'état de
        # autres pairs
        responseTimeout: 3s
        # batchSize le nombre de blocs à demander via le transfert d'état d'un autre pair
        batchSize: 10
        # blockBufferSize reflète la taille du tampon de réordonnancement
        # qui capture les blocs et veille à les livrer dans l'ordre
        # vers la couche de registre. La taille réelle du tampon est bornée entre
        # 0 et 2*blockBufferSize, chaque canal maintient son propre tampon
        blockBufferSize: 20
        # maxRetries nombre maximum de nouvelles tentatives pour demander
        # une seule requête de transfert d'état
        maxRetries: 3

# Paramètres TLS
tls:
    # Exiger le TLS côté serveur
    enabled:  true
    # Exiger les certificats clients / TLS mutuel pour les connexions entrantes.
    # Notez que les clients qui ne sont pas configurés pour utiliser un certificat
    # échoueront à se connecter au pair.
    clientAuthRequired: false
    # Certificat X.509 utilisé pour le serveur TLS
    cert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/tls/server.crt
    # Clé privée utilisée pour le serveur TLS
    key:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/tls/server.key
    # rootcert.file représente la chaîne de certificats racines de confiance utilisée pour vérifier les certificats
    # des autres nœuds lors des connexions sortantes.
    # Il n'est pas nécessaire de le définir, mais il peut être utilisé pour compléter l'ensemble des certificats TLS CA
    # disponibles à partir des MSP de chaque configuration de canal.
    rootcert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/tls/ca.crt
    # Si le TLS mutuel est activé, clientRootCAs.files contient une liste de certificats racines supplémentaires
    # utilisés pour vérifier les certificats des connexions clients.
    # Il complète l'ensemble des certificats TLS CA disponibles à partir des MSP de chaque configuration de canal.
    # Au minimum, définissez le certificat racine TLS CA de votre organisation afin que le pair puisse recevoir les demandes de jonction de canal.
    clientRootCAs:
        files:
          - /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/tls/ca.crt
    # Clé privée utilisée pour TLS lors des connexions clientes.
    # Si non définie, peer.tls.key.file sera utilisé à la place
    clientKey:
        file:
    # Certificat X.509 utilisé pour TLS lors des connexions clientes.
    # Si non défini, peer.tls.cert.file sera utilisé à la place
    clientCert:
        file:

# Authentication contient les paramètres de configuration liés à l'authentification
# des messages clients
authentication:
    # la différence acceptable entre l'heure actuelle du serveur et l'
    # heure du client comme spécifiée dans un message de demande client
    timewindow: 15m

# Chemin sur le système de fichiers où le pair stockera les données (par exemple registre). Cet
# emplacement doit être protégé par un contrôle d'accès pour empêcher toute modification
# non intentionnelle qui pourrait corrompre les opérations du pair.
fileSystemPath: /var/hyperledger/production/org1-peer0

# BCCSP (fournisseur cryptographique Blockchain) : Sélectionnez quelle implémentation ou
# bibliothèque cryptographique utiliser
BCCSP:
    Default: SW
    # Paramètres pour le fournisseur cryptographique SW (c'est-à-dire lorsque DEFAULT : SW)
    SW:
        # TODO : Le hachage et le niveau de sécurité par défaut nécessitent une refactorisation pour être
        # entièrement configurable. Changer ces valeurs par défaut nécessite une coordination
        # SHA2 est codé en dur à plusieurs endroits, pas seulement dans BCCSP
        Hash: SHA2
        Security: 256
        # Emplacement du magasin de clés
        FileKeyStore:
            # Si "", la valeur par défaut est 'mspConfigPath'/keystore
            KeyStore:
    # Paramètres pour le fournisseur cryptographique PKCS#11 (c'est-à-dire lorsque DEFAULT : PKCS11)
    PKCS11:
        # Emplacement de la bibliothèque de module PKCS11
        Library:
        # Étiquette du jeton
        Label:
        # Code PIN utilisateur
        Pin:
        Hash:
        Security:

# Chemin sur le système de fichiers où le pair trouvera les configurations MSP locales
mspConfigPath: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/msp

# Identificateur du MSP local
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# Les déploiements doivent changer la valeur de la chaîne localMspId.
# En particulier, le nom de l'ID MSP local d'un pair doit
# correspondre au nom de l'un des MSPs de chaque canal
# auquel ce pair appartient. Sinon, les messages de ce pair
# ne seront pas identifiés comme valides par les autres nœuds.
localMspId: Org1MSP

# Options de configuration client CLI communes
client:
    # délai de connexion
    connTimeout: 3s

# Configuration liée au service de livraison
deliveryclient:
    # Active ce pair pour diffuser les blocs qu'il a extraits du service d'ordonnancement
    # via la diffusion.
    # Notez que 'gossip.state.enabled' contrôle la réplication de blocs point à point
    # des blocs validés dans le passé.
    blockGossipEnabled: true
    # Définit le temps total que le service de livraison peut passer dans les tentatives de
    # reconnexion jusqu'à ce que sa logique de nouvelle tentative abandonne et renvoie une erreur
    reconnectTotalTimeThreshold: 3600s

    # Définit le délai de connexion du service de livraison <-> service d'ordonnancement
    connTimeout: 3s

    # Définit le délai maximal du service de livraison entre les nouvelles tentatives consécutives
    reConnectBackoffThreshold: 3600s

    # Une liste d'adresses de points de terminaison de service d'ordonnancement qui devraient être remplacées
    # lorsqu'elles sont trouvées dans les configurations de canal.
    addressOverrides:
    #  - from:
    #    to:
    #    caCertsFile:
    #  - from:
    #    to:
    #    caCertsFile:

# Type pour le MSP local - par défaut c'est de type bccsp
localMspType: bccsp

# Utilisé avec les outils de profilage Go uniquement dans un environnement non de production. Dans
# la production, il devrait être désactivé (par exemple enabled : false)
profile:
    enabled:     false
    listenAddress: 0.0.0.0:6060

# Handlers définit des gestionnaires personnalisés qui peuvent filtrer et modifier
# les objets passant dans le pair, tels que :
#   Filtre d'authentification - rejeter ou transmettre les propositions des clients
#   Décorateurs - ajouter ou modifier l'entrée chaincode transmise au chaincode
#   Appuis - Signature personnalisée sur la charge utile de réponse de proposition et sa modification
# Une définition de gestionnaire valide contient :
#   - Un nom qui est un nom de méthode de fabrique défini dans
#     core/handlers/library/library.go pour les gestionnaires compilés statiquement
#   - chemin de bibliothèque vers le binaire objet partagé pour les filtres branchables
# Les filtres d'authentification et les décorateurs sont chaînés et exécutés dans l'ordre
# où ils sont définis. Par exemple :
# authFilters:
#   -
#     name: FilterOne
#     library: /opt/lib/filter.so
#   -
#     name: FilterTwo
# decorators:
#   -
#     name: DecoratorOne
#   -
#     name: DecoratorTwo
#     library: /opt/lib/decorator.so
# Les appuis sont configurés en tant que carte dont les clés sont les chaincodes système d'appui qui sont remplacés.
# Ci-dessous un exemple qui remplace l'ESCC par défaut et utilise un plugin d'appui qui a la même fonctionnalité
# que l'ESCC par défaut.
# Si la propriété 'library' est absente, le nom est utilisé comme méthode de constructeur dans la bibliothèque intégrée similaire
# aux filtres d'authentification et aux décorateurs.
# endorsers:
#   escc:
#     name: DefaultESCC
#     library: /etc/hyperledger/fabric/plugin/escc.so
handlers:
    authFilters:
      -
        name: DefaultAuth
      -
        name: ExpirationCheck    # Ce filtre vérifie l'expiration du certificat x509 d'identité
    decorators:
      -
        name: DefaultDecorator
    endorsers:
      escc:
        name: DefaultEndorsement
        library:
    validators:
      vscc:
        name: DefaultValidation
        library:

#    library: /etc/hyperledger/fabric/plugin/escc.so
# Nombre de goroutines qui exécuteront la validation des transactions en parallèle.
# Par défaut, le pair choisit le nombre de processeurs de la machine. Définissez cette
# variable pour remplacer ce choix.
# NOTE : remplacer cette valeur pourrait négativement influencer les performances du
# pair donc veuillez changer cette valeur uniquement si vous savez ce que vous faites
validatorPoolSize:

# Le service de découverte est utilisé par les clients pour interroger des informations sur les pairs,
# telles que - quels pairs ont rejoint un certain canal, quelle est la dernière
# configuration du canal, et surtout - étant donné un chaincode et un canal,
# quels ensembles possibles de pairs satisfont la politique d'appui.
discovery:
    enabled: true
    # Si le cache d'authentification est activé ou non.
    authCacheEnabled: true
    # La taille maximale du cache, après quoi un nettoyage a lieu
    authCacheMaxSize: 1000
    # La proportion (0 à 1) des entrées qui restent dans le cache après que le cache soit nettoyé en raison d'une surpopulation
    authCachePurgeRetentionRatio: 0.75
    # Si l'on autorise les non-administrateurs à effectuer des requêtes hors périmètre de canal.
    # Lorsque c'est faux, cela signifie que seuls les administrateurs de pair peuvent effectuer des requêtes hors périmètre de canal.
    orgMembersAllowedAccess: false

# Limits est utilisé pour configurer certaines limites de ressources internes.
limits:
    # Concurrency limite le nombre de requêtes simultanément en cours d'exécution vers un service sur chaque pair.
    # Actuellement cette option est appliquée uniquement au service d'appui et au service de livraison.
    # Lorsque la propriété est absente ou que la valeur est 0, la limite de concurrence est désactivée pour le service.
    concurrency:
        # endorserService limite les requêtes simultanées vers le service d'appui qui gère le déploiement, la requête et l'invocation de chaincode,
        # y compris les chaincodes utilisateur et les chaincodes système.
        endorserService: 2500
        # deliverService limite les auditeurs d'événements simultanés enregistrés auprès du service de livraison pour les événements de blocs et de transactions.
        deliverService: 2500
        # gatewayService limite les requêtes simultanées vers le service de passerelle qui gère la soumission et l'évaluation des transactions.
        gatewayService: 500

# Puisque tous les nœuds devraient être cohérents, il est recommandé de conserver
# la valeur par défaut de 100 Mo pour MaxRecvMsgSize & MaxSendMsgSize
# Taille maximale du message en octets que le serveur et le client GRPC peuvent recevoir
maxRecvMsgSize: 104857600
# Taille maximale du message en octets que le serveur et le client GRPC peuvent envoyer
maxSendMsgSize: 104857600

###############################################################################

Section VM

############################################################################### vm:

# Point de terminaison du système de gestion vm. Pour docker peut être l'un des suivants en général
# unix:///var/run/docker.sock
# http://localhost:2375
# https://localhost:2376
# Si vous utilisez des constructeurs de chaincode externes et que vous n'avez pas besoin du constructeur de chaincode Docker par défaut,
# le point de terminaison devrait ne pas être configuré afin que le vérificateur de santé Docker du pair ne soit pas enregistré.
endpoint: unix:///var/run/docker.sock

# paramètres pour les vms docker
docker:
    tls:
        enabled: false
        ca:
            file: docker/ca.crt
        cert:
            file: docker/tls.crt
        key:
            file: docker/tls.key

    # Active/désactive la sortie standard/erreur des conteneurs chaincode pour
    # des fins de débogage
    attachStdout: false

    # Paramètres lors de la création du conteneur docker.
    # Le conteneur peut être créé efficacement en utilisant ipam & dns-server pour le cluster
    # NetworkMode - définit le mode réseau pour le conteneur. Les
    # valeurs standard prises en charge sont : `host`(par défaut),`bridge`,`ipvlan`,`none`.
    # Dns - une liste de serveurs DNS pour que le conteneur les utilise.
    # Note : Les propriétés `Privileged` `Binds` `Links` et `PortBindings` de
    # la configuration hôte Docker ne sont pas prises en charge et ne seront pas utilisées si définies.
    # LogConfig - définit le pilote de journalisation (Type) et les options
    # (Config) pour Docker. Pour plus d'informations,
    # https://docs.docker.com/engine/admin/logging/overview/
    # Note : Définir LogConfig en utilisant des variables d'environnement n'est pas pris en charge.
    hostConfig:
        NetworkMode: host
        Dns:
           # - 192.168.0.1
        LogConfig:
            Type: json-file
            Config:
                max-size: "50m"
                max-file: "5"
        Memory: 2147483648

###############################################################################

Section Chaincode

############################################################################### chaincode:

# L'id est utilisé par le stub de chaincode pour enregistrer le chaincode en cours d'exécution
# ID avec le pair et est généralement fourni via des variables ENV
# la forme `path` de l'ID est fournie lors de l'installation du chaincode.
# Le `name` est utilisé pour toutes les autres requêtes et peut être n'importe quelle chaîne.
id:
    path:
    name:

# Environnement de construction générique, adapté à la plupart des types de chaincode
builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION)

# Active/désactive le téléchargement forcé des images docker de base (répertoriées ci-dessous)
# lors de l'instanciation du chaincode utilisateur.
# Utile lors de l'utilisation de balises d'image mobiles (telles que :latest)
pull: false

golang:
    # golang n'aura jamais besoin de plus que baseos
    runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION)

    # si oui ou non le chaincode golang doit être lié dynamiquement
    dynamicLink: false

java:
    # C'est une image basée sur java:openjdk-8 avec des outils de compilation
    # supplémentaires ajoutés pour l'emballage de la couche shim java.
    # Cette image est emballée avec les bibliothèques de couche shim nécessaires
    # pour l'exécution du chaincode Java.
    runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION)

node:
    # C'est une image basée sur node:$(NODE_VER)-alpine
    runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION)

# Liste des répertoires à traiter comme des constructeurs et lanceurs externes pour
# chaincode. Le traitement de détection de constructeur externe itérera sur les
# constructeurs dans l'ordre spécifié ci-dessous.
# Si vous n'avez pas besoin de revenir au constructeur Docker par défaut, désactivez également vm.endpoint ci-dessus.
# Pour remplacer cette propriété via une variable d'environnement, utilisez CORE_CHAINCODE_EXTERNALBUILDERS: [{name: x, path: dir1}, {name: y, path: dir2}]
externalBuilders:
   - name: ccaas_builder
     path: /opt/hyperledger/ccaas_builder
     propagateEnvironment:
       - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG


# La durée maximale d'attente pour que le processus de construction et d'installation du chaincode
# soit terminé.
installTimeout: 300s

# Durée d'attente pour le démarrage d'un conteneur et l'attente de Register
# à traverser.
startuptimeout: 300s

# Durée d'attente pour les appels Invoke et Init pour éviter les problèmes.
# Ce délai d'attente est utilisé par tous les chaincodes dans tous les canaux, y compris
# les chaincodes système.
# Notez que pendant Invoke, si l'image n'est pas disponible (par exemple en train d'être
# nettoyée dans un environnement de développement), le pair construira automatiquement
# l'image, ce qui pourrait prendre plus de temps. Dans un environnement de production,
# l'image du chaincode est peu susceptible d'être supprimée, donc le délai d'attente pourrait être
# réduit en conséquence.
executetimeout: 30s

# Il y a 2 modes : "dev" et "net".
# En mode dev, l'utilisateur exécute le chaincode après avoir démarré le pair à partir de
# ligne de commande sur la machine locale.
# En mode net, le pair exécutera le chaincode dans un conteneur docker.
mode: net

# maintien de connexion en secondes. Dans les situations où la communication passe par un
# proxy qui ne prend pas en charge le maintien de connexion, ce paramètre maintiendra la connexion
# entre le pair et le chaincode.
# Une valeur <= 0 désactive le maintien de connexion
keepalive: 0

# chaincodes système activés
system:
    _lifecycle: enable
    cscc: enable
    lscc: enable
    qscc: enable

# Section de journalisation pour le conteneur chaincode
logging:
  # Niveau par défaut pour tous les journaux dans le conteneur chaincode
  level:  info
  # Remplacer le niveau par défaut pour le journal 'shim'
  shim:   warning
  # Format pour les journaux du conteneur chaincode
  format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

###############################################################################

Section Registre - la configuration du registre englobe à la fois la blockchain

et l'état

############################################################################### ledger:

blockchain:

state: # stateDatabase - les options sont "goleveldb", "CouchDB" # goleveldb - base de données d'état par défaut stockée dans goleveldb. # CouchDB - stocker la base de données d'état dans CouchDB stateDatabase: goleveldb # Limite sur le nombre d'enregistrements à retourner par requête totalQueryLimit: 100000 couchDBConfig: # Il est recommandé d'exécuter CouchDB sur le même serveur que le pair, et # de ne pas mapper le port conteneur CouchDB vers un port serveur dans docker-compose. # Sinon une sécurité appropriée doit être fournie sur la connexion entre # le client CouchDB (sur le pair) et le serveur. couchDBAddress: 127.0.0.1:5984 # Cet utilisateur doit avoir les autorités de lecture et d'écriture sur CouchDB username: # Le mot de passe est recommandé d'être transmis comme variable d'environnement # lors du démarrage (par exemple CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD). # S'il est stocké ici, le fichier doit être protégé par un contrôle d'accès # pour empêcher des utilisateurs non intentionnels de découvrir le mot de passe. password: # Nombre de nouvelles tentatives pour les erreurs CouchDB maxRetries: 3 # Nombre de nouvelles tentatives pour les erreurs CouchDB pendant le démarrage du pair. # Le délai entre les tentatives double à chaque tentative. # La valeur par défaut de 10 tentatives donne 11 tentatives sur 2 minutes. maxRetriesOnStartup: 10 # Délai de requête CouchDB (unité : durée, par exemple 20s) requestTimeout: 35s # Limite sur le nombre d'enregistrements par chaque requête CouchDB # Notez que les requêtes chaincode sont uniquement limitées par totalQueryLimit. # En interne le chaincode peut exécuter plusieurs requêtes CouchDB, # chacune de taille internalQueryLimit. internalQueryLimit: 1000 # Limite sur le nombre d'enregistrements par lot de mise à jour CouchDB maxBatchUpdateSize: 1000 # Créer la base de données système _global_changes # C'est facultatif. Créer la base de données de changements globaux nécessitera # des ressources système supplémentaires pour suivre les changements et maintenir la base de données createGlobalChangesDB: false # CacheSize indique le nombre maximum de mégaoctets (Mo) à allouer pour le cache d'état # en mémoire. Notez que CacheSize doit être un multiple de 32 Mo. S'il n'est pas un multiple # de 32 Mo, le pair arrondira la taille au multiple de 32 Mo suivant. # Pour désactiver le cache, 0 Mo doivent être affectés à cacheSize. cacheSize: 64

history: # enableHistoryDatabase - les options sont true ou false # Indique si l'historique des mises à jour de clés doit être stocké. # Tous les index d'historique seront stockés dans goleveldb, quelle que soit l'utilisation # de CouchDB ou d'une base de données alternative pour l'état. enableHistoryDatabase: true

pvtdataStore: # la taille maximale du lot de base de données pour convertir # les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcMaxDbBatchSize: 5000 # la durée minimale (en millisecondes) entre l'écriture # de deux lots de base de données consécutifs pour convertir les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcDbBatchesInterval: 1000 # Les entrées de données manquantes sont classées en deux catégories : # (1) priorisées # (2) dépriorisées # Initialement, toutes les données manquantes sont dans la liste priorisée. Quand le # réconciliateur est incapable de récupérer les données manquantes auprès d'autres pairs, # les données manquantes non réconciliées seraient déplacées vers la liste dépriorisée. # Le réconciliateur réessaiera les données manquantes dépriorisées après chaque # deprioritizedDataReconcilerInterval (unité : minutes). Notez que l' # intervalle doit être supérieur à reconcileSleepInterval deprioritizedDataReconcilerInterval: 60m

snapshots: # Chemin sur le système de fichiers où le pair stockera les instantanés du registre rootDir: /var/hyperledger/production/snapshots/org1-peer0

###############################################################################

Section Opérations

############################################################################### operations: # hôte et port pour le serveur d'opérations listenAddress: 127.0.0.1:9446

# Configuration TLS pour le point de terminaison des opérations
tls:
    # TLS activé
    enabled: false

    # chemin vers le certificat de serveur PEM encodé pour le serveur d'opérations
    cert:
        file:

    # chemin vers la clé de serveur PEM encodée pour le serveur d'opérations
    key:
        file:

    # la plupart des points de terminaison de service d'opérations exigent l'authentification client lorsque TLS
    # est activé. clientAuthRequired exige l'authentification par certificat client
    # au niveau TLS pour accéder à toutes les ressources.
    clientAuthRequired: false

    # chemins vers les certificats CA PEM encodés à faire confiance pour l'authentification client
    clientRootCAs:
        files: []

###############################################################################

Section Métriques

############################################################################### metrics: # le fournisseur de métriques est l'un de statsd, prometheus, ou désactivé provider: disabled

# configuration statsd
statsd:
    # type de réseau : tcp ou udp
    network: udp

    # adresse du serveur statsd
    address: 127.0.0.1:8125

    # l'intervalle auquel les compteurs et jauges mis en cache localement sont poussés
    # vers statsd ; les temporisations sont poussées immédiatement
    writeInterval: 10s

    # le préfixe est ajouté à toutes les métriques statsd émises
    prefix:

Démarrer le nœud org1-peer0 : ```
nohup ./peer node start > org1-peer0.log 2>&1 &

Déploiement du nœud org1-peer1

Éditer le fichier core.yaml : ```

Copyright IBM Corp. Tous droits réservés.

SPDX-License-Identifier: Apache-2.0

###############################################################################

Section Pair

############################################################################### peer:

# L'identifiant pair fournit un nom pour cette instance pair et est utilisé lors
# du nommage des ressources docker.
id: peer1.org1.example.com

# Le networkId permet une séparation logique des réseaux et est utilisé lors
# du nommage des ressources docker.
networkId: dev

# L'adresse de l'interface réseau locale sur laquelle ce pair écoutera.
# Par défaut, il écoutera sur toutes les interfaces réseau
listenAddress: 192.168.1.66:8051

# Le point de terminaison que ce pair utilise pour écouter les connexions chaincode entrantes.
# Si ceci est commenté, l'adresse d'écoute est sélectionnée pour être
# l'adresse du pair (voir ci-dessous) avec le port 7052
chaincodeListenAddress: 192.168.1.66:7053

# Le point de terminaison que le chaincode pour ce pair utilise pour se connecter au pair.
# Si ce n'est pas spécifié, l'adresse chaincodeListenAddress est sélectionnée.
# Et si chaincodeListenAddress n'est pas spécifié, l'adresse est sélectionnée à partir de
# l'adresse pair (voir ci-dessous). Si l'adresse pair spécifiée est invalide alors elle
# reviendra à l'IP détectée automatiquement (IP locale) quelle que soit la valeur de
# addressAutoDetect du pair.
# chaincodeAddress: 192.168.1.66:7053

# Lorsqu'utilisé comme configuration pair, cela représente le point de terminaison vers d'autres pairs
# dans la même organisation. Pour les pairs dans d'autres organisations, voir
# gossip.externalEndpoint pour plus d'informations.
# Lorsqu'utilisé comme configuration CLI, cela signifie le point de terminaison pair pour interagir avec
address: 192.168.1.66:8051

# Si le pair doit déterminer programmatiquement son adresse
# Ce cas est utile pour les conteneurs docker.
# Lorsqu'il est défini sur true, cela remplacera l'adresse pair.
addressAutoDetect: false

# Paramètres pour le serveur passerelle du pair.
gateway:
    # Si la passerelle est activée pour ce pair.
    enabled: true
    # endorsementTimeout est la durée pendant laquelle la passerelle attend une réponse
    # des autres pairs approuvant avant de retourner une erreur de délai d'attente au client.
    endorsementTimeout: 30s
    # dialTimeout est la durée pendant laquelle la passerelle attend une connexion
    # aux autres nœuds du réseau.
    dialTimeout: 2m


# Paramètres de maintien de connexion pour le serveur pair et les clients
keepalive:
    # L'intervalle est la durée après laquelle si le serveur ne voit
    # aucune activité du client, il envoie un ping au client pour voir s'il est vivant
    interval: 7200s
    # Le délai d'expiration est la durée pendant laquelle le serveur attend une réponse
    # du client après avoir envoyé un ping avant de fermer la connexion
    timeout: 20s
    # MinInterval est le temps minimum autorisé entre les pings clients.
    # Si les clients envoient des pings plus fréquemment, le serveur pair
    # les déconnectera
    minInterval: 60s
    # Paramètres de maintien de connexion client pour communiquer avec d'autres nœuds pairs
    client:
        # L'intervalle est le temps entre les pings vers les nœuds pairs. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds pairs
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds pairs avant de fermer la connexion
        timeout: 20s
    # Paramètres de maintien de connexion DeliveryClient pour la communication avec les nœuds
    # d'ordonnancement.
    deliveryClient:
        # L'intervalle est le temps entre les pings vers les nœuds d'ordonnancement. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds d'ordonnancement.
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds d'ordonnancement avant de fermer la connexion
        timeout: 20s


# Configuration liée à la diffusion
gossip:
    # Ensemble d'amorçage pour initialiser la diffusion avec.
    # C'est une liste d'autres pairs que ce pair contacte au démarrage.
    # Important : Les points de terminaison ici doivent être des points de terminaison de pairs dans la même
    # organisation, car le pair refuserait de se connecter à ces points de terminaison
    # sauf s'ils sont dans la même organisation que le pair.
    bootstrap: 192.168.1.66:8051

    # NOTE : orgLeader et useLeaderElection sont mutuellement exclusifs.
    # Les définir tous deux à true entraînerait l'arrêt du pair
    # puisque c'est un état indéfini. Si les pairs sont configurés avec
    # useLeaderElection=false, assurez-vous qu'il y a au moins 1 pair dans l'
    # organisation dont orgLeader est défini sur true.

    # Définit si le pair initialisera un algorithme dynamique pour
    # la sélection du "leader", où le leader est le pair qui établit
    # la connexion avec le service d'ordonnancement et utilise le protocole
    # de livraison pour extraire les blocs de registre du service d'ordonnancement.
    useLeaderElection: false
    # Définit statiquement le pair comme "leader" d'une organisation,
    # ce qui signifie que le pair actuel maintiendra la connexion
    # avec le service d'ordonnancement et diffusera les blocs entre les pairs de
    # sa propre organisation. Plusieurs pairs ou tous les pairs d'une organisation
    # peuvent être configurés comme leaders d'organisation, afin qu'ils puissent tous
    # extraire directement les blocs du service d'ordonnancement.
    orgLeader: true

    # Intervalle pour les interrogations du traqueur d'appartenance
    membershipTrackerInterval: 5s

    # Remplace le point de terminaison que le pair publie aux pairs
    # dans son organisation. Pour les pairs dans des organisations étrangères
    # voir 'externalEndpoint'
    endpoint:
    # Nombre maximum de blocs stockés en mémoire
    maxBlockCountToStore: 10
    # Temps maximum entre les poussées de messages consécutives (unité : milliseconde)
    maxPropagationBurstLatency: 10ms
    # Nombre maximum de messages stockés jusqu'à ce qu'un poussage soit déclenché vers les pairs distants
    maxPropagationBurstSize: 10
    # Nombre de fois qu'un message est poussé vers les pairs distants
    propagateIterations: 1
    # Nombre de pairs sélectionnés vers lesquels pousser les messages
    propagatePeerNum: 3
    # Détermine la fréquence des phases de tirage (unité : seconde)
    # Doit être supérieur à digestWaitTime + responseWaitTime
    pullInterval: 4s
    # Nombre de pairs à partir desquels effectuer le tirage
    pullPeerNum: 3
    # Détermine la fréquence de tirage des messages d'information d'état provenant des pairs (unité : seconde)
    requestStateInfoInterval: 4s
    # Détermine la fréquence de poussage des messages d'information d'état vers les pairs (unité : seconde)
    publishStateInfoInterval: 4s
    # Temps maximum pendant lequel un message d'information d'état est conservé avant expiration
    stateInfoRetentionInterval:
    # Temps à partir duquel les certificats sont inclus dans les messages Alive (unité : seconde)
    publishCertPeriod: 10s
    # Devons-nous ignorer la vérification des messages de bloc ou non (actuellement non utilisé)
    skipBlockVerification: false
    # Délai de connexion (unité : seconde)
    dialTimeout: 3s
    # Délai de connexion (unité : seconde)
    connTimeout: 2s
    # Taille du tampon des messages reçus
    recvBuffSize: 20
    # Taille du tampon des messages envoyés
    sendBuffSize: 200
    # Temps d'attente avant que le moteur de tirage traite les résumés entrants (unité : seconde)
    # Devrait être légèrement inférieur à requestWaitTime
    digestWaitTime: 1s
    # Temps d'attente avant que le moteur de tirage supprime le nonce entrant (unité : millisecondes)
    # Devrait être légèrement supérieur à digestWaitTime
    requestWaitTime: 1500ms
    # Temps d'attente avant que le moteur de tirage termine le tirage (unité : seconde)
    responseWaitTime: 2s
    # Intervalle de vérification de vie (unité : seconde)
    aliveTimeInterval: 5s
    # Délai d'expiration de vie (unité : seconde)
    aliveExpirationTimeout: 25s
    # Intervalle de reconnexion (unité : seconde)
    reconnectInterval: 25s
    # Nombre maximum de tentatives de connexion à un pair
    maxConnectionAttempts: 120
    # Facteur d'expiration des messages pour les messages de vie
    msgExpirationFactor: 20
    # Ceci est un point de terminaison publié aux pairs en dehors de l'organisation.
    # Si ce n'est pas défini, le pair ne sera pas connu des autres organisations.
    externalEndpoint:
    # Configuration du service d'élection de leader
    election:
        # Temps le plus long que le pair attend pour une appartenance stable pendant le démarrage de l'élection de leader (unité : seconde)
        startupGracePeriod: 15s
        # Intervalle des échantillons d'appartenance de diffusion pour vérifier sa stabilité (unité : seconde)
        membershipSampleInterval: 1s
        # Temps écoulé depuis le dernier message de déclaration avant que le pair décide d'effectuer l'élection de leader (unité : seconde)
        leaderAliveThreshold: 10s
        # Temps entre l'envoi du message de proposition par le pair et sa déclaration comme leader (envoi du message de déclaration) (unité : seconde)
        leaderElectionDuration: 5s

    pvtData:
        # pullRetryThreshold détermine la durée maximale pendant laquelle les données privées correspondant à un bloc donné
        # seront tentées d'être extraites des pairs jusqu'à ce que le bloc soit validé sans les données privées
        pullRetryThreshold: 60s
        # Lorsque les données privées entrent dans le magasin temporaire, elles sont associées à la hauteur du registre du pair à ce moment-là.
        # transientstoreMaxBlockRetention définit la différence maximale entre la hauteur actuelle du registre lors de la validation,
        # et les données privées résidant dans le magasin temporaire qui sont garanties de ne pas être purgées.
        # Les données privées sont purgées du magasin temporaire lorsque des blocs avec des séquences qui sont des multiples
        # de transientstoreMaxBlockRetention sont validés.
        transientstoreMaxBlockRetention: 1000
        # pushAckTimeout est le temps maximum d'attente pour une reconnaissance de chaque pair
        # lors de la poussée des données privées au moment de l'appui.
        pushAckTimeout: 3s
        # Marge de tirage Block to live, utilisée comme tampon
        # pour empêcher le pair d'essayer de tirer les données privées
        # des pairs qui seront bientôt purgées dans les N prochains blocs.
        # Cela aide un pair nouvellement joint à rattraper plus rapidement
        # la hauteur actuelle de la blockchain.
        btlPullMargin: 10
        # le processus de réconciliation est effectué dans une boucle infinie, tandis que dans chaque itération le réconciliateur essaie de
        # tirer des autres pairs les blocs manquants les plus récents avec une limitation de taille de lot maximale.
        # reconcileBatchSize détermine la taille de lot maximale des données privées manquantes qui seront réconciliées dans une
        # seule itération.
        reconcileBatchSize: 10
        # reconcileSleepInterval détermine le temps que le réconciliateur dort de la fin d'une itération jusqu'au début
        # de la prochaine itération de réconciliation.
        reconcileSleepInterval: 1m
        # reconciliationEnabled est un indicateur qui indique si la réconciliation des données privées est activée ou non.
        reconciliationEnabled: true
        # skipPullingInvalidTransactionsDuringCommit est un indicateur qui indique si le tirage des données privées
        # des transactions invalides provenant d'autres pairs doit être ignoré pendant le temps de validation et tiré
        # uniquement via le réconciliateur.
        skipPullingInvalidTransactionsDuringCommit: false
        # implicitCollectionDisseminationPolicy spécifie la politique de dissémination pour la collection implicite propre au pair.
        # Lorsqu'un pair approuve une proposition qui écrit dans sa propre collection implicite, les valeurs ci-dessous remplacent les valeurs par défaut
        # pour la dissémination des données privées.
        # Notez que cela s'applique à tous les canaux auxquels le pair a rejoint. L'implication est que requiredPeerCount doit
        # être inférieur au nombre de pairs dans un canal qui a le plus petit nombre de pairs de l'organisation.
        implicitCollectionDisseminationPolicy:
           # requiredPeerCount définit le nombre minimum de pairs éligibles auxquels le pair doit réussir
           # à disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 0.
           requiredPeerCount: 0
           # maxPeerCount définit le nombre maximum de pairs éligibles auxquels le pair tentera de
           # disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 1.
           maxPeerCount: 1

    # Configuration liée au transfert d'état de la diffusion
    state:
        # indique si le transfert d'état est activé ou non
        # la valeur par défaut est false, c'est-à-dire que le transfert d'état est actif
        # et veille à synchroniser les blocs manquants permettant
        # au pair en retard de rattraper la vitesse du reste du réseau.
        # Gardez à l'esprit que lorsque peer.gossip.useLeaderElection est vrai
        # et qu'il y a plusieurs pairs dans l'organisation,
        # ou peer.gossip.useLeaderElection est faux ainsi que
        # peer.gossip.orgleader étant faux, le registre du pair peut être en retard
        # par rapport aux autres pairs et ne rattrapera jamais le rythme en raison du transfert d'état
        # étant désactivé.
        enabled: false
        # checkInterval intervalle pour vérifier si le pair est suffisamment en retard pour
        # demander des blocs via le transfert d'état d'un autre pair.
        checkInterval: 10s
        # responseTimeout durée d'attente pour la réponse de transfert d'état de
        # autres pairs
        responseTimeout: 3s
        # batchSize le nombre de blocs à demander via le transfert d'état d'un autre pair
        batchSize: 10
        # blockBufferSize reflète la taille du tampon de réordonnancement
        # qui capture les blocs et veille à les livrer dans l'ordre
        # vers la couche de registre. La taille réelle du tampon est bornée entre
        # 0 et 2*blockBufferSize, chaque canal maintient son propre tampon
        blockBufferSize: 20
        # maxRetries nombre maximum de nouvelles tentatives pour demander
        # une seule requête de transfert d'état
        maxRetries: 3

# Paramètres TLS
tls:
    # Exiger le TLS côté serveur
    enabled:  true
    # Exiger les certificats clients / TLS mutuel pour les connexions entrantes.
    # Notez que les clients qui ne sont pas configurés pour utiliser un certificat
    # échoueront à se connecter au pair.
    clientAuthRequired: false
    # Certificat X.509 utilisé pour le serveur TLS
    cert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/tls/server.crt
    # Clé privée utilisée pour le serveur TLS
    key:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/tls/server.key
    # rootcert.file représente la chaîne de certificats racines de confiance utilisée pour vérifier les certificats
    # des autres nœuds lors des connexions sortantes.
    # Il n'est pas nécessaire de le définir, mais il peut être utilisé pour compléter l'ensemble des certificats TLS CA
    # disponibles à partir des MSP de chaque configuration de canal.
    rootcert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/tls/ca.crt
    # Si le TLS mutuel est activé, clientRootCAs.files contient une liste de certificats racines supplémentaires
    # utilisés pour vérifier les certificats des connexions clients.
    # Il complète l'ensemble des certificats TLS CA disponibles à partir des MSP de chaque configuration de canal.
    # Au minimum, définissez le certificat racine TLS CA de votre organisation afin que le pair puisse recevoir les demandes de jonction de canal.
    clientRootCAs:
        files:
          - /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/tls/ca.crt
    # Clé privée utilisée pour TLS lors des connexions clientes.
    # Si non définie, peer.tls.key.file sera utilisé à la place
    clientKey:
        file:
    # Certificat X.509 utilisé pour TLS lors des connexions clientes.
    # Si non défini, peer.tls.cert.file sera utilisé à la place
    clientCert:
        file:

# Authentication contient les paramètres de configuration liés à l'authentification
# des messages clients
authentication:
    # la différence acceptable entre l'heure actuelle du serveur et l'
    # heure du client comme spécifiée dans un message de demande client
    timewindow: 15m

# Chemin sur le système de fichiers où le pair stockera les données (par exemple registre). Cet
# emplacement doit être protégé par un contrôle d'accès pour empêcher toute modification
# non intentionnelle qui pourrait corrompre les opérations du pair.
fileSystemPath: /var/hyperledger/production/org1-peer1

# BCCSP (fournisseur cryptographique Blockchain) : Sélectionnez quelle implémentation ou
# bibliothèque cryptographique utiliser
BCCSP:
    Default: SW
    # Paramètres pour le fournisseur cryptographique SW (c'est-à-dire lorsque DEFAULT : SW)
    SW:
        # TODO : Le hachage et le niveau de sécurité par défaut nécessitent une refactorisation pour être
        # entièrement configurable. Changer ces valeurs par défaut nécessite une coordination
        # SHA2 est codé en dur à plusieurs endroits, pas seulement dans BCCSP
        Hash: SHA2
        Security: 256
        # Emplacement du magasin de clés
        FileKeyStore:
            # Si "", la valeur par défaut est 'mspConfigPath'/keystore
            KeyStore:
    # Paramètres pour le fournisseur cryptographique PKCS#11 (c'est-à-dire lorsque DEFAULT : PKCS11)
    PKCS11:
        # Emplacement de la bibliothèque de module PKCS11
        Library:
        # Étiquette du jeton
        Label:
        # Code PIN utilisateur
        Pin:
        Hash:
        Security:

# Chemin sur le système de fichiers où le pair trouvera les configurations MSP locales
mspConfigPath: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/msp

# Identificateur du MSP local
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# Les déploiements doivent changer la valeur de la chaîne localMspId.
# En particulier, le nom de l'ID MSP local d'un pair doit
# correspondre au nom de l'un des MSPs de chaque canal
# auquel ce pair appartient. Sinon, les messages de ce pair
# ne seront pas identifiés comme valides par les autres nœuds.
localMspId: Org1MSP

# Options de configuration client CLI communes
client:
    # délai de connexion
    connTimeout: 3s

# Configuration liée au service de livraison
deliveryclient:
    # Active ce pair pour diffuser les blocs qu'il a extraits du service d'ordonnancement
    # via la diffusion.
    # Notez que 'gossip.state.enabled' contrôle la réplication de blocs point à point
    # des blocs validés dans le passé.
    blockGossipEnabled: true
    # Définit le temps total que le service de livraison peut passer dans les tentatives de
    # reconnexion jusqu'à ce que sa logique de nouvelle tentative abandonne et renvoie une erreur
    reconnectTotalTimeThreshold: 3600s

    # Définit le délai de connexion du service de livraison <-> service d'ordonnancement
    connTimeout: 3s

    # Définit le délai maximal du service de livraison entre les nouvelles tentatives consécutives
    reConnectBackoffThreshold: 3600s

    # Une liste d'adresses de points de terminaison de service d'ordonnancement qui devraient être remplacées
    # lorsqu'elles sont trouvées dans les configurations de canal.
    addressOverrides:
    #  - from:
    #    to:
    #    caCertsFile:
    #  - from:
    #    to:
    #    caCertsFile:

# Type pour le MSP local - par défaut c'est de type bccsp
localMspType: bccsp

# Utilisé avec les outils de profilage Go uniquement dans un environnement non de production. Dans
# la production, il devrait être désactivé (par exemple enabled : false)
profile:
    enabled:     false
    listenAddress: 0.0.0.0:6060

# Handlers définit des gestionnaires personnalisés qui peuvent filtrer et modifier
# les objets passant dans le pair, tels que :
#   Filtre d'authentification - rejeter ou transmettre les propositions des clients
#   Décorateurs - ajouter ou modifier l'entrée chaincode transmise au chaincode
#   Appuis - Signature personnalisée sur la charge utile de réponse de proposition et sa modification
# Une définition de gestionnaire valide contient :
#   - Un nom qui est un nom de méthode de fabrique défini dans
#     core/handlers/library/library.go pour les gestionnaires compilés statiquement
#   - chemin de bibliothèque vers le binaire objet partagé pour les filtres branchables
# Les filtres d'authentification et les décorateurs sont chaînés et exécutés dans l'ordre
# où ils sont définis. Par exemple :
# authFilters:
#   -
#     name: FilterOne
#     library: /opt/lib/filter.so
#   -
#     name: FilterTwo
# decorators:
#   -
#     name: DecoratorOne
#   -
#     name: DecoratorTwo
#     library: /opt/lib/decorator.so
# Les appuis sont configurés en tant que carte dont les clés sont les chaincodes système d'appui qui sont remplacés.
# Ci-dessous un exemple qui remplace l'ESCC par défaut et utilise un plugin d'appui qui a la même fonctionnalité
# que l'ESCC par défaut.
# Si la propriété 'library' est absente, le nom est utilisé comme méthode de constructeur dans la bibliothèque intégrée similaire
# aux filtres d'authentification et aux décorateurs.
# endorsers:
#   escc:
#     name: DefaultESCC
#     library: /etc/hyperledger/fabric/plugin/escc.so
handlers:
    authFilters:
      -
        name: DefaultAuth
      -
        name: ExpirationCheck    # Ce filtre vérifie l'expiration du certificat x509 d'identité
    decorators:
      -
        name: DefaultDecorator
    endorsers:
      escc:
        name: DefaultEndorsement
        library:
    validators:
      vscc:
        name: DefaultValidation
        library:

#    library: /etc/hyperledger/fabric/plugin/escc.so
# Nombre de goroutines qui exécuteront la validation des transactions en parallèle.
# Par défaut, le pair choisit le nombre de processeurs de la machine. Définissez cette
# variable pour remplacer ce choix.
# NOTE : remplacer cette valeur pourrait négativement influencer les performances du
# pair donc veuillez changer cette valeur uniquement si vous savez ce que vous faites
validatorPoolSize:

# Le service de découverte est utilisé par les clients pour interroger des informations sur les pairs,
# telles que - quels pairs ont rejoint un certain canal, quelle est la dernière
# configuration du canal, et surtout - étant donné un chaincode et un canal,
# quels ensembles possibles de pairs satisfont la politique d'appui.
discovery:
    enabled: true
    # Si le cache d'authentification est activé ou non.
    authCacheEnabled: true
    # La taille maximale du cache, après quoi un nettoyage a lieu
    authCacheMaxSize: 1000
    # La proportion (0 à 1) des entrées qui restent dans le cache après que le cache soit nettoyé en raison d'une surpopulation
    authCachePurgeRetentionRatio: 0.75
    # Si l'on autorise les non-administrateurs à effectuer des requêtes hors périmètre de canal.
    # Lorsque c'est faux, cela signifie que seuls les administrateurs de pair peuvent effectuer des requêtes hors périmètre de canal.
    orgMembersAllowedAccess: false

# Limits est utilisé pour configurer certaines limites de ressources internes.
limits:
    # Concurrency limite le nombre de requêtes simultanément en cours d'exécution vers un service sur chaque pair.
    # Actuellement cette option est appliquée uniquement au service d'appui et au service de livraison.
    # Lorsque la propriété est absente ou que la valeur est 0, la limite de concurrence est désactivée pour le service.
    concurrency:
        # endorserService limite les requêtes simultanées vers le service d'appui qui gère le déploiement, la requête et l'invocation de chaincode,
        # y compris les chaincodes utilisateur et les chaincodes système.
        endorserService: 2500
        # deliverService limite les auditeurs d'événements simultanés enregistrés auprès du service de livraison pour les événements de blocs et de transactions.
        deliverService: 2500
        # gatewayService limite les requêtes simultanées vers le service de passerelle qui gère la soumission et l'évaluation des transactions.
        gatewayService: 500

# Puisque tous les nœuds devraient être cohérents, il est recommandé de conserver
# la valeur par défaut de 100 Mo pour MaxRecvMsgSize & MaxSendMsgSize
# Taille maximale du message en octets que le serveur et le client GRPC peuvent recevoir
maxRecvMsgSize: 104857600
# Taille maximale du message en octets que le serveur et le client GRPC peuvent envoyer
maxSendMsgSize: 104857600

###############################################################################

Section VM

############################################################################### vm:

# Point de terminaison du système de gestion vm. Pour docker peut être l'un des suivants en général
# unix:///var/run/docker.sock
# http://localhost:2375
# https://localhost:2376
# Si vous utilisez des constructeurs de chaincode externes et que vous n'avez pas besoin du constructeur de chaincode Docker par défaut,
# le point de terminaison devrait ne pas être configuré afin que le vérificateur de santé Docker du pair ne soit pas enregistré.
endpoint: unix:///var/run/docker.sock

# paramètres pour les vms docker
docker:
    tls:
        enabled: false
        ca:
            file: docker/ca.crt
        cert:
            file: docker/tls.crt
        key:
            file: docker/tls.key

    # Active/désactive la sortie standard/erreur des conteneurs chaincode pour
    # des fins de débogage
    attachStdout: false

    # Paramètres lors de la création du conteneur docker.
    # Le conteneur peut être créé efficacement en utilisant ipam & dns-server pour le cluster
    # NetworkMode - définit le mode réseau pour le conteneur. Les
    # valeurs standard prises en charge sont : `host`(par défaut),`bridge`,`ipvlan`,`none`.
    # Dns - une liste de serveurs DNS pour que le conteneur les utilise.
    # Note : Les propriétés `Privileged` `Binds` `Links` et `PortBindings` de
    # la configuration hôte Docker ne sont pas prises en charge et ne seront pas utilisées si définies.
    # LogConfig - définit le pilote de journalisation (Type) et les options
    # (Config) pour Docker. Pour plus d'informations,
    # https://docs.docker.com/engine/admin/logging/overview/
    # Note : Définir LogConfig en utilisant des variables d'environnement n'est pas pris en charge.
    hostConfig:
        NetworkMode: host
        Dns:
           # - 192.168.0.1
        LogConfig:
            Type: json-file
            Config:
                max-size: "50m"
                max-file: "5"
        Memory: 2147483648

###############################################################################

Section Chaincode

############################################################################### chaincode:

# L'id est utilisé par le stub de chaincode pour enregistrer le chaincode en cours d'exécution
# ID avec le pair et est généralement fourni via des variables ENV
# la forme `path` de l'ID est fournie lors de l'installation du chaincode.
# Le `name` est utilisé pour toutes les autres requêtes et peut être n'importe quelle chaîne.
id:
    path:
    name:

# Environnement de construction générique, adapté à la plupart des types de chaincode
builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION)

# Active/désactive le téléchargement forcé des images docker de base (répertoriées ci-dessous)
# lors de l'instanciation du chaincode utilisateur.
# Utile lors de l'utilisation de balises d'image mobiles (telles que :latest)
pull: false

golang:
    # golang n'aura jamais besoin de plus que baseos
    runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION)

    # si oui ou non le chaincode golang doit être lié dynamiquement
    dynamicLink: false

java:
    # C'est une image basée sur java:openjdk-8 avec des outils de compilation
    # supplémentaires ajoutés pour l'emballage de la couche shim java.
    # Cette image est emballée avec les bibliothèques de couche shim nécessaires
    # pour l'exécution du chaincode Java.
    runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION)

node:
    # C'est une image basée sur node:$(NODE_VER)-alpine
    runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION)

# Liste des répertoires à traiter comme des constructeurs et lanceurs externes pour
# chaincode. Le traitement de détection de constructeur externe itérera sur les
# constructeurs dans l'ordre spécifié ci-dessous.
# Si vous n'avez pas besoin de revenir au constructeur Docker par défaut, désactivez également vm.endpoint ci-dessus.
# Pour remplacer cette propriété via une variable d'environnement, utilisez CORE_CHAINCODE_EXTERNALBUILDERS: [{name: x, path: dir1}, {name: y, path: dir2}]
externalBuilders:
   - name: ccaas_builder
     path: /opt/hyperledger/ccaas_builder
     propagateEnvironment:
       - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG


# La durée maximale d'attente pour que le processus de construction et d'installation du chaincode
# soit terminé.
installTimeout: 300s

# Durée d'attente pour le démarrage d'un conteneur et l'attente de Register
# à traverser.
startuptimeout: 300s

# Durée d'attente pour les appels Invoke et Init pour éviter les problèmes.
# Ce délai d'attente est utilisé par tous les chaincodes dans tous les canaux, y compris
# les chaincodes système.
# Notez que pendant Invoke, si l'image n'est pas disponible (par exemple en train d'être
# nettoyée dans un environnement de développement), le pair construira automatiquement
# l'image, ce qui pourrait prendre plus de temps. Dans un environnement de production,
# l'image du chaincode est peu susceptible d'être supprimée, donc le délai d'attente pourrait être
# réduit en conséquence.
executetimeout: 30s

# Il y a 2 modes : "dev" et "net".
# En mode dev, l'utilisateur exécute le chaincode après avoir démarré le pair à partir de
# ligne de commande sur la machine locale.
# En mode net, le pair exécutera le chaincode dans un conteneur docker.
mode: net

# maintien de connexion en secondes. Dans les situations où la communication passe par un
# proxy qui ne prend pas en charge le maintien de connexion, ce paramètre maintiendra la connexion
# entre le pair et le chaincode.
# Une valeur <= 0 désactive le maintien de connexion
keepalive: 0

# chaincodes système activés
system:
    _lifecycle: enable
    cscc: enable
    lscc: enable
    qscc: enable

# Section de journalisation pour le conteneur chaincode
logging:
  # Niveau par défaut pour tous les journaux dans le conteneur chaincode
  level:  info
  # Remplacer le niveau par défaut pour le journal 'shim'
  shim:   warning
  # Format pour les journaux du conteneur chaincode
  format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

###############################################################################

Section Registre - la configuration du registre englobe à la fois la blockchain

et l'état

############################################################################### ledger:

blockchain:

state: # stateDatabase - les options sont "goleveldb", "CouchDB" # goleveldb - base de données d'état par défaut stockée dans goleveldb. # CouchDB - stocker la base de données d'état dans CouchDB stateDatabase: goleveldb # Limite sur le nombre d'enregistrements à retourner par requête totalQueryLimit: 100000 couchDBConfig: # Il est recommandé d'exécuter CouchDB sur le même serveur que le pair, et # de ne pas mapper le port conteneur CouchDB vers un port serveur dans docker-compose. # Sinon une sécurité appropriée doit être fournie sur la connexion entre # le client CouchDB (sur le pair) et le serveur. couchDBAddress: 127.0.0.1:5984 # Cet utilisateur doit avoir les autorités de lecture et d'écriture sur CouchDB username: # Le mot de passe est recommandé d'être transmis comme variable d'environnement # lors du démarrage (par exemple CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD). # S'il est stocké ici, le fichier doit être protégé par un contrôle d'accès # pour empêcher des utilisateurs non intentionnels de découvrir le mot de passe. password: # Nombre de nouvelles tentatives pour les erreurs CouchDB maxRetries: 3 # Nombre de nouvelles tentatives pour les erreurs CouchDB pendant le démarrage du pair. # Le délai entre les tentatives double à chaque tentative. # La valeur par défaut de 10 tentatives donne 11 tentatives sur 2 minutes. maxRetriesOnStartup: 10 # Délai de requête CouchDB (unité : durée, par exemple 20s) requestTimeout: 35s # Limite sur le nombre d'enregistrements par chaque requête CouchDB # Notez que les requêtes chaincode sont uniquement limitées par totalQueryLimit. # En interne le chaincode peut exécuter plusieurs requêtes CouchDB, # chacune de taille internalQueryLimit. internalQueryLimit: 1000 # Limite sur le nombre d'enregistrements par lot de mise à jour CouchDB maxBatchUpdateSize: 1000 # Créer la base de données système _global_changes # C'est facultatif. Créer la base de données de changements globaux nécessitera # des ressources système supplémentaires pour suivre les changements et maintenir la base de données createGlobalChangesDB: false # CacheSize indique le nombre maximum de mégaoctets (Mo) à allouer pour le cache d'état # en mémoire. Notez que CacheSize doit être un multiple de 32 Mo. S'il n'est pas un multiple # de 32 Mo, le pair arrondira la taille au multiple de 32 Mo suivant. # Pour désactiver le cache, 0 Mo doivent être affectés à cacheSize. cacheSize: 64

history: # enableHistoryDatabase - les options sont true ou false # Indique si l'historique des mises à jour de clés doit être stocké. # Tous les index d'historique seront stockés dans goleveldb, quelle que soit l'utilisation # de CouchDB ou d'une base de données alternative pour l'état. enableHistoryDatabase: true

pvtdataStore: # la taille maximale du lot de base de données pour convertir # les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcMaxDbBatchSize: 5000 # la durée minimale (en millisecondes) entre l'écriture # de deux lots de base de données consécutifs pour convertir les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcDbBatchesInterval: 1000 # Les entrées de données manquantes sont classées en deux catégories : # (1) priorisées # (2) dépriorisées # Initialement, toutes les données manquantes sont dans la liste priorisée. Quand le # réconciliateur est incapable de récupérer les données manquantes auprès d'autres pairs, # les données manquantes non réconciliées seraient déplacées vers la liste dépriorisée. # Le réconciliateur réessaiera les données manquantes dépriorisées après chaque # deprioritizedDataReconcilerInterval (unité : minutes). Notez que l' # intervalle doit être supérieur à reconcileSleepInterval deprioritizedDataReconcilerInterval: 60m

snapshots: # Chemin sur le système de fichiers où le pair stockera les instantanés du registre rootDir: /var/hyperledger/production/snapshots/org1-peer1

###############################################################################

Section Opérations

############################################################################### operations: # hôte et port pour le serveur d'opérations listenAddress: 127.0.0.1:9447

# Configuration TLS pour le point de terminaison des opérations
tls:
    # TLS activé
    enabled: false

    # chemin vers le certificat de serveur PEM encodé pour le serveur d'opérations
    cert:
        file:

    # chemin vers la clé de serveur PEM encodée pour le serveur d'opérations
    key:
        file:

    # la plupart des points de terminaison de service d'opérations exigent l'authentification client lorsque TLS
    # est activé. clientAuthRequired exige l'authentification par certificat client
    # au niveau TLS pour accéder à toutes les ressources.
    clientAuthRequired: false

    # chemins vers les certificats CA PEM encodés à faire confiance pour l'authentification client
    clientRootCAs:
        files: []

###############################################################################

Section Métriques

############################################################################### metrics: # le fournisseur de métriques est l'un de statsd, prometheus, ou désactivé provider: disabled

# configuration statsd
statsd:
    # type de réseau : tcp ou udp
    network: udp

    # adresse du serveur statsd
    address: 127.0.0.1:8126

    # l'intervalle auquel les compteurs et jauges mis en cache localement sont poussés
    # vers statsd ; les temporisations sont poussées immédiatement
    writeInterval: 10s

    # le préfixe est ajouté à toutes les métriques statsd émises
    prefix:

Démarrer le nœud org1-peer1 : ```
nohup ./peer node start > org1-peer1.log 2>&1 &

Déploiement du nœud org2-peer0

Éditer le fichier core.yaml : ```

Copyright IBM Corp. Tous droits réservés.

SPDX-License-Identifier: Apache-2.0

###############################################################################

Section Pair

############################################################################### peer:

# L'identifiant pair fournit un nom pour cette instance pair et est utilisé lors
# du nommage des ressources docker.
id: peer0.org2.example.com

# Le networkId permet une séparation logique des réseaux et est utilisé lors
# du nommage des ressources docker.
networkId: dev

# L'adresse de l'interface réseau locale sur laquelle ce pair écoutera.
# Par défaut, il écoutera sur toutes les interfaces réseau
listenAddress: 192.168.1.66:9051

# Le point de terminaison que ce pair utilise pour écouter les connexions chaincode entrantes.
# Si ceci est commenté, l'adresse d'écoute est sélectionnée pour être
# l'adresse du pair (voir ci-dessous) avec le port 7052
chaincodeListenAddress: 192.168.1.66:7055

# Le point de terminaison que le chaincode pour ce pair utilise pour se connecter au pair.
# Si ce n'est pas spécifié, l'adresse chaincodeListenAddress est sélectionnée.
# Et si chaincodeListenAddress n'est pas spécifié, l'adresse est sélectionnée à partir de
# l'adresse pair (voir ci-dessous). Si l'adresse pair spécifiée est invalide alors elle
# reviendra à l'IP détectée automatiquement (IP locale) quelle que soit la valeur de
# addressAutoDetect du pair.
chaincodeAddress: 192.168.1.66:7055

# Lorsqu'utilisé comme configuration pair, cela représente le point de terminaison vers d'autres pairs
# dans la même organisation. Pour les pairs dans d'autres organisations, voir
# gossip.externalEndpoint pour plus d'informations.
# Lorsqu'utilisé comme configuration CLI, cela signifie le point de terminaison pair pour interagir avec
address: 192.168.1.66:9051

# Si le pair doit déterminer programmatiquement son adresse
# Ce cas est utile pour les conteneurs docker.
# Lorsqu'il est défini sur true, cela remplacera l'adresse pair.
addressAutoDetect: false

# Paramètres pour le serveur passerelle du pair.
gateway:
    # Si la passerelle est activée pour ce pair.
    enabled: true
    # endorsementTimeout est la durée pendant laquelle la passerelle attend une réponse
    # des autres pairs approuvant avant de retourner une erreur de délai d'attente au client.
    endorsementTimeout: 30s
    # dialTimeout est la durée pendant laquelle la passerelle attend une connexion
    # aux autres nœuds du réseau.
    dialTimeout: 2m


# Paramètres de maintien de connexion pour le serveur pair et les clients
keepalive:
    # L'intervalle est la durée après laquelle si le serveur ne voit
    # aucune activité du client, il envoie un ping au client pour voir s'il est vivant
    interval: 7200s
    # Le délai d'expiration est la durée pendant laquelle le serveur attend une réponse
    # du client après avoir envoyé un ping avant de fermer la connexion
    timeout: 20s
    # MinInterval est le temps minimum autorisé entre les pings clients.
    # Si les clients envoient des pings plus fréquemment, le serveur pair
    # les déconnectera
    minInterval: 60s
    # Paramètres de maintien de connexion client pour communiquer avec d'autres nœuds pairs
    client:
        # L'intervalle est le temps entre les pings vers les nœuds pairs. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds pairs
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds pairs avant de fermer la connexion
        timeout: 20s
    # Paramètres de maintien de connexion DeliveryClient pour la communication avec les nœuds
    # d'ordonnancement.
    deliveryClient:
        # L'intervalle est le temps entre les pings vers les nœuds d'ordonnancement. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds d'ordonnancement.
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds d'ordonnancement avant de fermer la connexion
        timeout: 20s


# Configuration liée à la diffusion
gossip:
    # Ensemble d'amorçage pour initialiser la diffusion avec.
    # C'est une liste d'autres pairs que ce pair contacte au démarrage.
    # Important : Les points de terminaison ici doivent être des points de terminaison de pairs dans la même
    # organisation, car le pair refuserait de se connecter à ces points de terminaison
    # sauf s'ils sont dans la même organisation que le pair.
    bootstrap: 192.168.1.66:9051

    # NOTE : orgLeader et useLeaderElection sont mutuellement exclusifs.
    # Les définir tous deux à true entraînerait l'arrêt du pair
    # puisque c'est un état indéfini. Si les pairs sont configurés avec
    # useLeaderElection=false, assurez-vous qu'il y a au moins 1 pair dans l'
    # organisation dont orgLeader est défini sur true.

    # Définit si le pair initialisera un algorithme dynamique pour
    # la sélection du "leader", où le leader est le pair qui établit
    # la connexion avec le service d'ordonnancement et utilise le protocole
    # de livraison pour extraire les blocs de registre du service d'ordonnancement.
    useLeaderElection: false
    # Définit statiquement le pair comme "leader" d'une organisation,
    # ce qui signifie que le pair actuel maintiendra la connexion
    # avec le service d'ordonnancement et diffusera les blocs entre les pairs de
    # sa propre organisation. Plusieurs pairs ou tous les pairs d'une organisation
    # peuvent être configurés comme leaders d'organisation, afin qu'ils puissent tous
    # extraire directement les blocs du service d'ordonnancement.
    orgLeader: true

    # Intervalle pour les interrogations du traqueur d'appartenance
    membershipTrackerInterval: 5s

    # Remplace le point de terminaison que le pair publie aux pairs
    # dans son organisation. Pour les pairs dans des organisations étrangères
    # voir 'externalEndpoint'
    endpoint:
    # Nombre maximum de blocs stockés en mémoire
    maxBlockCountToStore: 10
    # Temps maximum entre les poussées de messages consécutives (unité : milliseconde)
    maxPropagationBurstLatency: 10ms
    # Nombre maximum de messages stockés jusqu'à ce qu'un poussage soit déclenché vers les pairs distants
    maxPropagationBurstSize: 10
    # Nombre de fois qu'un message est poussé vers les pairs distants
    propagateIterations: 1
    # Nombre de pairs sélectionnés vers lesquels pousser les messages
    propagatePeerNum: 3
    # Détermine la fréquence des phases de tirage (unité : seconde)
    # Doit être supérieur à digestWaitTime + responseWaitTime
    pullInterval: 4s
    # Nombre de pairs à partir desquels effectuer le tirage
    pullPeerNum: 3
    # Détermine la fréquence de tirage des messages d'information d'état provenant des pairs (unité : seconde)
    requestStateInfoInterval: 4s
    # Détermine la fréquence de poussage des messages d'information d'état vers les pairs (unité : seconde)
    publishStateInfoInterval: 4s
    # Temps maximum pendant lequel un message d'information d'état est conservé avant expiration
    stateInfoRetentionInterval:
    # Temps à partir duquel les certificats sont inclus dans les messages Alive (unité : seconde)
    publishCertPeriod: 10s
    # Devons-nous ignorer la vérification des messages de bloc ou non (actuellement non utilisé)
    skipBlockVerification: false
    # Délai de connexion (unité : seconde)
    dialTimeout: 3s
    # Délai de connexion (unité : seconde)
    connTimeout: 2s
    # Taille du tampon des messages reçus
    recvBuffSize: 20
    # Taille du tampon des messages envoyés
    sendBuffSize: 200
    # Temps d'attente avant que le moteur de tirage traite les résumés entrants (unité : seconde)
    # Devrait être légèrement inférieur à requestWaitTime
    digestWaitTime: 1s
    # Temps d'attente avant que le moteur de tirage supprime le nonce entrant (unité : millisecondes)
    # Devrait être légèrement supérieur à digestWaitTime
    requestWaitTime: 1500ms
    # Temps d'attente avant que le moteur de tirage termine le tirage (unité : seconde)
    responseWaitTime: 2s
    # Intervalle de vérification de vie (unité : seconde)
    aliveTimeInterval: 5s
    # Délai d'expiration de vie (unité : seconde)
    aliveExpirationTimeout: 25s
    # Intervalle de reconnexion (unité : seconde)
    reconnectInterval: 25s
    # Nombre maximum de tentatives de connexion à un pair
    maxConnectionAttempts: 120
    # Facteur d'expiration des messages pour les messages de vie
    msgExpirationFactor: 20
    # Ceci est un point de terminaison publié aux pairs en dehors de l'organisation.
    # Si ce n'est pas défini, le pair ne sera pas connu des autres organisations.
    externalEndpoint:
    # Configuration du service d'élection de leader
    election:
        # Temps le plus long que le pair attend pour une appartenance stable pendant le démarrage de l'élection de leader (unité : seconde)
        startupGracePeriod: 15s
        # Intervalle des échantillons d'appartenance de diffusion pour vérifier sa stabilité (unité : seconde)
        membershipSampleInterval: 1s
        # Temps écoulé depuis le dernier message de déclaration avant que le pair décide d'effectuer l'élection de leader (unité : seconde)
        leaderAliveThreshold: 10s
        # Temps entre l'envoi du message de proposition par le pair et sa déclaration comme leader (envoi du message de déclaration) (unité : seconde)
        leaderElectionDuration: 5s

    pvtData:
        # pullRetryThreshold détermine la durée maximale pendant laquelle les données privées correspondant à un bloc donné
        # seront tentées d'être extraites des pairs jusqu'à ce que le bloc soit validé sans les données privées
        pullRetryThreshold: 60s
        # Lorsque les données privées entrent dans le magasin temporaire, elles sont associées à la hauteur du registre du pair à ce moment-là.
        # transientstoreMaxBlockRetention définit la différence maximale entre la hauteur actuelle du registre lors de la validation,
        # et les données privées résidant dans le magasin temporaire qui sont garanties de ne pas être purgées.
        # Les données privées sont purgées du magasin temporaire lorsque des blocs avec des séquences qui sont des multiples
        # de transientstoreMaxBlockRetention sont validés.
        transientstoreMaxBlockRetention: 1000
        # pushAckTimeout est le temps maximum d'attente pour une reconnaissance de chaque pair
        # lors de la poussée des données privées au moment de l'appui.
        pushAckTimeout: 3s
        # Marge de tirage Block to live, utilisée comme tampon
        # pour empêcher le pair d'essayer de tirer les données privées
        # des pairs qui seront bientôt purgées dans les N prochains blocs.
        # Cela aide un pair nouvellement joint à rattraper plus rapidement
        # la hauteur actuelle de la blockchain.
        btlPullMargin: 10
        # le processus de réconciliation est effectué dans une boucle infinie, tandis que dans chaque itération le réconciliateur essaie de
        # tirer des autres pairs les blocs manquants les plus récents avec une limitation de taille de lot maximale.
        # reconcileBatchSize détermine la taille de lot maximale des données privées manquantes qui seront réconciliées dans une
        # seule itération.
        reconcileBatchSize: 10
        # reconcileSleepInterval détermine le temps que le réconciliateur dort de la fin d'une itération jusqu'au début
        # de la prochaine itération de réconciliation.
        reconcileSleepInterval: 1m
        # reconciliationEnabled est un indicateur qui indique si la réconciliation des données privées est activée ou non.
        reconciliationEnabled: true
        # skipPullingInvalidTransactionsDuringCommit est un indicateur qui indique si le tirage des données privées
        # des transactions invalides provenant d'autres pairs doit être ignoré pendant le temps de validation et tiré
        # uniquement via le réconciliateur.
        skipPullingInvalidTransactionsDuringCommit: false
        # implicitCollectionDisseminationPolicy spécifie la politique de dissémination pour la collection implicite propre au pair.
        # Lorsqu'un pair approuve une proposition qui écrit dans sa propre collection implicite, les valeurs ci-dessous remplacent les valeurs par défaut
        # pour la dissémination des données privées.
        # Notez que cela s'applique à tous les canaux auxquels le pair a rejoint. L'implication est que requiredPeerCount doit
        # être inférieur au nombre de pairs dans un canal qui a le plus petit nombre de pairs de l'organisation.
        implicitCollectionDisseminationPolicy:
           # requiredPeerCount définit le nombre minimum de pairs éligibles auxquels le pair doit réussir
           # à disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 0.
           requiredPeerCount: 0
           # maxPeerCount définit le nombre maximum de pairs éligibles auxquels le pair tentera de
           # disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 1.
           maxPeerCount: 1

    # Configuration liée au transfert d'état de la diffusion
    state:
        # indique si le transfert d'état est activé ou non
        # la valeur par défaut est false, c'est-à-dire que le transfert d'état est actif
        # et veille à synchroniser les blocs manquants permettant
        # au pair en retard de rattraper la vitesse du reste du réseau.
        # Gardez à l'esprit que lorsque peer.gossip.useLeaderElection est vrai
        # et qu'il y a plusieurs pairs dans l'organisation,
        # ou peer.gossip.useLeaderElection est faux ainsi que
        # peer.gossip.orgleader étant faux, le registre du pair peut être en retard
        # par rapport aux autres pairs et ne rattrapera jamais le rythme en raison du transfert d'état
        # étant désactivé.
        enabled: false
        # checkInterval intervalle pour vérifier si le pair est suffisamment en retard pour
        # demander des blocs via le transfert d'état d'un autre pair.
        checkInterval: 10s
        # responseTimeout durée d'attente pour la réponse de transfert d'état de
        # autres pairs
        responseTimeout: 3s
        # batchSize le nombre de blocs à demander via le transfert d'état d'un autre pair
        batchSize: 10
        # blockBufferSize reflète la taille du tampon de réordonnancement
        # qui capture les blocs et veille à les livrer dans l'ordre
        # vers la couche de registre. La taille réelle du tampon est bornée entre
        # 0 et 2*blockBufferSize, chaque canal maintient son propre tampon
        blockBufferSize: 20
        # maxRetries nombre maximum de nouvelles tentatives pour demander
        # une seule requête de transfert d'état
        maxRetries: 3

# Paramètres TLS
tls:
    # Exiger le TLS côté serveur
    enabled:  true
    # Exiger les certificats clients / TLS mutuel pour les connexions entrantes.
    # Notez que les clients qui ne sont pas configurés pour utiliser un certificat
    # échoueront à se connecter au pair.
    clientAuthRequired: false
    # Certificat X.509 utilisé pour le serveur TLS
    cert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/tls/server.crt
    # Clé privée utilisée pour le serveur TLS
    key:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/tls/server.key
    # rootcert.file représente la chaîne de certificats racines de confiance utilisée pour vérifier les certificats
    # des autres nœuds lors des connexions sortantes.
    # Il n'est pas nécessaire de le définir, mais il peut être utilisé pour compléter l'ensemble des certificats TLS CA
    # disponibles à partir des MSP de chaque configuration de canal.
    rootcert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/tls/ca.crt
    # Si le TLS mutuel est activé, clientRootCAs.files contient une liste de certificats racines supplémentaires
    # utilisés pour vérifier les certificats des connexions clients.
    # Il complète l'ensemble des certificats TLS CA disponibles à partir des MSP de chaque configuration de canal.
    # Au minimum, définissez le certificat racine TLS CA de votre organisation afin que le pair puisse recevoir les demandes de jonction de canal.
    clientRootCAs:
        files:
          - /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/tls/ca.crt
    # Clé privée utilisée pour TLS lors des connexions clientes.
    # Si non définie, peer.tls.key.file sera utilisé à la place
    clientKey:
        file:
    # Certificat X.509 utilisé pour TLS lors des connexions clientes.
    # Si non défini, peer.tls.cert.file sera utilisé à la place
    clientCert:
        file:

# Authentication contient les paramètres de configuration liés à l'authentification
# des messages clients
authentication:
    # la différence acceptable entre l'heure actuelle du serveur et l'
    # heure du client comme spécifiée dans un message de demande client
    timewindow: 15m

# Chemin sur le système de fichiers où le pair stockera les données (par exemple registre). Cet
# emplacement doit être protégé par un contrôle d'accès pour empêcher toute modification
# non intentionnelle qui pourrait corrompre les opérations du pair.
fileSystemPath: /var/hyperledger/production/org2-peer0

# BCCSP (fournisseur cryptographique Blockchain) : Sélectionnez quelle implémentation ou
# bibliothèque cryptographique utiliser
BCCSP:
    Default: SW
    # Paramètres pour le fournisseur cryptographique SW (c'est-à-dire lorsque DEFAULT : SW)
    SW:
        # TODO : Le hachage et le niveau de sécurité par défaut nécessitent une refactorisation pour être
        # entièrement configurable. Changer ces valeurs par défaut nécessite une coordination
        # SHA2 est codé en dur à plusieurs endroits, pas seulement dans BCCSP
        Hash: SHA2
        Security: 256
        # Emplacement du magasin de clés
        FileKeyStore:
            # Si "", la valeur par défaut est 'mspConfigPath'/keystore
            KeyStore:
    # Paramètres pour le fournisseur cryptographique PKCS#11 (c'est-à-dire lorsque DEFAULT : PKCS11)
    PKCS11:
        # Emplacement de la bibliothèque de module PKCS11
        Library:
        # Étiquette du jeton
        Label:
        # Code PIN utilisateur
        Pin:
        Hash:
        Security:

# Chemin sur le système de fichiers où le pair trouvera les configurations MSP locales
mspConfigPath: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/msp

# Identificateur du MSP local
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# Les déploiements doivent changer la valeur de la chaîne localMspId.
# En particulier, le nom de l'ID MSP local d'un pair doit
# correspondre au nom de l'un des MSPs de chaque canal
# auquel ce pair appartient. Sinon, les messages de ce pair
# ne seront pas identifiés comme valides par les autres nœuds.
localMspId: Org2MSP

# Options de configuration client CLI communes
client:
    # délai de connexion
    connTimeout: 3s

# Configuration liée au service de livraison
deliveryclient:
    # Active ce pair pour diffuser les blocs qu'il a extraits du service d'ordonnancement
    # via la diffusion.
    # Notez que 'gossip.state.enabled' contrôle la réplication de blocs point à point
    # des blocs validés dans le passé.
    blockGossipEnabled: true
    # Définit le temps total que le service de livraison peut passer dans les tentatives de
    # reconnexion jusqu'à ce que sa logique de nouvelle tentative abandonne et renvoie une erreur
    reconnectTotalTimeThreshold: 3600s

    # Définit le délai de connexion du service de livraison <-> service d'ordonnancement
    connTimeout: 3s

    # Définit le délai maximal du service de livraison entre les nouvelles tentatives consécutives
    reConnectBackoffThreshold: 3600s

    # Une liste d'adresses de points de terminaison de service d'ordonnancement qui devraient être remplacées
    # lorsqu'elles sont trouvées dans les configurations de canal.
    addressOverrides:
    #  - from:
    #    to:
    #    caCertsFile:
    #  - from:
    #    to:
    #    caCertsFile:

# Type pour le MSP local - par défaut c'est de type bccsp
localMspType: bccsp

# Utilisé avec les outils de profilage Go uniquement dans un environnement non de production. Dans
# la production, il devrait être désactivé (par exemple enabled : false)
profile:
    enabled:     false
    listenAddress: 0.0.0.0:6060

# Handlers définit des gestionnaires personnalisés qui peuvent filtrer et modifier
# les objets passant dans le pair, tels que :
#   Filtre d'authentification - rejeter ou transmettre les propositions des clients
#   Décorateurs - ajouter ou modifier l'entrée chaincode transmise au chaincode
#   Appuis - Signature personnalisée sur la charge utile de réponse de proposition et sa modification
# Une définition de gestionnaire valide contient :
#   - Un nom qui est un nom de méthode de fabrique défini dans
#     core/handlers/library/library.go pour les gestionnaires compilés statiquement
#   - chemin de bibliothèque vers le binaire objet partagé pour les filtres branchables
# Les filtres d'authentification et les décorateurs sont chaînés et exécutés dans l'ordre
# où ils sont définis. Par exemple :
# authFilters:
#   -
#     name: FilterOne
#     library: /opt/lib/filter.so
#   -
#     name: FilterTwo
# decorators:
#   -
#     name: DecoratorOne
#   -
#     name: DecoratorTwo
#     library: /opt/lib/decorator.so
# Les appuis sont configurés en tant que carte dont les clés sont les chaincodes système d'appui qui sont remplacés.
# Ci-dessous un exemple qui remplace l'ESCC par défaut et utilise un plugin d'appui qui a la même fonctionnalité
# que l'ESCC par défaut.
# Si la propriété 'library' est absente, le nom est utilisé comme méthode de constructeur dans la bibliothèque intégrée similaire
# aux filtres d'authentification et aux décorateurs.
# endorsers:
#   escc:
#     name: DefaultESCC
#     library: /etc/hyperledger/fabric/plugin/escc.so
handlers:
    authFilters:
      -
        name: DefaultAuth
      -
        name: ExpirationCheck    # Ce filtre vérifie l'expiration du certificat x509 d'identité
    decorators:
      -
        name: DefaultDecorator
    endorsers:
      escc:
        name: DefaultEndorsement
        library:
    validators:
      vscc:
        name: DefaultValidation
        library:

#    library: /etc/hyperledger/fabric/plugin/escc.so
# Nombre de goroutines qui exécuteront la validation des transactions en parallèle.
# Par défaut, le pair choisit le nombre de processeurs de la machine. Définissez cette
# variable pour remplacer ce choix.
# NOTE : remplacer cette valeur pourrait négativement influencer les performances du
# pair donc veuillez changer cette valeur uniquement si vous savez ce que vous faites
validatorPoolSize:

# Le service de découverte est utilisé par les clients pour interroger des informations sur les pairs,
# telles que - quels pairs ont rejoint un certain canal, quelle est la dernière
# configuration du canal, et surtout - étant donné un chaincode et un canal,
# quels ensembles possibles de pairs satisfont la politique d'appui.
discovery:
    enabled: true
    # Si le cache d'authentification est activé ou non.
    authCacheEnabled: true
    # La taille maximale du cache, après quoi un nettoyage a lieu
    authCacheMaxSize: 1000
    # La proportion (0 à 1) des entrées qui restent dans le cache après que le cache soit nettoyé en raison d'une surpopulation
    authCachePurgeRetentionRatio: 0.75
    # Si l'on autorise les non-administrateurs à effectuer des requêtes hors périmètre de canal.
    # Lorsque c'est faux, cela signifie que seuls les administrateurs de pair peuvent effectuer des requêtes hors périmètre de canal.
    orgMembersAllowedAccess: false

# Limits est utilisé pour configurer certaines limites de ressources internes.
limits:
    # Concurrency limite le nombre de requêtes simultanément en cours d'exécution vers un service sur chaque pair.
    # Actuellement cette option est appliquée uniquement au service d'appui et au service de livraison.
    # Lorsque la propriété est absente ou que la valeur est 0, la limite de concurrence est désactivée pour le service.
    concurrency:
        # endorserService limite les requêtes simultanées vers le service d'appui qui gère le déploiement, la requête et l'invocation de chaincode,
        # y compris les chaincodes utilisateur et les chaincodes système.
        endorserService: 2500
        # deliverService limite les auditeurs d'événements simultanés enregistrés auprès du service de livraison pour les événements de blocs et de transactions.
        deliverService: 2500
        # gatewayService limite les requêtes simultanées vers le service de passerelle qui gère la soumission et l'évaluation des transactions.
        gatewayService: 500

# Puisque tous les nœuds devraient être cohérents, il est recommandé de conserver
# la valeur par défaut de 100 Mo pour MaxRecvMsgSize & MaxSendMsgSize
# Taille maximale du message en octets que le serveur et le client GRPC peuvent recevoir
maxRecvMsgSize: 104857600
# Taille maximale du message en octets que le serveur et le client GRPC peuvent envoyer
maxSendMsgSize: 104857600

###############################################################################

Section VM

############################################################################### vm:

# Point de terminaison du système de gestion vm. Pour docker peut être l'un des suivants en général
# unix:///var/run/docker.sock
# http://localhost:2375
# https://localhost:2376
# Si vous utilisez des constructeurs de chaincode externes et que vous n'avez pas besoin du constructeur de chaincode Docker par défaut,
# le point de terminaison devrait ne pas être configuré afin que le vérificateur de santé Docker du pair ne soit pas enregistré.
endpoint: unix:///var/run/docker.sock

# paramètres pour les vms docker
docker:
    tls:
        enabled: false
        ca:
            file: docker/ca.crt
        cert:
            file: docker/tls.crt
        key:
            file: docker/tls.key

    # Active/désactive la sortie standard/erreur des conteneurs chaincode pour
    # des fins de débogage
    attachStdout: false

    # Paramètres lors de la création du conteneur docker.
    # Le conteneur peut être créé efficacement en utilisant ipam & dns-server pour le cluster
    # NetworkMode - définit le mode réseau pour le conteneur. Les
    # valeurs standard prises en charge sont : `host`(par défaut),`bridge`,`ipvlan`,`none`.
    # Dns - une liste de serveurs DNS pour que le conteneur les utilise.
    # Note : Les propriétés `Privileged` `Binds` `Links` et `PortBindings` de
    # la configuration hôte Docker ne sont pas prises en charge et ne seront pas utilisées si définies.
    # LogConfig - définit le pilote de journalisation (Type) et les options
    # (Config) pour Docker. Pour plus d'informations,
    # https://docs.docker.com/engine/admin/logging/overview/
    # Note : Définir LogConfig en utilisant des variables d'environnement n'est pas pris en charge.
    hostConfig:
        NetworkMode: host
        Dns:
           # - 192.168.0.1
        LogConfig:
            Type: json-file
            Config:
                max-size: "50m"
                max-file: "5"
        Memory: 2147483648

###############################################################################

Section Chaincode

############################################################################### chaincode:

# L'id est utilisé par le stub de chaincode pour enregistrer le chaincode en cours d'exécution
# ID avec le pair et est généralement fourni via des variables ENV
# la forme `path` de l'ID est fournie lors de l'installation du chaincode.
# Le `name` est utilisé pour toutes les autres requêtes et peut être n'importe quelle chaîne.
id:
    path:
    name:

# Environnement de construction générique, adapté à la plupart des types de chaincode
builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION)

# Active/désactive le téléchargement forcé des images docker de base (répertoriées ci-dessous)
# lors de l'instanciation du chaincode utilisateur.
# Utile lors de l'utilisation de balises d'image mobiles (telles que :latest)
pull: false

golang:
    # golang n'aura jamais besoin de plus que baseos
    runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION)

    # si oui ou non le chaincode golang doit être lié dynamiquement
    dynamicLink: false

java:
    # C'est une image basée sur java:openjdk-8 avec des outils de compilation
    # supplémentaires ajoutés pour l'emballage de la couche shim java.
    # Cette image est emballée avec les bibliothèques de couche shim nécessaires
    # pour l'exécution du chaincode Java.
    runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION)

node:
    # C'est une image basée sur node:$(NODE_VER)-alpine
    runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION)

# Liste des répertoires à traiter comme des constructeurs et lanceurs externes pour
# chaincode. Le traitement de détection de constructeur externe itérera sur les
# constructeurs dans l'ordre spécifié ci-dessous.
# Si vous n'avez pas besoin de revenir au constructeur Docker par défaut, désactivez également vm.endpoint ci-dessus.
# Pour remplacer cette propriété via une variable d'environnement, utilisez CORE_CHAINCODE_EXTERNALBUILDERS: [{name: x, path: dir1}, {name: y, path: dir2}]
externalBuilders:
   - name: ccaas_builder
     path: /opt/hyperledger/ccaas_builder
     propagateEnvironment:
       - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG


# La durée maximale d'attente pour que le processus de construction et d'installation du chaincode
# soit terminé.
installTimeout: 300s

# Durée d'attente pour le démarrage d'un conteneur et l'attente de Register
# à traverser.
startuptimeout: 300s

# Durée d'attente pour les appels Invoke et Init pour éviter les problèmes.
# Ce délai d'attente est utilisé par tous les chaincodes dans tous les canaux, y compris
# les chaincodes système.
# Notez que pendant Invoke, si l'image n'est pas disponible (par exemple en train d'être
# nettoyée dans un environnement de développement), le pair construira automatiquement
# l'image, ce qui pourrait prendre plus de temps. Dans un environnement de production,
# l'image du chaincode est peu susceptible d'être supprimée, donc le délai d'attente pourrait être
# réduit en conséquence.
executetimeout: 30s

# Il y a 2 modes : "dev" et "net".
# En mode dev, l'utilisateur exécute le chaincode après avoir démarré le pair à partir de
# ligne de commande sur la machine locale.
# En mode net, le pair exécutera le chaincode dans un conteneur docker.
mode: net

# maintien de connexion en secondes. Dans les situations où la communication passe par un
# proxy qui ne prend pas en charge le maintien de connexion, ce paramètre maintiendra la connexion
# entre le pair et le chaincode.
# Une valeur <= 0 désactive le maintien de connexion
keepalive: 0

# chaincodes système activés
system:
    _lifecycle: enable
    cscc: enable
    lscc: enable
    qscc: enable

# Section de journalisation pour le conteneur chaincode
logging:
  # Niveau par défaut pour tous les journaux dans le conteneur chaincode
  level:  info
  # Remplacer le niveau par défaut pour le journal 'shim'
  shim:   warning
  # Format pour les journaux du conteneur chaincode
  format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

###############################################################################

Section Registre - la configuration du registre englobe à la fois la blockchain

et l'état

############################################################################### ledger:

blockchain:

state: # stateDatabase - les options sont "goleveldb", "CouchDB" # goleveldb - base de données d'état par défaut stockée dans goleveldb. # CouchDB - stocker la base de données d'état dans CouchDB stateDatabase: goleveldb # Limite sur le nombre d'enregistrements à retourner par requête totalQueryLimit: 100000 couchDBConfig: # Il est recommandé d'exécuter CouchDB sur le même serveur que le pair, et # de ne pas mapper le port conteneur CouchDB vers un port serveur dans docker-compose. # Sinon une sécurité appropriée doit être fournie sur la connexion entre # le client CouchDB (sur le pair) et le serveur. couchDBAddress: 127.0.0.1:5984 # Cet utilisateur doit avoir les autorités de lecture et d'écriture sur CouchDB username: # Le mot de passe est recommandé d'être transmis comme variable d'environnement # lors du démarrage (par exemple CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD). # S'il est stocké ici, le fichier doit être protégé par un contrôle d'accès # pour empêcher des utilisateurs non intentionnels de découvrir le mot de passe. password: # Nombre de nouvelles tentatives pour les erreurs CouchDB maxRetries: 3 # Nombre de nouvelles tentatives pour les erreurs CouchDB pendant le démarrage du pair. # Le délai entre les tentatives double à chaque tentative. # La valeur par défaut de 10 tentatives donne 11 tentatives sur 2 minutes. maxRetriesOnStartup: 10 # Délai de requête CouchDB (unité : durée, par exemple 20s) requestTimeout: 35s # Limite sur le nombre d'enregistrements par chaque requête CouchDB # Notez que les requêtes chaincode sont uniquement limitées par totalQueryLimit. # En interne le chaincode peut exécuter plusieurs requêtes CouchDB, # chacune de taille internalQueryLimit. internalQueryLimit: 1000 # Limite sur le nombre d'enregistrements par lot de mise à jour CouchDB maxBatchUpdateSize: 1000 # Créer la base de données système _global_changes # C'est facultatif. Créer la base de données de changements globaux nécessitera # des ressources système supplémentaires pour suivre les changements et maintenir la base de données createGlobalChangesDB: false # CacheSize indique le nombre maximum de mégaoctets (Mo) à allouer pour le cache d'état # en mémoire. Notez que CacheSize doit être un multiple de 32 Mo. S'il n'est pas un multiple # de 32 Mo, le pair arrondira la taille au multiple de 32 Mo suivant. # Pour désactiver le cache, 0 Mo doivent être affectés à cacheSize. cacheSize: 64

history: # enableHistoryDatabase - les options sont true ou false # Indique si l'historique des mises à jour de clés doit être stocké. # Tous les index d'historique seront stockés dans goleveldb, quelle que soit l'utilisation # de CouchDB ou d'une base de données alternative pour l'état. enableHistoryDatabase: true

pvtdataStore: # la taille maximale du lot de base de données pour convertir # les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcMaxDbBatchSize: 5000 # la durée minimale (en millisecondes) entre l'écriture # de deux lots de base de données consécutifs pour convertir les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcDbBatchesInterval: 1000 # Les entrées de données manquantes sont classées en deux catégories : # (1) priorisées # (2) dépriorisées # Initialement, toutes les données manquantes sont dans la liste priorisée. Quand le # réconciliateur est incapable de récupérer les données manquantes auprès d'autres pairs, # les données manquantes non réconciliées seraient déplacées vers la liste dépriorisée. # Le réconciliateur réessaiera les données manquantes dépriorisées après chaque # deprioritizedDataReconcilerInterval (unité : minutes). Notez que l' # intervalle doit être supérieur à reconcileSleepInterval deprioritizedDataReconcilerInterval: 60m

snapshots: # Chemin sur le système de fichiers où le pair stockera les instantanés du registre rootDir: /var/hyperledger/production/snapshots/org2-peer0

###############################################################################

Section Opérations

############################################################################### operations: # hôte et port pour le serveur d'opérations listenAddress: 127.0.0.1:9448

# Configuration TLS pour le point de terminaison des opérations
tls:
    # TLS activé
    enabled: false

    # chemin vers le certificat de serveur PEM encodé pour le serveur d'opérations
    cert:
        file:

    # chemin vers la clé de serveur PEM encodée pour le serveur d'opérations
    key:
        file:

    # la plupart des points de terminaison de service d'opérations exigent l'authentification client lorsque TLS
    # est activé. clientAuthRequired exige l'authentification par certificat client
    # au niveau TLS pour accéder à toutes les ressources.
    clientAuthRequired: false

    # chemins vers les certificats CA PEM encodés à faire confiance pour l'authentification client
    clientRootCAs:
        files: []

###############################################################################

Section Métriques

############################################################################### metrics: # le fournisseur de métriques est l'un de statsd, prometheus, ou désactivé provider: disabled

# configuration statsd
statsd:
    # type de réseau : tcp ou udp
    network: udp

    # adresse du serveur statsd
    address: 127.0.0.1:8127

    # l'intervalle auquel les compteurs et jauges mis en cache localement sont poussés
    # vers statsd ; les temporisations sont poussées immédiatement
    writeInterval: 10s

    # le préfixe est ajouté à toutes les métriques statsd émises
    prefix:

Démarrer le nœud org2-peer0 : ```
nohup ./peer node start > org2-peer0.log 2>&1 &

Déploiement du nœud org2-peer1

Éditer le fichier core.yaml : ```

Copyright IBM Corp. Tous droits réservés.

SPDX-License-Identifier: Apache-2.0

###############################################################################

Section Pair

############################################################################### peer:

# L'identifiant pair fournit un nom pour cette instance pair et est utilisé lors
# du nommage des ressources docker.
id: peer1.org2.example.com

# Le networkId permet une séparation logique des réseaux et est utilisé lors
# du nommage des ressources docker.
networkId: dev

# L'adresse de l'interface réseau locale sur laquelle ce pair écoutera.
# Par défaut, il écoutera sur toutes les interfaces réseau
listenAddress: 192.168.1.66:10051

# Le point de terminaison que ce pair utilise pour écouter les connexions chaincode entrantes.
# Si ceci est commenté, l'adresse d'écoute est sélectionnée pour être
# l'adresse du pair (voir ci-dessous) avec le port 7052
chaincodeListenAddress: 192.168.1.66:7056

# Le point de terminaison que le chaincode pour ce pair utilise pour se connecter au pair.
# Si ce n'est pas spécifié, l'adresse chaincodeListenAddress est sélectionnée.
# Et si chaincodeListenAddress n'est pas spécifié, l'adresse est sélectionnée à partir de
# l'adresse pair (voir ci-dessous). Si l'adresse pair spécifiée est invalide alors elle
# reviendra à l'IP détectée automatiquement (IP locale) quelle que soit la valeur de
# addressAutoDetect du pair.
chaincodeAddress: 192.168.1.66:7056

# Lorsqu'utilisé comme configuration pair, cela représente le point de terminaison vers d'autres pairs
# dans la même organisation. Pour les pairs dans d'autres organisations, voir
# gossip.externalEndpoint pour plus d'informations.
# Lorsqu'utilisé comme configuration CLI, cela signifie le point de terminaison pair pour interagir avec
address: 192.168.1.66:10051

# Si le pair doit déterminer programmatiquement son adresse
# Ce cas est utile pour les conteneurs docker.
# Lorsqu'il est défini sur true, cela remplacera l'adresse pair.
addressAutoDetect: false

# Paramètres pour le serveur passerelle du pair.
gateway:
    # Si la passerelle est activée pour ce pair.
    enabled: true
    # endorsementTimeout est la durée pendant laquelle la passerelle attend une réponse
    # des autres pairs approuvant avant de retourner une erreur de délai d'attente au client.
    endorsementTimeout: 30s
    # dialTimeout est la durée pendant laquelle la passerelle attend une connexion
    # aux autres nœuds du réseau.
    dialTimeout: 2m


# Paramètres de maintien de connexion pour le serveur pair et les clients
keepalive:
    # L'intervalle est la durée après laquelle si le serveur ne voit
    # aucune activité du client, il envoie un ping au client pour voir s'il est vivant
    interval: 7200s
    # Le délai d'expiration est la durée pendant laquelle le serveur attend une réponse
    # du client après avoir envoyé un ping avant de fermer la connexion
    timeout: 20s
    # MinInterval est le temps minimum autorisé entre les pings clients.
    # Si les clients envoient des pings plus fréquemment, le serveur pair
    # les déconnectera
    minInterval: 60s
    # Paramètres de maintien de connexion client pour communiquer avec d'autres nœuds pairs
    client:
        # L'intervalle est le temps entre les pings vers les nœuds pairs. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds pairs
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds pairs avant de fermer la connexion
        timeout: 20s
    # Paramètres de maintien de connexion DeliveryClient pour la communication avec les nœuds
    # d'ordonnancement.
    deliveryClient:
        # L'intervalle est le temps entre les pings vers les nœuds d'ordonnancement. Cela doit
        # être supérieur ou égal au minInterval spécifié par les
        # nœuds d'ordonnancement.
        interval: 60s
        # Le délai d'expiration est la durée pendant laquelle le client attend une réponse de
        # nœuds d'ordonnancement avant de fermer la connexion
        timeout: 20s


# Configuration liée à la diffusion
gossip:
    # Ensemble d'amorçage pour initialiser la diffusion avec.
    # C'est une liste d'autres pairs que ce pair contacte au démarrage.
    # Important : Les points de terminaison ici doivent être des points de terminaison de pairs dans la même
    # organisation, car le pair refuserait de se connecter à ces points de terminaison
    # sauf s'ils sont dans la même organisation que le pair.
    bootstrap: 192.168.1.66:10051

    # NOTE : orgLeader et useLeaderElection sont mutuellement exclusifs.
    # Les définir tous deux à true entraînerait l'arrêt du pair
    # puisque c'est un état indéfini. Si les pairs sont configurés avec
    # useLeaderElection=false, assurez-vous qu'il y a au moins 1 pair dans l'
    # organisation dont orgLeader est défini sur true.

    # Définit si le pair initialisera un algorithme dynamique pour
    # la sélection du "leader", où le leader est le pair qui établit
    # la connexion avec le service d'ordonnancement et utilise le protocole
    # de livraison pour extraire les blocs de registre du service d'ordonnancement.
    useLeaderElection: false
    # Définit statiquement le pair comme "leader" d'une organisation,
    # ce qui signifie que le pair actuel maintiendra la connexion
    # avec le service d'ordonnancement et diffusera les blocs entre les pairs de
    # sa propre organisation. Plusieurs pairs ou tous les pairs d'une organisation
    # peuvent être configurés comme leaders d'organisation, afin qu'ils puissent tous
    # extraire directement les blocs du service d'ordonnancement.
    orgLeader: true

    # Intervalle pour les interrogations du traqueur d'appartenance
    membershipTrackerInterval: 5s

    # Remplace le point de terminaison que le pair publie aux pairs
    # dans son organisation. Pour les pairs dans des organisations étrangères
    # voir 'externalEndpoint'
    endpoint:
    # Nombre maximum de blocs stockés en mémoire
    maxBlockCountToStore: 10
    # Temps maximum entre les poussées de messages consécutives (unité : milliseconde)
    maxPropagationBurstLatency: 10ms
    # Nombre maximum de messages stockés jusqu'à ce qu'un poussage soit déclenché vers les pairs distants
    maxPropagationBurstSize: 10
    # Nombre de fois qu'un message est poussé vers les pairs distants
    propagateIterations: 1
    # Nombre de pairs sélectionnés vers lesquels pousser les messages
    propagatePeerNum: 3
    # Détermine la fréquence des phases de tirage (unité : seconde)
    # Doit être supérieur à digestWaitTime + responseWaitTime
    pullInterval: 4s
    # Nombre de pairs à partir desquels effectuer le tirage
    pullPeerNum: 3
    # Détermine la fréquence de tirage des messages d'information d'état provenant des pairs (unité : seconde)
    requestStateInfoInterval: 4s
    # Détermine la fréquence de poussage des messages d'information d'état vers les pairs (unité : seconde)
    publishStateInfoInterval: 4s
    # Temps maximum pendant lequel un message d'information d'état est conservé avant expiration
    stateInfoRetentionInterval:
    # Temps à partir duquel les certificats sont inclus dans les messages Alive (unité : seconde)
    publishCertPeriod: 10s
    # Devons-nous ignorer la vérification des messages de bloc ou non (actuellement non utilisé)
    skipBlockVerification: false
    # Délai de connexion (unité : seconde)
    dialTimeout: 3s
    # Délai de connexion (unité : seconde)
    connTimeout: 2s
    # Taille du tampon des messages reçus
    recvBuffSize: 20
    # Taille du tampon des messages envoyés
    sendBuffSize: 200
    # Temps d'attente avant que le moteur de tirage traite les résumés entrants (unité : seconde)
    # Devrait être légèrement inférieur à requestWaitTime
    digestWaitTime: 1s
    # Temps d'attente avant que le moteur de tirage supprime le nonce entrant (unité : millisecondes)
    # Devrait être légèrement supérieur à digestWaitTime
    requestWaitTime: 1500ms
    # Temps d'attente avant que le moteur de tirage termine le tirage (unité : seconde)
    responseWaitTime: 2s
    # Intervalle de vérification de vie (unité : seconde)
    aliveTimeInterval: 5s
    # Délai d'expiration de vie (unité : seconde)
    aliveExpirationTimeout: 25s
    # Intervalle de reconnexion (unité : seconde)
    reconnectInterval: 25s
    # Nombre maximum de tentatives de connexion à un pair
    maxConnectionAttempts: 120
    # Facteur d'expiration des messages pour les messages de vie
    msgExpirationFactor: 20
    # Ceci est un point de terminaison publié aux pairs en dehors de l'organisation.
    # Si ce n'est pas défini, le pair ne sera pas connu des autres organisations.
    externalEndpoint:
    # Configuration du service d'élection de leader
    election:
        # Temps le plus long que le pair attend pour une appartenance stable pendant le démarrage de l'élection de leader (unité : seconde)
        startupGracePeriod: 15s
        # Intervalle des échantillons d'appartenance de diffusion pour vérifier sa stabilité (unité : seconde)
        membershipSampleInterval: 1s
        # Temps écoulé depuis le dernier message de déclaration avant que le pair décide d'effectuer l'élection de leader (unité : seconde)
        leaderAliveThreshold: 10s
        # Temps entre l'envoi du message de proposition par le pair et sa déclaration comme leader (envoi du message de déclaration) (unité : seconde)
        leaderElectionDuration: 5s

    pvtData:
        # pullRetryThreshold détermine la durée maximale pendant laquelle les données privées correspondant à un bloc donné
        # seront tentées d'être extraites des pairs jusqu'à ce que le bloc soit validé sans les données privées
        pullRetryThreshold: 60s
        # Lorsque les données privées entrent dans le magasin temporaire, elles sont associées à la hauteur du registre du pair à ce moment-là.
        # transientstoreMaxBlockRetention définit la différence maximale entre la hauteur actuelle du registre lors de la validation,
        # et les données privées résidant dans le magasin temporaire qui sont garanties de ne pas être purgées.
        # Les données privées sont purgées du magasin temporaire lorsque des blocs avec des séquences qui sont des multiples
        # de transientstoreMaxBlockRetention sont validés.
        transientstoreMaxBlockRetention: 1000
        # pushAckTimeout est le temps maximum d'attente pour une reconnaissance de chaque pair
        # lors de la poussée des données privées au moment de l'appui.
        pushAckTimeout: 3s
        # Marge de tirage Block to live, utilisée comme tampon
        # pour empêcher le pair d'essayer de tirer les données privées
        # des pairs qui seront bientôt purgées dans les N prochains blocs.
        # Cela aide un pair nouvellement joint à rattraper plus rapidement
        # la hauteur actuelle de la blockchain.
        btlPullMargin: 10
        # le processus de réconciliation est effectué dans une boucle infinie, tandis que dans chaque itération le réconciliateur essaie de
        # tirer des autres pairs les blocs manquants les plus récents avec une limitation de taille de lot maximale.
        # reconcileBatchSize détermine la taille de lot maximale des données privées manquantes qui seront réconciliées dans une
        # seule itération.
        reconcileBatchSize: 10
        # reconcileSleepInterval détermine le temps que le réconciliateur dort de la fin d'une itération jusqu'au début
        # de la prochaine itération de réconciliation.
        reconcileSleepInterval: 1m
        # reconciliationEnabled est un indicateur qui indique si la réconciliation des données privées est activée ou non.
        reconciliationEnabled: true
        # skipPullingInvalidTransactionsDuringCommit est un indicateur qui indique si le tirage des données privées
        # des transactions invalides provenant d'autres pairs doit être ignoré pendant le temps de validation et tiré
        # uniquement via le réconciliateur.
        skipPullingInvalidTransactionsDuringCommit: false
        # implicitCollectionDisseminationPolicy spécifie la politique de dissémination pour la collection implicite propre au pair.
        # Lorsqu'un pair approuve une proposition qui écrit dans sa propre collection implicite, les valeurs ci-dessous remplacent les valeurs par défaut
        # pour la dissémination des données privées.
        # Notez que cela s'applique à tous les canaux auxquels le pair a rejoint. L'implication est que requiredPeerCount doit
        # être inférieur au nombre de pairs dans un canal qui a le plus petit nombre de pairs de l'organisation.
        implicitCollectionDisseminationPolicy:
           # requiredPeerCount définit le nombre minimum de pairs éligibles auxquels le pair doit réussir
           # à disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 0.
           requiredPeerCount: 0
           # maxPeerCount définit le nombre maximum de pairs éligibles auxquels le pair tentera de
           # disséminer les données privées pour sa propre collection implicite lors de l'appui. La valeur par défaut est 1.
           maxPeerCount: 1

    # Configuration liée au transfert d'état de la diffusion
    state:
        # indique si le transfert d'état est activé ou non
        # la valeur par défaut est false, c'est-à-dire que le transfert d'état est actif
        # et veille à synchroniser les blocs manquants permettant
        # au pair en retard de rattraper la vitesse du reste du réseau.
        # Gardez à l'esprit que lorsque peer.gossip.useLeaderElection est vrai
        # et qu'il y a plusieurs pairs dans l'organisation,
        # ou peer.gossip.useLeaderElection est faux ainsi que
        # peer.gossip.orgleader étant faux, le registre du pair peut être en retard
        # par rapport aux autres pairs et ne rattrapera jamais le rythme en raison du transfert d'état
        # étant désactivé.
        enabled: false
        # checkInterval intervalle pour vérifier si le pair est suffisamment en retard pour
        # demander des blocs via le transfert d'état d'un autre pair.
        checkInterval: 10s
        # responseTimeout durée d'attente pour la réponse de transfert d'état de
        # autres pairs
        responseTimeout: 3s
        # batchSize le nombre de blocs à demander via le transfert d'état d'un autre pair
        batchSize: 10
        # blockBufferSize reflète la taille du tampon de réordonnancement
        # qui capture les blocs et veille à les livrer dans l'ordre
        # vers la couche de registre. La taille réelle du tampon est bornée entre
        # 0 et 2*blockBufferSize, chaque canal maintient son propre tampon
        blockBufferSize: 20
        # maxRetries nombre maximum de nouvelles tentatives pour demander
        # une seule requête de transfert d'état
        maxRetries: 3

# Paramètres TLS
tls:
    # Exiger le TLS côté serveur
    enabled:  true
    # Exiger les certificats clients / TLS mutuel pour les connexions entrantes.
    # Notez que les clients qui ne sont pas configurés pour utiliser un certificat
    # échoueront à se connecter au pair.
    clientAuthRequired: false
    # Certificat X.509 utilisé pour le serveur TLS
    cert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/tls/server.crt
    # Clé privée utilisée pour le serveur TLS
    key:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/tls/server.key
    # rootcert.file représente la chaîne de certificats racines de confiance utilisée pour vérifier les certificats
    # des autres nœuds lors des connexions sortantes.
    # Il n'est pas nécessaire de le définir, mais il peut être utilisé pour compléter l'ensemble des certificats TLS CA
    # disponibles à partir des MSP de chaque configuration de canal.
    rootcert:
        file: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/tls/ca.crt
    # Si le TLS mutuel est activé, clientRootCAs.files contient une liste de certificats racines supplémentaires
    # utilisés pour vérifier les certificats des connexions clients.
    # Il complète l'ensemble des certificats TLS CA disponibles à partir des MSP de chaque configuration de canal.
    # Au minimum, définissez le certificat racine TLS CA de votre organisation afin que le pair puisse recevoir les demandes de jonction de canal.
    clientRootCAs:
        files:
          - /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/tls/ca.crt
    # Clé privée utilisée pour TLS lors des connexions clientes.
    # Si non définie, peer.tls.key.file sera utilisé à la place
    clientKey:
        file:
    # Certificat X.509 utilisé pour TLS lors des connexions clientes.
    # Si non défini, peer.tls.cert.file sera utilisé à la place
    clientCert:
        file:

# Authentication contient les paramètres de configuration liés à l'authentification
# des messages clients
authentication:
    # la différence acceptable entre l'heure actuelle du serveur et l'
    # heure du client comme spécifiée dans un message de demande client
    timewindow: 15m

# Chemin sur le système de fichiers où le pair stockera les données (par exemple registre). Cet
# emplacement doit être protégé par un contrôle d'accès pour empêcher toute modification
# non intentionnelle qui pourrait corrompre les opérations du pair.
fileSystemPath: /var/hyperledger/production/org2-peer1

# BCCSP (fournisseur cryptographique Blockchain) : Sélectionnez quelle implémentation ou
# bibliothèque cryptographique utiliser
BCCSP:
    Default: SW
    # Paramètres pour le fournisseur cryptographique SW (c'est-à-dire lorsque DEFAULT : SW)
    SW:
        # TODO : Le hachage et le niveau de sécurité par défaut nécessitent une refactorisation pour être
        # entièrement configurable. Changer ces valeurs par défaut nécessite une coordination
        # SHA2 est codé en dur à plusieurs endroits, pas seulement dans BCCSP
        Hash: SHA2
        Security: 256
        # Emplacement du magasin de clés
        FileKeyStore:
            # Si "", la valeur par défaut est 'mspConfigPath'/keystore
            KeyStore:
    # Paramètres pour le fournisseur cryptographique PKCS#11 (c'est-à-dire lorsque DEFAULT : PKCS11)
    PKCS11:
        # Emplacement de la bibliothèque de module PKCS11
        Library:
        # Étiquette du jeton
        Label:
        # Code PIN utilisateur
        Pin:
        Hash:
        Security:

# Chemin sur le système de fichiers où le pair trouvera les configurations MSP locales
mspConfigPath: /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/msp

# Identificateur du MSP local
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# Les déploiements doivent changer la valeur de la chaîne localMspId.
# En particulier, le nom de l'ID MSP local d'un pair doit
# correspondre au nom de l'un des MSPs de chaque canal
# auquel ce pair appartient. Sinon, les messages de ce pair
# ne seront pas identifiés comme valides par les autres nœuds.
localMspId: Org2MSP

# Options de configuration client CLI communes
client:
    # délai de connexion
    connTimeout: 3s

# Configuration liée au service de livraison
deliveryclient:
    # Active ce pair pour diffuser les blocs qu'il a extraits du service d'ordonnancement
    # via la diffusion.
    # Notez que 'gossip.state.enabled' contrôle la réplication de blocs point à point
    # des blocs validés dans le passé.
    blockGossipEnabled: true
    # Définit le temps total que le service de livraison peut passer dans les tentatives de
    # reconnexion jusqu'à ce que sa logique de nouvelle tentative abandonne et renvoie une erreur
    reconnectTotalTimeThreshold: 3600s

    # Définit le délai de connexion du service de livraison <-> service d'ordonnancement
    connTimeout: 3s

    # Définit le délai maximal du service de livraison entre les nouvelles tentatives consécutives
    reConnectBackoffThreshold: 3600s

    # Une liste d'adresses de points de terminaison de service d'ordonnancement qui devraient être remplacées
    # lorsqu'elles sont trouvées dans les configurations de canal.
    addressOverrides:
    #  - from:
    #    to:
    #    caCertsFile:
    #  - from:
    #    to:
    #    caCertsFile:

# Type pour le MSP local - par défaut c'est de type bccsp
localMspType: bccsp

# Utilisé avec les outils de profilage Go uniquement dans un environnement non de production. Dans
# la production, il devrait être désactivé (par exemple enabled : false)
profile:
    enabled:     false
    listenAddress: 0.0.0.0:6060

# Handlers définit des gestionnaires personnalisés qui peuvent filtrer et modifier
# les objets passant dans le pair, tels que :
#   Filtre d'authentification - rejeter ou transmettre les propositions des clients
#   Décorateurs - ajouter ou modifier l'entrée chaincode transmise au chaincode
#   Appuis - Signature personnalisée sur la charge utile de réponse de proposition et sa modification
# Une définition de gestionnaire valide contient :
#   - Un nom qui est un nom de méthode de fabrique défini dans
#     core/handlers/library/library.go pour les gestionnaires compilés statiquement
#   - chemin de bibliothèque vers le binaire objet partagé pour les filtres branchables
# Les filtres d'authentification et les décorateurs sont chaînés et exécutés dans l'ordre
# où ils sont définis. Par exemple :
# authFilters:
#   -
#     name: FilterOne
#     library: /opt/lib/filter.so
#   -
#     name: FilterTwo
# decorators:
#   -
#     name: DecoratorOne
#   -
#     name: DecoratorTwo
#     library: /opt/lib/decorator.so
# Les appuis sont configurés en tant que carte dont les clés sont les chaincodes système d'appui qui sont remplacés.
# Ci-dessous un exemple qui remplace l'ESCC par défaut et utilise un plugin d'appui qui a la même fonctionnalité
# que l'ESCC par défaut.
# Si la propriété 'library' est absente, le nom est utilisé comme méthode de constructeur dans la bibliothèque intégrée similaire
# aux filtres d'authentification et aux décorateurs.
# endorsers:
#   escc:
#     name: DefaultESCC
#     library: /etc/hyperledger/fabric/plugin/escc.so
handlers:
    authFilters:
      -
        name: DefaultAuth
      -
        name: ExpirationCheck    # Ce filtre vérifie l'expiration du certificat x509 d'identité
    decorators:
      -
        name: DefaultDecorator
    endorsers:
      escc:
        name: DefaultEndorsement
        library:
    validators:
      vscc:
        name: DefaultValidation
        library:

#    library: /etc/hyperledger/fabric/plugin/escc.so
# Nombre de goroutines qui exécuteront la validation des transactions en parallèle.
# Par défaut, le pair choisit le nombre de processeurs de la machine. Définissez cette
# variable pour remplacer ce choix.
# NOTE : remplacer cette valeur pourrait négativement influencer les performances du
# pair donc veuillez changer cette valeur uniquement si vous savez ce que vous faites
validatorPoolSize:

# Le service de découverte est utilisé par les clients pour interroger des informations sur les pairs,
# telles que - quels pairs ont rejoint un certain canal, quelle est la dernière
# configuration du canal, et surtout - étant donné un chaincode et un canal,
# quels ensembles possibles de pairs satisfont la politique d'appui.
discovery:
    enabled: true
    # Si le cache d'authentification est activé ou non.
    authCacheEnabled: true
    # La taille maximale du cache, après quoi un nettoyage a lieu
    authCacheMaxSize: 1000
    # La proportion (0 à 1) des entrées qui restent dans le cache après que le cache soit nettoyé en raison d'une surpopulation
    authCachePurgeRetentionRatio: 0.75
    # Si l'on autorise les non-administrateurs à effectuer des requêtes hors périmètre de canal.
    # Lorsque c'est faux, cela signifie que seuls les administrateurs de pair peuvent effectuer des requêtes hors périmètre de canal.
    orgMembersAllowedAccess: false

# Limits est utilisé pour configurer certaines limites de ressources internes.
limits:
    # Concurrency limite le nombre de requêtes simultanément en cours d'exécution vers un service sur chaque pair.
    # Actuellement cette option est appliquée uniquement au service d'appui et au service de livraison.
    # Lorsque la propriété est absente ou que la valeur est 0, la limite de concurrence est désactivée pour le service.
    concurrency:
        # endorserService limite les requêtes simultanées vers le service d'appui qui gère le déploiement, la requête et l'invocation de chaincode,
        # y compris les chaincodes utilisateur et les chaincodes système.
        endorserService: 2500
        # deliverService limite les auditeurs d'événements simultanés enregistrés auprès du service de livraison pour les événements de blocs et de transactions.
        deliverService: 2500
        # gatewayService limite les requêtes simultanées vers le service de passerelle qui gère la soumission et l'évaluation des transactions.
        gatewayService: 500

# Puisque tous les nœuds devraient être cohérents, il est recommandé de conserver
# la valeur par défaut de 100 Mo pour MaxRecvMsgSize & MaxSendMsgSize
# Taille maximale du message en octets que le serveur et le client GRPC peuvent recevoir
maxRecvMsgSize: 104857600
# Taille maximale du message en octets que le serveur et le client GRPC peuvent envoyer
maxSendMsgSize: 104857600

###############################################################################

Section VM

############################################################################### vm:

# Point de terminaison du système de gestion vm. Pour docker peut être l'un des suivants en général
# unix:///var/run/docker.sock
# http://localhost:2375
# https://localhost:2376
# Si vous utilisez des constructeurs de chaincode externes et que vous n'avez pas besoin du constructeur de chaincode Docker par défaut,
# le point de terminaison devrait ne pas être configuré afin que le vérificateur de santé Docker du pair ne soit pas enregistré.
endpoint: unix:///var/run/docker.sock

# paramètres pour les vms docker
docker:
    tls:
        enabled: false
        ca:
            file: docker/ca.crt
        cert:
            file: docker/tls.crt
        key:
            file: docker/tls.key

    # Active/désactive la sortie standard/erreur des conteneurs chaincode pour
    # des fins de débogage
    attachStdout: false

    # Paramètres lors de la création du conteneur docker.
    # Le conteneur peut être créé efficacement en utilisant ipam & dns-server pour le cluster
    # NetworkMode - définit le mode réseau pour le conteneur. Les
    # valeurs standard prises en charge sont : `host`(par défaut),`bridge`,`ipvlan`,`none`.
    # Dns - une liste de serveurs DNS pour que le conteneur les utilise.
    # Note : Les propriétés `Privileged` `Binds` `Links` et `PortBindings` de
    # la configuration hôte Docker ne sont pas prises en charge et ne seront pas utilisées si définies.
    # LogConfig - définit le pilote de journalisation (Type) et les options
    # (Config) pour Docker. Pour plus d'informations,
    # https://docs.docker.com/engine/admin/logging/overview/
    # Note : Définir LogConfig en utilisant des variables d'environnement n'est pas pris en charge.
    hostConfig:
        NetworkMode: host
        Dns:
           # - 192.168.0.1
        LogConfig:
            Type: json-file
            Config:
                max-size: "50m"
                max-file: "5"
        Memory: 2147483648

###############################################################################

Section Chaincode

############################################################################### chaincode:

# L'id est utilisé par le stub de chaincode pour enregistrer le chaincode en cours d'exécution
# ID avec le pair et est généralement fourni via des variables ENV
# la forme `path` de l'ID est fournie lors de l'installation du chaincode.
# Le `name` est utilisé pour toutes les autres requêtes et peut être n'importe quelle chaîne.
id:
    path:
    name:

# Environnement de construction générique, adapté à la plupart des types de chaincode
builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION)

# Active/désactive le téléchargement forcé des images docker de base (répertoriées ci-dessous)
# lors de l'instanciation du chaincode utilisateur.
# Utile lors de l'utilisation de balises d'image mobiles (telles que :latest)
pull: false

golang:
    # golang n'aura jamais besoin de plus que baseos
    runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION)

    # si oui ou non le chaincode golang doit être lié dynamiquement
    dynamicLink: false

java:
    # C'est une image basée sur java:openjdk-8 avec des outils de compilation
    # supplémentaires ajoutés pour l'emballage de la couche shim java.
    # Cette image est emballée avec les bibliothèques de couche shim nécessaires
    # pour l'exécution du chaincode Java.
    runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION)

node:
    # C'est une image basée sur node:$(NODE_VER)-alpine
    runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION)

# Liste des répertoires à traiter comme des constructeurs et lanceurs externes pour
# chaincode. Le traitement de détection de constructeur externe itérera sur les
# constructeurs dans l'ordre spécifié ci-dessous.
# Si vous n'avez pas besoin de revenir au constructeur Docker par défaut, désactivez également vm.endpoint ci-dessus.
# Pour remplacer cette propriété via une variable d'environnement, utilisez CORE_CHAINCODE_EXTERNALBUILDERS: [{name: x, path: dir1}, {name: y, path: dir2}]
externalBuilders:
   - name: ccaas_builder
     path: /opt/hyperledger/ccaas_builder
     propagateEnvironment:
       - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG


# La durée maximale d'attente pour que le processus de construction et d'installation du chaincode
# soit terminé.
installTimeout: 300s

# Durée d'attente pour le démarrage d'un conteneur et l'attente de Register
# à traverser.
startuptimeout: 300s

# Durée d'attente pour les appels Invoke et Init pour éviter les problèmes.
# Ce délai d'attente est utilisé par tous les chaincodes dans tous les canaux, y compris
# les chaincodes système.
# Notez que pendant Invoke, si l'image n'est pas disponible (par exemple en train d'être
# nettoyée dans un environnement de développement), le pair construira automatiquement
# l'image, ce qui pourrait prendre plus de temps. Dans un environnement de production,
# l'image du chaincode est peu susceptible d'être supprimée, donc le délai d'attente pourrait être
# réduit en conséquence.
executetimeout: 30s

# Il y a 2 modes : "dev" et "net".
# En mode dev, l'utilisateur exécute le chaincode après avoir démarré le pair à partir de
# ligne de commande sur la machine locale.
# En mode net, le pair exécutera le chaincode dans un conteneur docker.
mode: net

# maintien de connexion en secondes. Dans les situations où la communication passe par un
# proxy qui ne prend pas en charge le maintien de connexion, ce paramètre maintiendra la connexion
# entre le pair et le chaincode.
# Une valeur <= 0 désactive le maintien de connexion
keepalive: 0

# chaincodes système activés
system:
    _lifecycle: enable
    cscc: enable
    lscc: enable
    qscc: enable

# Section de journalisation pour le conteneur chaincode
logging:
  # Niveau par défaut pour tous les journaux dans le conteneur chaincode
  level:  info
  # Remplacer le niveau par défaut pour le journal 'shim'
  shim:   warning
  # Format pour les journaux du conteneur chaincode
  format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'

###############################################################################

Section Registre - la configuration du registre englobe à la fois la blockchain

et l'état

############################################################################### ledger:

blockchain:

state: # stateDatabase - les options sont "goleveldb", "CouchDB" # goleveldb - base de données d'état par défaut stockée dans goleveldb. # CouchDB - stocker la base de données d'état dans CouchDB stateDatabase: goleveldb # Limite sur le nombre d'enregistrements à retourner par requête totalQueryLimit: 100000 couchDBConfig: # Il est recommandé d'exécuter CouchDB sur le même serveur que le pair, et # de ne pas mapper le port conteneur CouchDB vers un port serveur dans docker-compose. # Sinon une sécurité appropriée doit être fournie sur la connexion entre # le client CouchDB (sur le pair) et le serveur. couchDBAddress: 127.0.0.1:5984 # Cet utilisateur doit avoir les autorités de lecture et d'écriture sur CouchDB username: # Le mot de passe est recommandé d'être transmis comme variable d'environnement # lors du démarrage (par exemple CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD). # S'il est stocké ici, le fichier doit être protégé par un contrôle d'accès # pour empêcher des utilisateurs non intentionnels de découvrir le mot de passe. password: # Nombre de nouvelles tentatives pour les erreurs CouchDB maxRetries: 3 # Nombre de nouvelles tentatives pour les erreurs CouchDB pendant le démarrage du pair. # Le délai entre les tentatives double à chaque tentative. # La valeur par défaut de 10 tentatives donne 11 tentatives sur 2 minutes. maxRetriesOnStartup: 10 # Délai de requête CouchDB (unité : durée, par exemple 20s) requestTimeout: 35s # Limite sur le nombre d'enregistrements par chaque requête CouchDB # Notez que les requêtes chaincode sont uniquement limitées par totalQueryLimit. # En interne le chaincode peut exécuter plusieurs requêtes CouchDB, # chacune de taille internalQueryLimit. internalQueryLimit: 1000 # Limite sur le nombre d'enregistrements par lot de mise à jour CouchDB maxBatchUpdateSize: 1000 # Créer la base de données système _global_changes # C'est facultatif. Créer la base de données de changements globaux nécessitera # des ressources système supplémentaires pour suivre les changements et maintenir la base de données createGlobalChangesDB: false # CacheSize indique le nombre maximum de mégaoctets (Mo) à allouer pour le cache d'état # en mémoire. Notez que CacheSize doit être un multiple de 32 Mo. S'il n'est pas un multiple # de 32 Mo, le pair arrondira la taille au multiple de 32 Mo suivant. # Pour désactiver le cache, 0 Mo doivent être affectés à cacheSize. cacheSize: 64

history: # enableHistoryDatabase - les options sont true ou false # Indique si l'historique des mises à jour de clés doit être stocké. # Tous les index d'historique seront stockés dans goleveldb, quelle que soit l'utilisation # de CouchDB ou d'une base de données alternative pour l'état. enableHistoryDatabase: true

pvtdataStore: # la taille maximale du lot de base de données pour convertir # les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcMaxDbBatchSize: 5000 # la durée minimale (en millisecondes) entre l'écriture # de deux lots de base de données consécutifs pour convertir les entrées de données manquantes non éligibles en entrées de données manquantes éligibles collElgProcDbBatchesInterval: 1000 # Les entrées de données manquantes sont classées en deux catégories : # (1) priorisées # (2) dépriorisées # Initialement, toutes les données manquantes sont dans la liste priorisée. Quand le # réconciliateur est incapable de récupérer les données manquantes auprès d'autres pairs, # les données manquantes non réconciliées seraient déplacées vers la liste dépriorisée. # Le réconciliateur réessaiera les données manquantes dépriorisées après chaque # deprioritizedDataReconcilerInterval (unité : minutes). Notez que l' # intervalle doit être supérieur à reconcileSleepInterval deprioritizedDataReconcilerInterval: 60m

snapshots: # Chemin sur le système de fichiers où le pair stockera les instantanés du registre rootDir: /var/hyperledger/production/snapshots/org2-peer1

###############################################################################

Section Opérations

############################################################################### operations: # hôte et port pour le serveur d'opérations listenAddress: 127.0.0.1:9449

# Configuration TLS pour le point de terminaison des opérations
tls:
    # TLS activé
    enabled: false

    # chemin vers le certificat de serveur PEM encodé pour le serveur d'opérations
    cert:
        file:

    # chemin vers la clé de serveur PEM encodée pour le serveur d'opérations
    key:
        file:

    # la plupart des points de terminaison de service d'opérations exigent l'authentification client lorsque TLS
    # est activé. clientAuthRequired exige l'authentification par certificat client
    # au niveau TLS pour accéder à toutes les ressources.
    clientAuthRequired: false

    # chemins vers les certificats CA PEM encodés à faire confiance pour l'authentification client
    clientRootCAs:
        files: []

###############################################################################

Section Métriques

############################################################################### metrics: # le fournisseur de métriques est l'un de statsd, prometheus, ou désactivé provider: disabled

# configuration statsd
statsd:
    # type de réseau : tcp ou udp
    network: udp

    # adresse du serveur statsd
    address: 127.0.0.1:8128

    # l'intervalle auquel les compteurs et jauges mis en cache localement sont poussés
    # vers statsd ; les temporisations sont poussées immédiatement
    writeInterval: 10s

    # le préfixe est ajouté à toutes les métriques statsd émises
    prefix:

Démarrer le nœud org2-peer1 : ```
nohup ./peer node start > org2-peer1.log 2>&1 &

Création du canal

export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

./peer channel create -o orderer0.example.com:7050 -c businesschannel -f "/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts/businesschannel.tx" --timeout "30s" --tls --cafile /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/ordererOrganizations/example.com/orderers/orderer0.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

Après une création réussie, un fichier businesschannel.block sera généré dans le répertoire courant. ``` mv businesschannel.block /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts


### Rejoindre le canal

org1-peer0 rejoint le canal : ```
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=peer0.org1.example.com:7051

./peer channel join -b /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts/businesschannel.block

Après un succès de jonction, vous pouvez voir la sortie suivante : ``` 2022-02-22 08:58:09.295 EST 0002 INFO [channelCmd] executeJoin -> Successfully submitted proposal to join channel


org1-peer1 rejoint le canal : ```
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/pairs/peer1.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=peer1.org1.example.com:8051

./peer channel join -b /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts/businesschannel.block

org2-peer0 rejoint le canal : ``` export CORE_PEER_TLS_ENABLED=true export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer0.org2.example.com/tls/ca.crt export CORE_PEER_MSPCONFIGPATH=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp export CORE_PEER_ADDRESS=peer0.org2.example.com:9051

./peer channel join -b /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts/businesschannel.block


org2-peer1 rejoint le canal : ```
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/pairs/peer1.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=/usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=peer1.org2.example.com:10051

./peer channel join -b /usr/project/fabric/3orderer-org1-2peer-org2-2peer-network/channel-artifacts/businesschannel.block

Voir les canaux auxquels les pairs ont rejoint : ``` ./peer channel list


Sortie suviante : ```
2022-02-22 09:03:02.681 EST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
Channels peers has joined: 
businesschannel

Étiquettes: hyperledger-fabric Blockchain peer-nodes network-deployment distributed-ledger

Publié le 7 octobre à 19h08