Tuto: installer son environnement de test Bitcoin Core

Il ne s’agissait à l’origine que d’un aide-mémoire, mais j’ai décidé d’en faire un post de blog pour qu’il puisse servir à d’autres personnes dans la même situation que moi.

J’ai commencé à suivre ces dernières semaines les réunions hebdomadaires animées par John Newbery sur irc. Ces réunions ont pour but d’analyser chaque semaine un pull request (proposition de modification du code) sur Bitcoin Core, et il est demandé aux participants de compiler une version précise de Bitcoin sur Github (une branche, dans le jargon de git) pour pouvoir comparer les changements apportés dans le code et exécuter les tests.

N’étant pas développeur, j’étais vraiment peu à l’aise avec ça. Je pense que je n’étais pas le seul, et John Newbery nous a donné quelques indications sur ses méthodes de travail personnelles, que j’ai essayé de résumer ici sous une forme plus lisible.

L’objectif est d’installer Bitcoin Core dans une VM avec Vagrant, puis de copier en local une branche spécifique, compiler, faire les tests et visualiser les modifications du code.

Cet article vise à partager ce que j’ai appris, mais peut certainement être amélioré. J’envisage notamment de remplacer Virtualbox par Docker, mais je n’évalue pas encore bien le pour et le contre.

Prérequis : Vagrant et Virtualbox

Virtualbox est un logiciel de virtualisation, c’est-à-dire qu’il permet d’émuler un système d’exploitation au sein d’un environnement virtuel sur votre ordinateur.

Vagrant est un autre logiciel qui simplifie la configuration et la gestion des VM (Virtual Machines) de Virtualbox.

Si vous êtes sur Linux Ubuntu, il suffit d’ouvrir un terminal et d’installer ces deux logiciels avec le gestionnaire de packages :

sudo apt install virtualbox && sudo apt install vagrant

Pour Windows et MacOS, suivez les instructions sur leur site respectif.

btc-dev

Le fichier de configuration Vagrant de John Newbery est disponible dans ce repo Github. Il vous suffit donc de cloner ce repo et celui de Bitcoin Core dans un même dossier en local :

git clone https://github.com/jnewbery/btc-dev.git && git clone https://github.com/bitcoin/bitcoin.git

Maintenant, vous n’avez plus qu’à effectuer une ligne de commande dans le dossier btc-dev :

cd btc-dev

vagrant up

La VM va se configurer toute seule, ce qui peut prendre un peu de temps.

Checkout la bonne branche

Maintenant vous pouvez ouvrir un terminal dans votre VM, puis vous rendre dans le dossier bitcoin qui se trouve à la racine.

vagrant ssh

cd /bitcoin

Afin de pouvoir télécharger facilement les branches correspondantes à une pull request précise, nous allons ajouter une ligne dans le fichier .git/config. Ouvrez ce fichier avec votre éditeur de texte préféré, et localisez la section suivante :

[remote "origin"]
	fetch = +refs/heads/*:refs/remotes/origin/*
	url = git@github.com:bitcoin/bitcoin.git

Ajoutez la ligne suivante en bas de cette section :

fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Désormais, vous pouvez ajouter toutes les pull requests avec git fetch origin puis git checkout pr/$PR (en remplaçant $PR par le numéro de la pull request qui vous intéresse), ou alors télécharger une branche précise et l’ajouter à votre repo en local avec une seule ligne git fetch origin pull/7324/head:pr-7324. Plus d’info sur ces manipulations dans ce gist.

Compiler

Pour compiler le code de la branche dans laquelle vous vous trouvez, il suffit d’exécuter une à une les commandes suivantes :

./autogen.sh

./configure

(Attention si vous utilisez mon fichier de bootstrap, la commande sera la suivante : ./configure BDB_LIBS="-L${BDB_PREFIX}/lib -ldb_cxx-4.8" BDB_CFLAGS="-I${BDB_PREFIX}/include")

make

Lire le code

Vous pouvez identifier les commits relatifs à cette pull request avec git log --oneline upstream/master.., puis voir les modifications d’un commit à l’autre avec la ligne suivante :

git diff $A..$B (A étant le commit le plus ancien).

Vous pouvez aussi explorer toutes les modifications par commit avec la commande suivante, mais il faut être vraiment à l’aise avec difftool, personnellement j’ai encore des difficultés avec ça !

for commit in `git log master..HEAD --oneline | cut -d' ' -f1 | tac`; do git log -1 $commit; git difftool ${commit}{^,} --dir-diff; done

Exécuter les tests

make check

test/functional/test_runner.py

En savoir plus

Si vous êtes intéressé par les aspects techniques du développement de Bitcoin, vous trouverez toutes les informations pour participer au PR Review Club ici.

Il y a certainement des choses inexactes ou qui peuvent être améliorées dans cet article, donc n’hésitez pas à me laisser un commentaire.

[EDIT 25/09/2019] Quelques modifications sur la commandes make et les tests. J’ai eu des soucis ces derniers temps avec le fichier bootstrap.sh proposé par John Newbery, j’ai donc fait ma propre version, beaucoup plus rudimentaire, mais qui semble marcher pour l’instant : https://github.com/BobleChinois/btc-dev/tree/bootstrap_failed_workaround.

Leave a Reply

Your email address will not be published.Required fields are marked *

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