blockchain_network

Ethereum – Création d’un réseau privé de test

Dans ce premier article de la série sur Ethereum suivant l’article d’introduction, je vais vous présenter les démarches que j’ai effectués afin de déployer un réseau privé sur ma machine.

1ère Étape: Installation

Comme indiqué ici la première étape est d’installer l’environnement et les utilitaires en ligne de commande. Nous avons alors le choix entre trois implémentations:

  • une en C++ apparemment à privilégier pour le développement ayant trait au IoT
  • une en Go apparemment à privilégier pour le développement ayant trait au Frontend ?
  • une en Python apparemment à privilégier pour le développement d’applications distribuées basées sur les fondations d’Ethereum

Installation de Eth

Disclaimer: Finalement je ne me sers pas de Eth, mais de Geth, l’implémentation en Go du client ethereum. Si vous le souhaitez, vous pouvez donc passer cette section et aller directement à la section “Installation de Geth

J’opte tout naturellement pour la troisième solution, ce qui nous renvoie ici. Le processus d'”install from source” demande de cloner les sources puis d’exécuter la commande:

python setup.py install

Cette commande est un échec, mais j’ai perdu la stack. Je tente donc l’installation via l’utilitaire Python Pip (voir README du projet Github)

pip install pyethapp

Après divers téléchargements et exécutions d’installation de dépendances, erreurs encore:

command 'x86_64-linux-gnu-gcc' failed with exit status 1

D’après Stack-overflow il me manquerait des librairies Python (plausibles, je ne suis pas un aficionados de Python). J’installe donc les libs python-dev et libevent-dev :

sudo apt-get install python-dev 
sudo apt-get install libevent-dev

Je relance :

pip install pyethapp

Erreurs encore, mais sur l’absence de la librairie libffi. Voir le message dans la stack trace :

No package 'libffi' found
c/_cffi_backend.c:13:17: fatal error: ffi.h: No such file or directory
#include <ffi.h>

En parallèle, je me suis lancé dans l’installation de Geth, l’implémentation en Go, et tout s’est bien passé lors de l’exécution de la commande précisée dans la doc:

bash <(curl https://install-geth.ethereum.org -L)

Ce bash demande les droits d’admin, vérifie notre distribution, et ensuite se comporte comme un grand.
Revenons donc à nos moutons. Installation de la librairie libffi:

sudo apt-get install libffi6 libffi-dev
pip install pyethapp

La compilation (build) semble maintenant bien se passer mais un message d’erreur arrive finalement:

Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_balessan/CodernityDB/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-Nk0bhH-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip_build_balessan/CodernityDB
Storing debug log for failure in /home/balessan/.pip/pip.log

Cela ressemble à une impossibilité d’accèder ou d’écrire dans certains répertoires à la racine du disque. Après tentative, une exécution via sudo (donc avec les droits root) a réglé le problème donc:

sudo pip install pyethapp

Sortie de la console:

Successfully installed CodernityDB pyyaml leveldb ethereum gevent gipc pbkdf2 devp2p statistics werkzeug scrypt ipython repoze.lru pysha3 bitcoin pycryptodome pyethash greenlet ipaddress pyelliptic tox tinyrpc coverage c-secp256k1 docutils pickleshare simplegeneric traitlets pluggy py cffi path.py ipython-genutils pycparser
Cleaning up...

Ca parait pas mal, plus qu’à comprendre comment ça fonctionne !

Nota Bene : Finalement je ne vais pas me servir de l’implémentation Python tout de suite, car mes tests suivants ne sont pas limités par le choix de Geth plutôt que Eth.

Installation de Geth

Pour installer Geth, rien de plus simple. La documentation officielle fournit la commande, qui est la suivante (sur Mac et Linux):

bash <(curl https://install-geth.ethereum.org -L)

Je n’ai pas conservé de copie de la sortie de la console, mais de mémoire tout s’était bien passé à la première tentative.

2ème étape: Utilisation de Geth

Pour entrer dans la console interactive fournie à l’installation de Geth, il suffit d’entrer:

geth console

Suite à cette commande, j’entre temporairement dans ce qui ressemble à une invite de commandes, puis blockchain commence à réaliser des transactions ? WTF ?

Information importante dans la documentation:

ATTENTION: If you just want to test the technology and play  around, DON’T USE THE MAIN NETWORK. Read further to find out how to  deploy a private test network without spending your ether.

Donc déploiement d’un réseau de test avant d’aller plus loin !

3ème étape: Déploiement du réseau

Avant de pouvoir exécuter la commande de déploiement du réseau de test, il faut apparemment créer un fichier genesis.
Pour cela, suivre les instructions présentes dans ce post de blog (que je vais résumer ici).

  1. Récupération du script de génération du fichier
curl -O https://raw.githubusercontent.com/ethereum/genesis_block_generator/master/mk_genesis_block.py
  1. Installation de la lib python bitcoin (done lors des étapes précédentes, mais au cas où)
sudo pip install bitcoin
  1. Mise à jour de la lib
sudo pip install --upgrade bitcoin
  1. Génération du fichier, après avoir fouillé pour trouver le bon hash
python mk_genesis_block.py --extradata 0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa > genesis_block.json

Là le process réfléchit (enfin fais plein de trucs quoi).

  1. Finalement une erreur apparait
Traceback (most recent call last):
File "mk_genesis_block.py", line 293, in <module>
print json.dumps(evaluate(), indent=4)
File "mk_genesis_block.py", line 285, in evaluate
p = list_purchases(th)
File "mk_genesis_block.py", line 224, in list_purchases
t = get_block_timestamp([x['height'] - 1 for x in subpq])
File "mk_genesis_block.py", line 153, in new_method
c[str(arg)] = method(arg)
File "/usr/local/lib/python2.7/dist-packages/bitcoin/bci.py", line 472, in get_block_timestamp
"%Y-%m-%dT%H:%M:%SZ")) for x in k['data']}
TypeError: 'NoneType' object is not iterable
  1. Exécution de la commande en super-user
sudo python mk_genesis_block.py --extradata 0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa > genesis_block.json
  1. Maintenant c’est cohérent:
Listed purchases
Computed purchases
Finished, total purchased: 60108506260000000000000000
Foundation wallet creator address: 5abfec25f74cd88437631a7731906932776356f9
Foundation balance: 11901484239480000000000000

On continue !

  1. On lance le réseau privé:
geth --networkid 12345 --genesis ~/blockchain/genesis_block.json --datadir ~/.ethereum_experiment console

Dans les arguments, l’argument --genesis ~/blockchain/genesis_block.json est le chemin vers le fichier genesis_block.json généré précédemment et l’argument  --datadir ~/.ethereum_experiment console  est le chemin vers le répertoire dans lequel vous souhaitez stocker les données concernant votre réseau, à modifier selon votre envie (en notant tout de même que le chemin par défaut pour le stockage des informations est ~/.ethereum/, donc évitez de l’occuper si vous souhaittez vous raccrocher à la blockchain publique plus tard).

  1. Nous arrivons alors sur une invite de commandes:
instance: Geth/v1.3.3/linux/go1.5.1
datadir: /home/balessan/.ethereum_experiment
coinbase: null
at block: 0 (Thu, 01 Jan 1970 01:00:00 CET)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
>

Maintenant, pour tester quoi que ce soit on saute à la section “Creating Accounts” dans la documentation. Pour mon besoin, qui est d’investiguer les mécanismes de transaction et les applications possibles des smarts contracts, j’ai créé deux comptes différents, en utilisant bien évidemment la commande:

personal.newAccount("Ta super passphrase de la mort qui tue !")

Je peux ensuite vérifier la création de mes comptes via la commande:

> eth.accounts

Qui me confirme la creation de deux comptes:

> ["0xaf51314e6a721f234e132428745e0cb99a43faa2", "0x191e265ae0814b7e23e666221a8f628250a50027"]

Conclusion

Dans cet article, je vous ai présenté le process que j’ai suivi pour arriver à avoir un réseau privé de test qui fonctionne, en partant de la documentation officielle. Dans l’article qui suit je vous présenterais comment réaliser des transactions de base et nous aborderons le sujet du minage, en pratique.

Retour à l’accueil de la série

Partage ce post

Partager sur facebook
Partager sur google
Partager sur twitter
Partager sur email

1ère section : Genève-Nantua-Maillat

Première étape de 58km jusqu’à Nantua (70 jusqu’à Maillat) pour 765m de dénivelé positif. Le départ Un départ à la fraiche vers 7h30 de Genève,

Cet article a 2 commentaires

  1. Hadrienmp

    Je crois que tu es tombé dans tous les écueils de python ;-). Dommage qu’un langage si génial puisse être si compliqué à déployer

    1. balessan

      Oui ça parait que mes soucis venaient de python. Il semble y avoir un souci de maturité du déploiement de Eth tout de même. Surtout, j’aurais économisé du temps si j’avais su qu’utiliser Geth plutôt que Eth me suffisait…

Laisser un commentaire

17 − onze =

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.