Tutoriel Hyperledger Fabric SDK Go: Comment construire votre premier réseau ?

Ce tutoriel vous présentera le réseau Hyperledger Fabric et vous permettra de construire le vôtre.

Il fonctionne sur Ubuntu 16.04 avec Hyperledger-Fabric version 1.0.5.

Les sources sont disponibles sur Github : github.com/chainhero-website/heroes-service-network

Pour plus de commodité, nous allons créer le réseau que nous avons utilisé dans notre tutoriel principal.

  1. Guide d'installation
    1. Préparer l'environnement
    2. Dépendances
  2. Configuration
    1. Crypto-Config
    2. Artefacts
  3. Docker-Compose
  4. Conclusion

1. Guide d'installation

a. Préparer l'environnement

Avant de faire quoi que ce soit, créons notre répertoire de travail :

mkdir -p $GOPATH/src/github.com/chainHero/heroes-service-network

b. Dépendances

Pour créer correctement notre réseau, nous avons besoin de quelques binaires fournis par Hyperledger Fabric (v1.0.5).

Vous pouvez soit utiliser les binaires que nous fournissons, soit les télécharger depuis le dépôt officiel.

Téléchargez-les depuis notre dépôt (Linux x64 SEULEMENT) :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
svn checkout https://github.com/chainHero/heroes-service-network/branches/master/bin

Téléchargez-les depuis le dépôt officiel :

  • Linux s390x
  • Linux PPC64Ie
  • Linux AMD 64
  • Windows AMD 64
  • Darwin AMD 64

Une fois que vous avez téléchargé le dossier bin, déplacez-le dans le dossier heroes-service-network

2. Configuration

a. Crypto-config

Pour commencer, nous devons définir de quoi notre réseau sera composé. Pour ce faire, nous avons besoin d’un fichier de configuration.

Il contient la topologie du réseau et nous permet de générer un ensemble de certificats et de clés pour les Organisations et les composants qui appartiennent à ces Organisations.

Créons-le et commençons à le modifier :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
touch crypto-config.yaml && \
vi crypto-config.yaml

Et collez ceci dedans :

# "OrdererOrgs" - Definition of organizations managing orderer nodes
OrdererOrgs:
  - Name: ChainHero
    Domain: hf.chainhero.io
    # Specs is an array of Spec entries.  Each Spec entry consists of two fields : Hostname and CommonName
    Specs:
      - Hostname: orderer
# "PeerOrgs" - Definition of organizations managing peer nodes
PeerOrgs:
  - Name: Org1ChainHero
    Domain: org1.hf.chainhero.io
    # Allows for the definition of 1 or more hosts that are created sequentially
    # from a template. By default, this looks like "peer%d" from 0 to Count-1.
    # You may override the number of nodes (Count), the starting index (Start)
    # or the template used to construct the name (Hostname).
    Template:
      Count: 2
    Users:
      # The number of user accounts _in addition_ to Admin
      Count: 2

J’ai ajouté quelques commentaires pour que vous compreniez mieux ce que chaque ligne représente mais si vous voulez plus d’informations à ce sujet, vous pouvez jeter un oeil ici.

Maintenant que notre fichier de configuration est prêt, nous pouvons l’utiliser pour créer la base de notre réseau. Pour ce faire, nous utiliserons l’outil Cryptogen pour générer le matériel cryptographique (x509 certs) pour nos différentes entités réseau. cryptogen est un utilitaire pour générer du matériel clé Hyperledger Fabric, mais il est principalement destiné à être utilisé pour tester l’environnement.

Créons maintenant un dossier nommé crypto-config et utilisons cryptogen pour initialiser notre réseau :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
mkdir -p crypto-config && \
./bin/cryptogen generate --config=./crypto-config.yaml

Ok, nous en avons fini avec les fichiers cryptographiques (certificats). Vous devez pouvoir voir deux dossiers dans le dossier crypto-config. Ce doit être ordererOrganizations et peerOrganizations.

b. Artefacts

Afin de terminer l’initialisation de notre blockchain, nous devons créer :

  • Le bloc initial du client. Il est destiné, comme son nom l’indique, à initialiser correctement les clients de Fabric.
  • Un bloc initial du canal. Le canal est une sorte de réseau privé à l’intérieur du réseau principal que nos utilisateurs pourront utiliser. Cela vous permet d’initialiser les pairs de Fabric pour rejoindre un canal.
  • Un pair d’ancrage. C’est un noeud de pairs avec une fonctionnalité supplémentaire qui permet à tous les autres pairs de découvrir et de communiquer avec celui-ci.

Créons donc ceci en éditant un fichier de configuration nommé configtx.yaml :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
touch configtx.yaml && \
vi configtx.yaml

Collez ceci dedans :

################################################################################
#
#   SECTION : Profile
#
#   - Different configuration profiles may be encoded here to be specified
#   as parameters to the configtxgen tool. The profiles which specify consortiums
#   are to be used for generating the orderer genesis block.  With the correct
#   consortium members defined in the orderer genesis block, channel creation
#   requests may be generated with only the org member names and a consortium name
#
################################################################################
Profiles:
    ChainHero:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *ChainHero
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1ChainHero
        Consortium: SampleConsortium
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *ChainHero
                    - *Org1ChainHero

################################################################################
#
#   SECTION: Organizations
#
#   - This section defines the different organizational identities which will
#   be referenced later in the configuration.
#
################################################################################
Organizations:
    - &ChainHero
        Name: ChainHero
        ID: hf.chainhero.io
        AdminPrincipal: Role.ADMIN
        MSPDir: crypto-config/ordererOrganizations/hf.chainhero.io/msp

    - &Org1ChainHero
        Name: ChainHeroOrganization1
        ID: org1.hf.chainhero.io
        AdminPrincipal: Role.ADMIN
        MSPDir: crypto-config/peerOrganizations/org1.hf.chainhero.io/msp
        AnchorPeers:
            - Host: peer0.org1.hf.chainhero.io
              Port: 7051

################################################################################
#
#   SECTION: Orderer
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for orderer related parameters.
#
################################################################################
Orderer: &OrdererDefaults
    OrdererType: solo
    Addresses:
        - orderer.hf.chainhero.io:7050
    BatchTimeout: 5s
    # Batch Size: Controls the number of messages batched into a block.
    BatchSize:
        # Max Message Count: The maximum number of messages to permit in a batch.
        MaxMessageCount: 10
        # Absolute Max Bytes: The absolute maximum number of bytes allowed for
        # the serialized messages in a batch. If the "kafka" OrdererType is
        # selected, set 'message.max.bytes' and 'replica.fetch.max.bytes' on the
        # Kafka brokers to a value that is larger than this one.
        AbsoluteMaxBytes: 98 MB
        # Preferred Max Bytes: The preferred maximum number of bytes allowed for
        # the serialized messages in a batch. A message larger than the
        # preferred max bytes will result in a batch larger than preferred max
        # bytes.
        PreferredMaxBytes: 512 KB
    # Max Channels is the maximum number of channels to allow on the ordering
    # network. When set to 0, this implies no maximum number of channels.
    MaxChannels: 0

    # Organizations is the list of orgs which are defined as participants on
    # the orderer side of the network.
    Organizations:

################################################################################
#
#   SECTION: Application
#
#   - This section defines the values to encode into a config transaction or
#   genesis block for application related parameters.
#
################################################################################
Application: &ApplicationDefaults
    Organizations:

Maintenant que notre fichier de configuration est prêt à être utilisé, créons le dossier artifacts, qui contiendra les fichiers de sortie générés par le binaire configtxgen :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
mkdir -p artifacts

Ensuite, utilisons le binaire fourni et notre fichier de configuration pour créer notre bloc initial :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
FABRIC_CFG_PATH=$PWD ./bin/configtxgen -profile ChainHero -outputBlock ./artifacts/orderer.genesis.block

Notez que nous devons définir la variable d’environnement FABRIC_CFG_PATH avec le répertoire de travail courant (qui contient la configuration) parce que le binaire trouve le fichier de configuration nommé configtx.yaml à travers cette variable d’environnement.

Maintenant qu’il a été créé, voyons comment nous créons le canal :

FABRIC_CFG_PATH=$PWD ./bin/configtxgen -profile ChainHero -outputCreateChannelTx ./artifacts/chainhero.channel.tx -channelID 
chainhero

Enfin, nous avons besoin d’un noeud de pairs qui s’appelle le pair d'ancrage :

FABRIC_CFG_PATH=$PWD ./bin/configtxgen -profile ChainHero -outputAnchorPeersUpdate ./artifacts/org1.chainhero.anchors.tx 
-channelID chainhero -asOrg ChainHeroOrganization1

3. Docker-Compose

Pour communiquer et lancer notre réseau qui sera basé sur Docker, nous devons utiliser Docker-Compose. C’est un outil utile qui nous permettra de lancer plusieurs dockers en même temps.

Si vous avez besoin d’installer docker-compose, je vous redirige vers un de nos tutoriels dans lequel nous expliquons étape par étape comment installer docker et docker-compose.

Une fois l'installation réussie, nous pouvons passer à la suite et commencer la mise en œuvre de notre configuration réseau.

Créez maintenant un fichier nommé docker-compose.yaml et collez-y les lignes suivantes :

version: '2'

networks:
  default:

services:

  orderer.hf.chainhero.io:
    image: hyperledger/fabric-orderer:x86_64-1.0.5
    container_name: orderer.hf.chainhero.io
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_LISTENPORT=7050
      - ORDERER_GENERAL_GENESISPROFILE=ChainHero
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=hf.chainhero.io
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
      - ./artifacts/orderer.genesis.block:/var/hyperledger/orderer/orderer.genesis.block
      - ./crypto-config/ordererOrganizations/hf.chainhero.io/orderers/orderer.hf.chainhero.io/msp:/var/hyperledger/orderer/msp
      - ./crypto-config/ordererOrganizations/hf.chainhero.io/orderers/orderer.hf.chainhero.io/tls:/var/hyperledger/orderer/tls
    ports:
      - 7050:7050
    networks:
      default:
        aliases:
          - orderer.hf.chainhero.io

  ca.org1.hf.chainhero.io:
    image: hyperledger/fabric-ca:x86_64-1.0.5
    container_name: ca.org1.hf.chainhero.io
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca.org1.hf.chainhero.io
      - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.hf.chainhero.io-cert.pem
      - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/--HERE--
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.hf.chainhero.io-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/--HERE--
    ports:
      - 7054:7054
    command: sh -c 'fabric-ca-server start -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/org1.hf.chainhero.io/ca/:/etc/hyperledger/fabric-ca-server-config
    networks:
      default:
        aliases:
          - ca.org1.hf.chainhero.io

  peer0.org1.hf.chainhero.io:
    image: hyperledger/fabric-peer:x86_64-1.0.5
    container_name: peer0.org1.hf.chainhero.io
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_ATTACHSTDOUT=true
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_NETWORKID=chainhero
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt
      - CORE_PEER_ID=peer0.org1.hf.chainhero.io
      - CORE_PEER_ADDRESSAUTODETECT=true
      - CORE_PEER_ADDRESS=peer0.org1.hf.chainhero.io:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.hf.chainhero.io:7051
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
      - CORE_PEER_LOCALMSPID=org1.hf.chainhero.io
      - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp
      - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer0.org1.hf.chainhero.io
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.hf.chainhero.io/peers/peer0.org1.hf.chainhero.io/msp:/var/hyperledger/msp
      - ./crypto-config/peerOrganizations/org1.hf.chainhero.io/peers/peer0.org1.hf.chainhero.io/tls:/var/hyperledger/tls
    ports:
      - 7051:7051
      - 7053:7053
    depends_on:
      - orderer.hf.chainhero.io
    links:
      - orderer.hf.chainhero.io
    networks:
      default:
        aliases:
          - peer0.org1.hf.chainhero.io

  peer1.org1.hf.chainhero.io:
    image: hyperledger/fabric-peer:x86_64-1.0.5
    container_name: peer1.org1.hf.chainhero.io
    environment:
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      - CORE_VM_DOCKER_ATTACHSTDOUT=true
      - CORE_LOGGING_LEVEL=DEBUG
      - CORE_PEER_NETWORKID=chainhero
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/var/hyperledger/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/var/hyperledger/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/var/hyperledger/tls/ca.crt
      - CORE_PEER_ID=peer1.org1.hf.chainhero.io
      - CORE_PEER_ADDRESSAUTODETECT=true
      - CORE_PEER_ADDRESS=peer1.org1.hf.chainhero.io:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.hf.chainhero.io:7051
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
      - CORE_PEER_LOCALMSPID=org1.hf.chainhero.io
      - CORE_PEER_MSPCONFIGPATH=/var/hyperledger/msp
      - CORE_PEER_TLS_SERVERHOSTOVERRIDE=peer1.org1.hf.chainhero.io
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    volumes:
      - /var/run/:/host/var/run/
      - ./crypto-config/peerOrganizations/org1.hf.chainhero.io/peers/peer1.org1.hf.chainhero.io/msp:/var/hyperledger/msp
      - ./crypto-config/peerOrganizations/org1.hf.chainhero.io/peers/peer1.org1.hf.chainhero.io/tls:/var/hyperledger/tls
    ports:
      - 8051:7051
      - 8053:7053
    depends_on:
      - orderer.hf.chainhero.io
    links:
      - orderer.hf.chainhero.io
    networks:
      default:
        aliases:
          - peer1.org1.hf.chainhero.io

Attention, vous devez changer quelque chose dans le fichier !

Dans le fichier 'docker-compose.yaml', vous devez remplacer LES DEUX --HERE-- par le nom du fichier de clé de certificat situé à :

heroes-service-network/crypto-config/peerOrganizations/org1.hf.chainhero.io/ca/

Cependant, comme vous l’avez peut-être vu, il y a 2 fichiers qui se trouvent ici (le certificat et la clé), le nom du fichier que vous devez copier devrait être quelque chose comme ça (il se finit par _sk) :

943fcd5dd60bfc47beeaa0a4736f75c0b0acbe13efb95cb5444e83cf12e0521b_sk

4. Conclusion

Maintenant que votre réseau Hyperledger-Fabric est parfaitement configuré, vous pouvez le lancer :

cd $GOPATH/src/github.com/chainHero/heroes-service-network && \
docker-compose up -d

Si tout fonctionne bien, vous devez voir la même sortie affichée ci-dessus après l’exécution de la commande docker ps

Profitez de votre premier réseau Hyperledger Fabric !

Vous pouvez maintenant construire votre application ! Pour aller plus loin, suivez le tutoriel pour créer votre première application : https://chainhero.io/2018/03/tutorial-hyperledger-fabric-sdk-go-how-to-build-your-first-app-v1-0-5/

Publié par Antoine Chabert