Ma première Blockchain privéesteemCreated with Sketch.

in #fr7 years ago (edited)

Bonjour à tous.
A la création de mon compte steem, j'ai tout de suite pensé à vous partager un article que j'avais commis sur mon blog (https://blog.john-at-me.net/ma-premiere-blockchain-privee/) il y a un peu plus d'un an. Le but évident est de rendre visible sur steem le contenu de l'article.
Toutefois, je ferai un résumé afin de ne pas faire trop doublon.


Introduction

Cet article a pour but de vous décrire comment se monter sa propre Blockchain Ethereum privée.
Pourquoi une blockchain privée ? Voici quelques raisons ...

  • Faire des tests (sans se coltiner le testnet)
  • Ne pas trainer le passif du réseau (la taille de blockain / la difficulté du réseau / les frais de transaction)
  • Utiliser des données à caractère privé
  • Maitriser les acteurs de la blockchain

On peut répondre à ces besoins par deux approches

  • blockchain Consortium : Plusieurs organisations souhaitent partager une blockchain. Chaque noeud est clairement identifié et ils participent tous à la sécurisation de la blockchain. Les droits d’accès sont restreints aux seuls noeuds autorisés. La blockchain peut être sur un réseau public ou privé.
  • Privée : Pour une organisation disposant d’un réseau privé, la blockchain est gérée par l’organisation et les accès en écriture sont centralisés (les accès en lecture doivent être adressés au niveau middleware)
    Dans le premier cas, il faudra établir une liste de noeuds de confiance. Le protocol de découverte devra être désactivé.
    Dans le second, la blockchain privée sera ouverte au SI. Le protocol de découverte sera activé mais ‘fine tuned’.

A noter dans les deux cas, la résilience de la Blockain est largement attaquée vu qu'on passe d'un mode décentralisé / distribué (public) à un mode centralisé (privé).

Evidemment, il est tout à fait possible d'avoir un seul noeud dans le but de test

Dans tous les cas, nous verrons l’utilisation du block Genesis.


Il était une fois la genèse

Le block genesis est le premier block d'une Blockchain (toute technologie confondue).
Il permet de définir :

  • La difficulté du réseau durant la « genèse » : La difficulté définit la puissance de calcul nécessaire pour miner un bloc. Plus elle est élevée et plus il faudra un réseau puissant
  • Pré Allocation de jeton: Permet de pré attribuer des ethers à la créationa
  • Limite des frais de transaction : Appelé GAS, Chaque transaction est « taxée » afin de protéger les resources du réseau d’un code bugué. Ce coût est définit par le consensus et reste très très très très faible. Par exemple, sur ma blockchain privée, il est actuellement de 0.00000002 ether

Le protocole de découverte

Le protocole de découverte permet de se raccorder au réseau automatiquement. Cela passe par deux techniques :

L’utilisation de protocol comme UPNP permettant de découvrir des noeuds sur un réseau local
L’utilisation de « bootnodes » écrit en dur dans le code du client du noeud. Ce sont des noeuds pré enregistrés permettant d’accrocher le réseau
Lors de l’utilisation d’une blockchaine privée dans un SI, l’idéal sera d’utiliser plusieurs bootnodes. Attention ! Ces bootnodes, devront être allumés en permanence afin de permettre aux nouveaux noeuds de joindre le réseau.


Le matos nécessaire

Le mode opératoire décrit dans cet article nécessite l'utilisation du noeud Geth en version 1.6.7 (développé en Go-lang).
L'installation du noeud est décrit dans le Github du projet : https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum

A noter que vous pouvez installer Ethereum Wallet et Mist qui sont basés sur Geth (et dispose donc de l'executable).

A titre, d'information, ces tuto, a été réalisé sous Ubuntu 16.04.


Création d'une blockchain privée

Le but sera de partager notre blockchain entre trois noeuds (dont un démarrage).

Créez les répertoires de travail.

mkdir Private
mkdir Private/NodeA
mkdir Private/NodeB
mkdir Private/NodeC



Créez les comptes sur chaque noeud

geth --datadir Private/NodeA account new
geth --datadir Private/NodeB account new
geth --datadir Private/NodeC account new



Créez le block genesis et copiez le fichier dans les autres répertoires.
Attention, le champs "alloc" permet de pré attribuer des Ethers aux comptes précédemment créés. Il faut donc remplacer les adresses dans l'exemple ci-dessous par les adresses obtenus ci-dessus.

nano Private/NodeA/genesis.json

{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x0010",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "Custem Ethereum Genesis Block",
"gasLimit": "0xffffffff",
"alloc": { 
"63df8221eb6c90cfc8700af42a92411cab58b1a2": { "balance": "10000000000000000000" },
"4d27e2a8d09bfcfb5aa59e9a5b9165b9e60dfb84": { "balance": "10000000000000000000" },
"58f76931034444fdd5dfe32623d13209bafbaf94": { "balance": "10000000000000000000" } 
}
}



Lancez la commande suivante sur chacun des noeuds afin d’initialiser le block genesis :

geth --datadir Consortium/NodeA/ init Consortium/NodeA/genesis.json
geth --datadir Consortium/NodeB/ init Consortium/NodeB/genesis.json
geth --datadir Consortium/NodeC/ init Consortium/NodeC/genesis.json



Lancez le noeud A en spécifiant

  • Networkid : identifiant du réseau

  • port : le port réseau UDP

    nohup geth --datadir Private/NodeA --port 30303 --ipcpath Private/NodeA.ipc --networkid 40001 &
    geth --ipcpath Private/NodeA.ipc attach



Récupérer l’enode avec la commande admin.nodeInfo

enode://83e5d50754211cbeed0d0ec2e4e787336ce14b1c6e98e56ac2162e6a782783c8d97422e5e1f660e6b9de57dca156823efe372e22a398701b7d6b92036c678bef@[::]:30303



Lancez les deux autres noeuds en spécifiant

  • le networkid : Identifiant du réseau.
  • Le port UDP d’écoute
  • Le noeud A comme noeud de démarrage
nohup geth --datadir Private/NodeB --port "30304" --ipcpath Private/NodeB.ipc --networkid 40001 --bootnodes "enode://83e5d50754211cbeed0d0ec2e4e787336ce14b1c6e98e56ac2162e6a782783c8d97422e5e1f660e6b9de57dca156823efe372e22a398701b7d6b92036c678bef@127.0.0.1:30303" &
nohup geth --datadir Private/NodeC --port "30305" --ipcpath Private/NodeC.ipc --networkid 40001 --bootnodes "enode://83e5d50754211cbeed0d0ec2e4e787336ce14b1c6e98e56ac2162e6a782783c8d97422e5e1f660e6b9de57dca156823efe372e22a398701b7d6b92036c678bef@127.0.0.1:30303" &



Vérifiez la bonne connexion des noeuds (celà peut peut prendre 1 minute). La commande admin.peers doit afficher les noeuds connectés

Sur le NodeA, lancez le mineur (Il faut au moins un mineur permanent)

miner.start()



Vérifiez le compte sur le noeud A

web3.fromWei(eth.getBalance(eth.coinbase),"ether")
10



Pour vérifier le bon fonctionnement de notre blockchain nous allons faire une transaction de A vers B

Récupérez le compte B avec la commande eth.coinbase sur la console de B
Exécutez les commandes suivantes sur A

var NodeA = eth.coinbase;
var NodeB ="0x6ab586274863352a6344033b7046e70d1d10e0dc";
var amount = web3.toWei(0.01, "ether");
sendTransaction({from:NodeA, to:NodeB, value: amount});



Afficher le contenu du compte B (depuis B)

web3.fromWei(eth.getBalance(eth.coinbase),"ether")
11

 
Pour créer une blockchain privée, il a fallut :

  • Créer des comptes sur chaque noeud
  • Définir le block genesis
  • Lancer le noeud permanent A sur l’identifiant réseau 40001
  • Lancer les autres noeuds et utiliser le noeud A pour la découverte du réseau
  • Lancer le mineur sur A afin de pouvoir valider les transactions
    A noter que même dans un réseau privé, il est recommandé d’avoir plusieurs « bootnodes » et « mineurs » afin de renforcer la sécurité et la résilience de la blockchain.

Liens utiles :

Sort:  

Hello ! Je t avoue que tout ne me parle pas du tout mais j apprécie et upvote ton article car tu as pris la peine de résumer ton article de blog à la place de le doublonner :-) excellent choix !

Merci j'ai fais au mieux. Faut dire que ce n'est pas passionant de reprendre un ancien article mais je me l'étais promis. De plus, mon blog n'est pas hyper visible sur google.
Par contre, je n'ai vu ton upvote ;)

Merci pour le tuto !

Ça a l'air relativement simple à mettre en place. Mais bon, je connais assez peu de gens qui on besoin d'une blockchain privée!
Prépare toi pour mon upvote de 3 centimes ;)

Effectivement ce n'est pas bien méchant mais je trouvais intéressant de montrer les limites d'une telle chose.
En fait, ça être utilisé dans un SI lorsqu'on veut faire du permissioned. Merci pour le upvote :)

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by evildido from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, theprophet0, someguy123, neoxian, followbtcnews/crimsonclad, and netuoso. The goal is to help Steemit grow by supporting Minnows and creating a social network. Please find us in the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

This post has received a 1.04 % upvote from @drotto thanks to: @banjo.

Coin Marketplace

STEEM 0.16
TRX 0.13
JST 0.027
BTC 58306.22
ETH 2596.07
USDT 1.00
SBD 2.39