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
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/