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).
- 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
- Installation de la lib python bitcoin (done lors des étapes précédentes, mais au cas où)
sudo pip install bitcoin
- Mise à jour de la lib
sudo pip install --upgrade bitcoin
- 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).
- 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
- Exécution de la commande en super-user
sudo python mk_genesis_block.py --extradata 0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa > genesis_block.json
- Maintenant c’est cohérent:
Listed purchases Computed purchases Finished, total purchased: 60108506260000000000000000 Foundation wallet creator address: 5abfec25f74cd88437631a7731906932776356f9 Foundation balance: 11901484239480000000000000
On continue !
- 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).
- 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.
Cet article a 2 commentaires
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
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…