Vos premiers développements sur la blockchain Ethereum - Partie 1

1.    Prémices

La blockchain est la technologie qui fait énormément parler d’elle en ce moment. Que vous n’en ayez jamais entendu parler, que vous soyez sceptique et tout simplement curieux, je vous propose d’explorer les possibilités de la blockchain Ethereum, par la pratique. Nous commencerons par survoler les principes de base de la blockchain, puis nous mettrons en place l’environnement de travail, de l’installation du client Geth à la configuration d’un réseau blockchain privé à 4 nœuds en local. Enfin, nous terminerons par la création d’un contrat Ethereum.

2.    La blockchain ?

La blockchain est née en 2009 à la création de la crypto-monnaie Bitcoin. Son but était de combler les lacunes des précédentes crypto-monnaies et de mettre en place la gestion d’une monnaie de manière totalement décentralisée. La décentralisation nécessite l’entente entre les parties. En effet, le problème majeur lorsque l’on souhaite gérer un registre de données dans un système sans autorité centrale, c’est comment mettre d’accord les différents acteurs ? Le principe d’un système réparti, c’est que chaque partie possède les données et elles doivent se mettre d’accord sur les modifications de ces dernières. Alors comment être sûr qu’une partie ne va pas tricher en modifiant ses données ? Qu’est-ce qui légitime l’ajout de données dans le registre ? Sa validité ?

C’est à ce niveau qu’intervient la blockchain. La chaîne de blocs est une succession de blocs horodatés, contenants des données et qui doivent êtres validés par consensus par les nœuds du réseau distribué. Actuellement, sur la plupart des plateformes, la preuve de validité d’un bloc est appelée preuve de travail (Proof-of-Work). Trouver cette preuve demande énormément de ressources. C’est pourquoi, à chaque bloc ajouté à la blockchain, le mineur se voit verser un certain montant de crypto-monnaie, fraîchement créée. La complexité ainsi que le chainage des blocs les uns à la suite des autres font qu’il est difficile avec les méthodes d’aujourd’hui de falsifier ou supprimer les données de la blockchain. Pour modifier une donnée d’un bloc, il faut refaire valider l’ensemble des blocs qui le suivent, avant qu’un autre nœud n’ajoute un nouveau bloc à la chaine. Les nœuds qui cherchent la preuve de validité sont appelés les mineurs et l’opération s’appelle le minage.

Les données inscrites à l’intérieur des blocs peuvent êtres de différentes natures suivant la blockchain. Elles sont toutes stockées dans des transactions distinctes. Une transaction est un « échange » faisant intervenir plusieurs parties entres elles. Dans la première « version » des blockchains (type Bitcoin), les données sont des transactions financières entre plusieurs comptes. Il est également possible d’inscrire de la donnée en annexe (Cf. Namecoin). Mais c’est la seconde génération de blockchain qui possède le plus gros potentiel. Elle est née fin 2013 avec l’apparition d’Ethereum. Ethereum propose de stocker dans la blockchain, du code exécutable par une machine virtuelle (EVM) présente dans chaque nœud. Ce code exécutable est appelé contrat et ouvre la porte à de nombreuses possibilités.

De la même manière que Bitcoin permet de se passer d’intermédiaires financiers en connectant les demandeurs et bénéficiaires entres eux, Ethereum permet de se passer de l’ensemble des intermédiaires dont le travail peut être automatisé par du code fonctionnel. Il est possible d’imaginer le prochain Uber sur la blockchain, le prochain Airbnb, mais également d’automatiser les remboursements santé ou encore la déclaration et le paiement des impôts. Supprimant ainsi toute possibilité de fraude. En liant cette technologie avec le monde de l’IOT, c’est toute une société qui peut évoluer. Avec la blockchain, le monde de demain se veut plus transparent. Mais assez bavardé, passons à la pratique !

3.    Description

Avant de commencer à manipuler notre client ethereum, je vais vous présenter l’objectif de cette mise en pratique. Par défaut, le client se connecte automatiquement sur le réseau principal : Homestead. Chaque action effectuée sur ce réseau nécessite de l’ether (la crypto-monnaie d’Ethereum). L’ether ne peut s’obtenir qu’en minant, ou en contrepartie d’un autre élément de valeur (service, produit, devise, …). Le but n’étant pas de vous ruiner, ni de passer plusieurs années à miner pour gagner quelques unités, nous allons créer notre propre réseau privé, isolé de l’instance public de la blockchain Ethereum.

Le réseau sera composé de plusieurs nœuds. Chaque nœud sera représenté par une instance de notre client. Pour avoir 4 nœuds, je vais donc lancer 4 fois le client, sur des processus différents. Nos 4 nœuds vont communiquer ensemble sur le réseau local de notre ordinateur. Nous pourrons interagir avec nos nœuds, et leur demander d’effectuer des actions, grâce à l’environnement Javascript en ligne de commande intégrée au client. Pour simuler le comportement de nœuds indépendants, chaque nœud travaillera dans un répertoire séparé. Ce répertoire contiendra la blockchain, ainsi que des informations liées au nœud. Comme son identité, ou les comptes qu’il héberge. Voici un schéma résumant ce que nous allons mettre en place (Fig.1)

blockchain

Fig.1 : Architecture de l’environnement

4.    Installation

Commençons tout d’abord par l’installation du client qui servira à communiquer avec notre réseau privé. La communauté Ethereum étant très active, des clients sont implémentés sur bon nombre de technologies. On y retrouve Eth (C++), Geth (Golang), Pyethapp (Python), Parity (Rust), EthereumJS (Javascript) ou encore ethereum-haskell (Haskell). Dans cette introduction, nous utiliserons le client Geth, implémenté en Golang, et travaillerons sous Ubuntu 16.04 LTS. Geth est le client le plus utilisé sur le réseau principal d’Ethereum : Homestead.

Pour l’installer, il suffit de mettre à jour le gestionnaire de paquet apt et d’ajouter les dépôts d’ethereum à la liste des paquets :

apt-get update

apt-get install -y software-properties-common

add-apt-repository -y ppa:ethereum/ethereum
 add-apt-repository -y ppa:ethereum/ethereum-dev
 apt-get update

Nous pouvons à présent installer geth ainsi que le compilateur solidity (solc) :

apt-get install –y ethereum solc

5.    Initialisation de la blockchain

Pour être sûr de pouvoir évoluer dans un environnement contrôlé, nous allons mettre en place une blockchain privée. À ce stade, la blockchain n’existe pas encore. Il faut donc créer manuellement le premier bloc de cette chaîne. Ce premier bloc contient l’ensemble des caractéristiques de départ de notre blockchain et doit être partagé à l’ensemble des noeuds. Pour définir ce bloc, il faut créer un fichier au format json contenant cette structure :

{
 "nonce": "0x00",
 "difficulty": "0x1000",
 "mixHash": "0x00",
 "timestamp": "0x00",
 "parentHash": "0x00",
 "extraData": "0x00",
 "gasLimit": "0x1000000000"
 }

Plusieurs paramètres sont à renseigner :

  • Le nonce est le hash que le mineur va devoir faire varier et trouver pour résoudre la preuve de travail. Il est complémentaire au mixhash et sert à vérifier que le bloc est valide.
  • Mixhash est le hash de l’entête du bloc, sur lequel va se baser le mineur pour trouver le nonce.
  • Le timestamp permet au client de réguler le temps entre la validation de 2 blocs successifs et de vérifier le bon enchainement des blocs. Il est initialisé à 0 pour indiquer qu’il s’agit du premier bloc.
  • Le parentHash est le hash du bloc précédent. Etant donner qu’il s’agit du premier bloc, ce hash vaut 0.
  • ExtraData est facultatif et permet de stocker de la données (32 octets max), sur la blockchain.
  • GasLimit est le montant maximum de gas que les contrats peuvent consommer. Au dessus de la limite, le contrat ne pourra pas être ajouté au bloc. Nous reverrons la notion de gas lors de la création de notre premier contrat.
  • Difficulty correspond à la difficulté de la preuve de travail de ce bloc. Elle a un impact sur la rapidité de validation des blocs et donc la création d’ether. Nous mettons une valeur faible pour ne pas perdre de temps sur la validation de nos blocs et générer rapidement de l’ether. Cette valeur, couplée au timestamp, va permettre au client de fixer la difficulté de la prochaine preuve de travail, pour conserver un temps de validation linéaire.

Une fois ce fichier renseigné, nous pouvons demander au client de créer le dossier contenant la blockchain (chaindata) et de l’initialiser.

geth --datadir ./noeud1 --networkid "100" init genesis.json

Networkid est le flag qui va identifier notre réseau et permettre aux pairs de nous rejoindre. Étant donné que nous sommes sur un réseau privé, sa valeur n’a pas d’importance. Elle doit cependant être différente des identifiants des réseaux publics (> 2). À partir de maintenant, les flags datadir et networkid seront obligatoires pour appeler le client geth, car ils identifient respectivement le répertoire de travail et l’identifiant du réseau.

Pour pouvoir faire tourner 4 nœuds sur le réseau local de notre poste, l’astuce est simplement de changer le répertoire des données (datadir). Nous initialisons donc la blockchain des 3 autres nœuds en exécutant 3 fois la commande précédente et en modifiant le datadir par ./noeud{2,3,4}.

6.    Création d’un compte

Réaliser des transactions, créer et interagir avec des contrats, nécessite un compte contenant de l’ether. Voici comment en créer un nouveau.

geth --datadir ./noeud{1-4} --networkid "100" account new

La console vous demande de saisir un mot de passe. Ce sera le seul moyen d’accès au porte-monnaie et pour réaliser des transactions. Le message retourné correspond à votre clé publique. C’est celle qui identifie votre compte et qui vous identifie sur la blockchain.

Address: {620a3e52cb988acc3b985475b0639bdb49577d44}

Le client crée le répertoire keystore qui sert à conserver les identifiants de votre compte (clé privée et clé publique). Ces données sont chiffrées (AES 128-bit) avec votre mot de passe. Votre mot de passe est donc la seule donnée que vous ne devez absolument pas divulguer.

Répétez cette opération dans les 3 répertoires de données pour créer un compte sur chaque nœud.

7.    Lancer le client

A présent, lançons nos nœud (de 1 à 4) avec les différents paramètres relatifs au schéma Fig.1 :

geth --datadir ./noeud{1-4} --networkid "100" --port "3030{1-4}" console
  • port : définit le numéro de port sur lequel les autres nœuds viendront se connecter. On utilise un port différent pour chaque nœud car tout les nœuds seront sur la même adresse (127.0.0.1).
  • console : lance un environnement Javascript possédant l’ensemble des outils d’interaction avec le nœud.

 

Info: Il est également possible d’interagir avec un nœud via http, websocket et ipc.

Vous pouvez à présent demander des informations sur le nœud.

> admin.nodeInfo

{
 enode: "enode://ff581ffb37a1f387e50c8e17e103cfcf0caadc32cd9b6ff4f1762edff2a5d5ca317a186aab68714c8ec77db854de88fb6683f8361f27c9078461521869f1dff1@[::]:30301",
 id: "ff581ffb37a1f387e50c8e17e103cfcf0caadc32cd9b6ff4f1762edff2a5d5ca317a186aab68714c8ec77db854de88fb6683f8361f27c9078461521869f1dff1",
 ip: "::",
 listenAddr: "[::]:30301",
 name: "Geth/v1.5.0-unstable/linux/go1.6.1",
 ports: {
 discovery: 30301,
 listener: 30301
 },
 protocols: {
 eth: {
 difficulty: 4096,
 genesis: "0x5a65940292cbb5cefe79c39624d6dd228a696c96cc86ead9bde58f94cda96da3",
 head: "0x5a65940292cbb5cefe79c39624d6dd228a696c96cc86ead9bde58f94cda96da3",
 network: 100
 }
 }
 }

L'objet Javascript retourné comporte plusieurs informations, comme l'identifiant du nœud (enode) ou encore les paramètres de la blockchain (protocols.eth).

8.    Connecter les nœuds

Pour le moment, nos 4 nœuds se trouvent sur le même réseau et possèdent la même base de blockchain. Mais ils ne se connaissent pas et ne sont pas capables de communiquer ou même de synchroniser leur blockchain. Étant donné qu’il s’agit d’un réseau pair à pair, il faut connecter les nœuds entres eux. Dans ethereum, chaque nœud est identifié par un enode. Pour que le client se connecte à un autre nœud sur le même réseau, il faut récupérer son identifiant (> admin.nodeInfo.enode) et appeler la méthode :

> admin.addPeer({enode du nœud sur lequel se connecter})

Vous pouvez vérifier que vous êtes bien connecté à des nœuds en affichant leurs informations.

> admin.peers

Une liste contenant les admin.nodeInfo des nœuds connectés doit être retournée.

A partir de maintenant, vos nœuds sont connectés, et vont pouvoir commencer à synchroniser leur blockchain.

 

Guillaume Nicolas

Ingénieur Développeur, SQLI Nantes

5 commentaires
  1. Lek dit :

    Bonjour,
    une question bête sur l’utilité de la blockchaine : si de manière privée je désire pouvoir prouver que toutes mes données n’ont pas été modifiées dans ma base de données (audatibilité de mon application), je n’ai pas besoin du tout de la blockchain, j’ai juste besoin que mon application intègre dans chaque enregistrement une signature de l’enregistrement précédent non ?

    Merci pour votre réponse.

    Répondre
    • NICOLAS G. dit :

      Bonjour,

      Le problème avec cette façon de faire c’est que la personne en charge de l’audit va devoir faire CONFIANCE à votre BDD, dans le sens où elle ne sait pas ce qu’il s’est réellement passé avant l’audit. Il est toujours possible pour vous (comme vous êtes administrateur de votre BDD) d’aller modifier l’historique, les logs ou toute trace qui pourrait prouver que vous avez altéré la base.

      Pour rappel, la blockchain est utile lors ce qu’il y a un problème de confiance lors d’échanges entre plusieurs parties.
      Dans votre contexte, on imagine que les parties prenantes sont : vous et l’entreprise d’audit.
      La mise en place d’une blockchain permettrait en temps réel de certifier à l’entreprise d’audit que vous ne trichez pas dans votre coin, car chaque modification serait partagée directement.
      Je tiens également à vous faire remarquer que l’entreprise d’audit est un intermédiaire chargé d’assurer aux autres parties liées à votre application (utilisateur, législation, financement,…) que la BDD fonctionne comme spécifiée. Rien de plus. La blockchain pourrait donc permettre de supprimer cet intermédiaire (et au passage de diminuer les coûts).
      http://www.journaldunet.com/economie/finance/1185858-a-cause-de-la-blockchain-les-auditeurs-vont-changer-de-metier/.

      En espérant avoir répondu à votre interrogation.

      Répondre
  2. Julie dit :

    Merci pour votre article sur la blockchain qui est tout à fait intéressant et bien détaillé, il est important de parler de cette technologie qui est clairement la valeur sûre pour notre avenir. Même si les monnaies virtuelles comme le bitcoin par exemple atteignent leurs limites à un moment ou l’autre, la blockchain elle nous permettra de faciliter beaucoup de tâches.

    Répondre
  3. lecomte dit :

    Bonjour,
    Merci pour votre article bien écrit. Je bloque sur la dernière phrase du point 6 : « Répétez cette opération dans les 3 répertoires de données pour créer un compte sur chaque nœud. »
    Pouvez vos expliciter plus cette instruction ou me dire ou trouver l’info sur la commande « geth »?
    Merci beaucoup

    Répondre
  4. Wend dit :

    Bonjour,
    Articles très passionnant,
    Mais comment pourrait ont intégré des données autre que des transaction, dans une blockchain, tel que des cordonnées GPS, des identités et leur restitution à une personne parcourant la blockhain. Merci
    Bien a vous.

    Répondre

votre commentaire

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Inscription newsletter

Ne manquez plus nos derniers articles !