Maîtriser Bitcoin : programmer sur la blockchain ouverte

Mastering Bitcoin francais

Programmer sur la blockchain Bitcoin : de A à Z.

Comment acheter des Bitcoins facilement ?

Comment acheter du bitcoin rapidement et facilement? Vous devez d’abord vous rendre sur un service qui va échanger vos euros contre des Bitcoins ou d’autres crypto-monnaies.

Plusieurs plateformes offrent une forme facile d’acheter Bitcoin avec PayPal, avec carte bancaire (de façon instantanée) et virement bancaire (24/72h).

Si vous voulez acheter du Bitcoin rapidement, rendez-vous sur le site sécurisé Coinbase ici.

1/ Ouvrez un compte sur Coinbase

2/ Déposez du cash sur votre compte Coinbase

3/ Achetez du Bitcoin avec votre cash.

Et l’affaire est jouée 🙂


Vous désirez comprendre comment fonctionne la programmation derrière Bitcoin ? Vous avez essayé de lire Mastering Bitcoin (d’Andréas Antonopoulos) mais vous aviez plein de messages d’erreur en tentant de suivre les instructions de programmation ?

Pour vous simplifier les choses, j’ai décidé d’écrire un article qui reprend pas à pas toutes les étapes. Cet article est une sorte de Mastering Bitcoin français pour débutant (PDF FR).

Reprenez les étapes après moi et si vous avez des interrogations, n’hésitez pas à me poser vos questions dans les commentaires afin que je vous réponde.

Cet article sera le premier d’une série technique dédiée à la programmation sur blockchain ouverte. Pour être tenu informé de la sortie des autres épisodes, vous êtes livre de vous abonner à ma newsletter. (Le second épisode sur Ethereum est ici.)

1. Compiler Bitcoin depuis le code source

Que signifie compiler Bitcoin Core ? La compilation désigne le processus de transformation d’un programme écrit dans un langage lisible par un humain (c’est-à-dire en format texte) en un programme exécutable par une machine.

Le code source de Bitcoin peut être téléchargé en tant qu’archive ou directement copié depuis le répertoire Github. En effet, il y a deux variantes du programme bitcoin original :

Ces deux variantes sont compatibles l’une avec l’autre. Elles fonctionnent de la même façon (elles lisent et écrivent les mêmes fichiers). Aussi, vous ne pouvez exécuter qu’une copie à la fois de Bitcoin ou de bitcoind sur votre système.

Nous allons procéder avec l’option des lignes de commande. C’est-à-dire en copiant le code source depuis Github.

1.1. Récupérer et configurer Ubuntu

Dans cet article, nous allons utiliser les lignes de commande en nous servant de Ubuntu. Si vous êtes sur Windows, vous pouvez le télécharger depuis Windows Store. Pensez à conserver le mot de passe que vous allez définir en créant votre compte.

En bref, Ubuntu est un sous-système Windows pour Linux. Avant de démarrer, je vous invite à lire cet article pour comprendre comme cela fonctionne dans les grandes lignes.

Ouvrez Ubuntu. Si c’est votre première ouverture, attendez un peu le temps qu’il fonctionne. Ensuite, pour configurer Ubuntu et installer les dépendances nécessaires au fonctionnement de Bitcoin Core, tapez les commandes suivantes :

sudo apt-update (apt = advanced packaging tool, actualisation d’un paquet de données). Pour info : la commande sudo vous permet d’exécuter en tant qu’administrateur. Un mot de passe vous sera demandé. Utilisez le mdp que vous avez défini au début en installant Ubuntu.

Commande sudo apt-update

sudo apt upgrade : cette commande met à jour tous les paquets que vous venez d’installer sur votre système. Cette commande prend du temps (~10 minutes).

sudo apt-get update : actualisation de vos données.

sudo apt-get install auto-conf : installation du fichier auto-conf.

sudo apt-get install libtool : installation de la librairie Libtool (contient des éléments nécessaires pour l’exécution du script autogen.sh que l’on verra plus bas). Cette commande prend également du temps.

Installation de Libtool

sudo apt-get install build-essential : installation d’éléments nécessaires (pour le script configure) tels que g++.

Installation de build-essential

dpkg -l | grep pkg-config : vérifie la présence du paquet (Debian Package -list).

sudo apt-get install pkg-config : installation de pkg-config.

Pkg config

sudo apt-get install libdb++-dev : installation de libdb.

Installation de libdb

Chaîne d’outils pour les compilations croisées :

sudo apt install g++-mingw-w64-x86-64

En fait, vous pouvez installer plusieurs dépendances en une seule fois :

sudo apt install autotools-dev automake bsdmainutils curl

Les lecteurs de cet article ont également apprécié : Le marché des CryptoPunks (NFT)

1.2. Copier le répertoire Bitcoin en local

Parfait. Vous venez de terminer l’installation des dépendances sous Ubuntu. Maintenant, pour copier le répertoire Bitcoin en local, vous allez utiliser la commande git.

Cette commande vous permet de créer une copie locale (clone) du source code:

$ git clone https://github.com/bitcoin/bitcoin.git

Copie locale du répertoire Bitcoin avec la commande git

NB. : Si vous n’avez pas la fonction git, allez ici pour voir comment l’installer. Ou sinon, tapez directement la commande :

sudo apt-get install git

NB. : Si vous avez des questions, n’hésitez pas à me les poser dans les commentaires.

Faites “entrée” après avoir tapé la commande git et la copie se fera sur un répertoire Bitcoin créé en local.

Une fois que l’opération de clonage a été réalisée, vous aurez une copie locale complète du source code dans votre répertoire Bitcoin nouvellement créé.

Voici les éléments du répertoire Bitcoin que vous venez de copier en local

Dans Ubuntu, utilisez la commande cd :

$ cd bitcoin

Il s’agit d’une commande pour se déplacer (cd = change directory, soit changement de répertoire). Comme vous pouvez le constater dans la deuxième ligne de l’image ci-dessous, le $ a été déplacé après ~/bitcoin. Auparavant, nous étions dans le répertoire : home/mikael. Maintenant, nous sommes dans le répertoire home/mikael/bitcoin.

Puis, utilisez la commande ls (liste). Elle vous permet d’afficher la liste des fichiers dans le répertoire courant.

$ ls

1.3. Récupérer la dernière version de Bitcoin

Les versions de Bitcoin Core évoluent au fil du temps. Elles s’améliorent au fil des propositions des différents développeurs. Il vous faut donc sélectionner l’une des dernières versions de Bitcoin Core. Pour connaître les différentes versions livrées de Bitcoin Core, vous pouvez utiliser la commande git tag :

Commande git tag
Exécution de la commande

Ci-dessus les derniers éléments. “rc” signifie “realease candidate” donc il s’agit de versions de test. La dernière version valide à l’heure où j’écris ces ligne est la v0.15.0. C’est la version que nous allons utiliser ici. Vous pouvez également connaître les dernières livraisons de version sur le site officiel.

Pour synchroniser le code local avec la version, vous pouvez utiliser la commande git checkout :

git checkout

Pour confirmer que vous avez bien la version désirée, vous pouvez utiliser la commande git status :

git status

Les lecteurs de cet article ont également apprécié : Le marché des NFT

2. Configurer l’implémentation de Bitcoin Core

Dans cette partie, nous allons préparer les éléments nécessaires à la construction de la ligne de commande du client Bitcoin : bitcoind. Petite information : bitcoind est le programme qui implémente le protocole bitcoin avec une procédure d’appel à distance (RPC : Remote procedure call).

Quelques précisions : Bitcoind est un daemon sans tête :

  • Un daemon (ou démon) désigne un type de programme informatique qui s’exécute en arrière-plan plutôt que sous le contrôle direct d’un utilisateur ;

  • Un système sans tête est un système informatique ou un périphérique qui a été configuré pour fonctionner sans moniteur (la “tête” manquante), clavier et souris. Un système sans tête est généralement contrôlé via une connexion réseau.

Pour information, le code source inclut une partie documentation qui peut être lue dans la partie Read me.

Pour pouvoir construire le client, nous devons nous assurer d’avoir tous les éléments nécessaires à son implémentation. Il y a en effet des librairies qui doivent être présentes dans votre système avant de pouvoir commencer à compiler bitcoin. Si ces éléments ne sont pas installés, vous aurez des messages d’erreur.

Quelques informations avant de lancer le script autogen.sh. Comme vous pouvez le constater sur l’image ci-dessous, il y a autogen.sh dans le répertoire courant.

C’est ce fichier que nous allons exécuter. Les fichiers .sh sont des scripts (comme les .bat chez Windows) qui peuvent être exécutés avec un interprétateur de type sh (bash, par exemple). Pour exécuter ce script, nous allons utiliser la commande ./nom_du_script.

Plus particulièrement, le script autogen.sh vous permet de générer un ensemble de scripts de construction qui vont interroger votre système afin de savoir si vous avez bien toutes les librairies nécessaires installées. Tapez la commande :

./autogen.sh

Lancement du script autogen.sh

2.1. Quelques précisions sur le script configure

Le script le plus important généré par cette commande est le script configure qui offre différentes options pour paramétrer le processus de construction. Pour voir les différentes options de ce script, tapez :

./configure --help

Il y a encore beaucoup d’autres écrans…

Pour sélectionner des fonctionnalités particulières, vous pouvez utiliser :

./configure [OPTION]... [VAR=VALUE]...

Par exemple :

./configure --enable-wallet

Quelques options utiles :

--prefix=$HOME

Permet d’annuler la localisation par défaut dans le répertoire courant (/usr/local/) du résultat exécuté. $HOME permet de tout mettre dans le répertoire maison.

--disable-wallet

Cette option permet de désactiver l’implémentation du wallet de référence.

--with-incompatible-bdb

Si vous construisez un wallet, cette option permet l’utilisation d’une version incompatible avec la librairie Berkeley DB.

--with-gui=no

Ne construisez pas une interface utilisateur graphique qui nécessite la librairie Qt. Cette option implémente uniquement le serveur et la ligne de commande bitcoin.

2.2. Reprise de l’exécution du script configure

Maintenant, lancez le script configure pour découvrir toutes les librairies nécessaires et pour créer le script adapté à votre système:

./configure

Commande ./configure
Erreur : Berkeley DB other than 4.8

On constate que j’ai un message d’erreur dans mon journal : “Found Berkeley DB other than 4.8, required for portable wallets”.

Soit vous pouvez contourner l’erreur en lançant le programme avec l’option du wallet désactivé : ./configure --disable-wallet

Sinon, pour réellement corriger l’erreur, tapez la commande :

sudo apt-get install libdb4.8-dev libdb4.8++-dev

Oui, c’est ce qu’on aurait dû taper dès le 9/ du début. Nous avions installé la mauvaise version. J’ai laissé intentionnellement cette “erreur” pour que vous compreniez comment le processus de rectification fonctionne.

Error : no working boost sleep implementation found

En relançant la commande ./configure, j’obtiens à nouveau un message d’erreur : “no working boost sleep implementation found“.

Pour résoudre cela, utilisez la commande :

sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev

Installation de libboost (~5 minutes)

En lançant à nouveau la commande ./configure, j’obtiens un nouveau message d’erreur : “open ssl not found” :

Pour résoudre ce problème, installez libSSL avec la commande suivante :

sudo apt-get install libssl-dev

libssl-dev

Je relance la commande ./configure :

Tapez la commande :

sudo apt-get install libevent-dev

Nous relançons la commande ./configure et cette fois, nous n’avons plus de message d’erreur. Nous obtenons la configuration avec l’ensemble des options utilisées :

Commande ./configure exécutée sans anomalie

Nous avons maintenant tous les scripts qui vont nous permettre de compiler bitcoind.

Note : Si vous obtenez d’autres messages d’erreur, vous devez suivre mon exemple ci-dessus et les réparer en installant les librairies manquantes. J’ai indiqué toutes les librairies qui m’étaient nécessaires. Mais il est possible, selon votre installation, que vous ayez besoin de librairies supplémentaires. Si c’est le cas, allez sur ce site. Il vous indique ce qu’il faut installer en fonction de votre message d’erreur. Tous vos messages d’erreurs se résoudront avec une commande de type : sudo apt-get install.

2.3. Construction des exécutables Bitcoin Core

Maintenant, nous allons compiler le code source. Il s’agit d’un processus qui peut prendre une heure selon la vitesse de notre CPU et la mémoire disponible.

Utilisez la commande make pour commencer à compiler les applications exécutables (~ 1 heure).

$ make

make

Bravo ! Bitcoin core est maintenant compilé. Vous pouvez maintenant utiliser la commande make check pour vous assurez que les librairies sont bien opérationnelles.

La dernière étape consiste à installer différents exécutable sur votre système en utilisant la commande make install. Votre mdp sera demandé car cette étape requiert des privilèges d’administrateur.

$ make check && sudo make install

L’installation par défaut de bitcoind le met dans usr/local/bin. Vous pouvez confirmer que Bitcoin Core est correctement installé en demandant à votre système le chemin des exécutables :

$ which bitcoind

Devrait vous renvoyer : /usr/local/bin/bitcoind

$ which bitcoin-cli

Devrait vous renvoyer : /usr/local/bin/bitcoin-cli

NB. : bitcoin-cli s’interprète comme une ligne de commande (Command Line) pour communiquer avec le daemon bitcoind.

Vérification de la présence des clients bitcoind et bitcoin-cli

NB. : si, sur Windows, lors de l’exécution de la commande check, vous avez des messages d’erreur au niveau de la suite de test, il est possible que votre WSL (sous-système Windows de Linux) ne soit pas compatible avec POSIX. Suivez les instructions indiquées ici pour fonctionner en natif Windows.

3. Faire tourner un nœud Bitcoin Core

Le réseau Bitcoin de pair à pair (P2P) est constitué d’un réseau de nœuds. La plupart des personnes qui font tourner ces nœuds sont des volontaires et quelques-uns des business qui construisent des applications bitcoin. Ceux qui font tourner les nœuds ont une vue directe sur la blockchain bitcoin, avec une copie locale de toutes les transactions indépendamment validées par leur propre système. En lançant un nœud, vous n’avez pas besoin de vous fier à un tiers parti pour valider une transaction. De plus, vous contribuez au réseau bitcoin en le rendant plus robuste.

3.1. Configurer le nœud Bitcoin Core

Bitcoin Core va rechercher un fichier de configuration dans son répertoire de données à chaque départ. Dans cette section, nous allons voir comment définir un fichier de configuration. Nous allons également voir quelles sont les différentes options de configuration.

Bitcoind fournit une interface JSON-RPC, lui permettant d’être contrôlé localement ou à distance. Cela le rend utile pour l’intégration avec d’autres logiciels ou dans des systèmes de paiement plus importants. Diverses commandes sont mises à disposition par l’API.

Quand vous lancez bitcoind pour la première fois, il vous demandera de créer un fichier de configuration (bitcoin.conf) contenant un mot de passe sécurisé pour l’interface JSON-RPC. Ne vous inquiétez pas, nous allons voir ci-dessous de quoi il s’agit.

3.1.1. Précisions sur le protocole RPC

Il s’agit d’un protocole Remote procedure Call (un programme qui exécute une procédure sur un réseau partagé) codé en JSON (JavaScript Object Notation : format de renvoi de données lisibles pour un humain).

Lancez bitcoind en tapant bitcoind depuis le terminal.

lancement de bitcoind
3.1.2. Précisions sur le fichier bitcoin.conf

Bitcoin.conf est votre fichier de configuration de Bitcoin Core.

C’est dans ce fichier que vous entrerez vos paramètres pour dire à Bitcoin Core comment se comporter.

Toutes les lignes de commande (sauf ‘data-dir’ et ‘-conf’) peuvent être spécifiées dans un fichier de configuration. Ou sinon, vous les pouvez les spécifier avec des lignes de commande.

Le fichier de configuration est en fait une liste de valeur que vous fixez (paramètre = valeur). Une valeur par ligne. Vous pouvez y indiquer des commentaires optionnels en tapant ‘#’ puis votre commentaire.

Le fichier de configuration n’est pas automatiquement créé. Vous pouvez le créer en utilisant un éditeur de texte ou en le créant sur place directement (cf. plus bas). Par défaut, bitcoind ira chercher un fichier nommé bitcoin.conf dans le répertoire de données bitcoin. Mais, les chemins du répertoire de données et du fichier de configuration peuvent être changés en utilisant les arguments de ligne de commande ‘-datadir’ et ‘-conf’ (argument signifie paramètre).

Localisation : bitcoin.conf doit être localisé dans : $ home/bitoin

Paramètres de configuration liés au réseau :

testnet=['1'|'0']
Active ou désactive le lancement sur le réseau de test au lieu du vrai réseau bitcoin.

proxy='127.0.0.1:9050' 
Connecte via un proxy socks4.

addnode='10.0.0.2:8333' 
Utilisez autant de paramètres *addnode=* que vous voulez pour vous connecter à des pairs spécifiques. 

connect='10.0.0.1:8333' 
Utilisez autant de paramètres *connect=* que vous voulez pour UNIQUEMENT vous connecter à des pairs spécifiques.

noirc=['1'|'0'] 
Utilisez ou n’utilisez pas Internet Relay Chat (irc.lfnet.org #bitcoin channel) pour trouver d’autres pairs.

maxconnections='value'
Fixe le nombre maximal de connections entrantes et  sortantes.

Paramètres de configuration liés aux commandes RPC :

server=['1'|'0']
Indique à *bitcoin* d’accepter ou non les commandes JSON-RPC.

rpcuser='username'
Vous devez fixer un *rpcuser* pour sécuriser l’API JSON-RPC.

rpcpassword='password' 
Vous devez fixer un * rpcpassword * pour sécuriser l’API JSON-RPC. 

rpctimeout='30'
Fixe combien de secondes *bitcoin* devra attendre pour compléter la requête RPC http, après que l’établissement de la connexion de la connexion http.

rpcallowip='192.168.1.*' 

Par défaut, seules les connections RPC depuis l’hôte local sont autorisées. Spécifiez autant de *rpcallowip=* que vous désirez pour autoriser les connexions d’autres hôtes. 

rpcport='8332' 
Ecoutez les connexions RPC sur ce port TCP.

rpcconnect='127.0.0.1'
Vous pouvez utiliser *bitcoin* ou *bitcoind* pour envoyer des commandes à *bitcoin*/*bitcoind* qui tournent sur d’autres hôtes en utilisant cette option. 

rpcssl='1' 
Utilisez Secure Sockets Layer (aka TLS ou HTTPS) pour communiquer avec le ‘-serveur’ *bitcoin* ou *bitcoind*. Pour utiliser OpenSSL, mettez *rpcssl*=’1’ 

rpcsslciphers='TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH'

rpcsslcertificatechainfile='server.cert'

rpcsslprivatekeyfile='server.pem'

Options diverses 

gen=['0'|'1'] 
Active ou désactive la tentative de generation de bitcoins.

4way=['0'|'1']
Active ou désactive l’usage de l’instruction SSE pour essayer de générer des bitcoins plus rapidement.

keypool='100' 
Pré-générez autant de clefs publiques/privées afin que les sauvegardes de portefeuille soient valides pour les transactions précédentes et plusieurs dizaines de transactions futures.

paytxfee='0.00' 
Payez des frais de transaction facultatifs chaque fois que vous envoyez des bitcoins. Les transactions avec des frais ont plus de chance d’être inclus dans les blocks que les transactions sans frais. Elles sont validées plus rapidement.

allowreceivebyip='1' 
Autorisez les connections directes pour la fonctionalité “paiement via adresse IP”

Options pour l’interface utilisateur

min=['0'|'1']
Active ou désactive le démarrage de bitcoind minimisé

minimizetotray=['0'|'1']
Active ou désactive la minimisation de la barre des tâches. 

Source : http://manpages.ubuntu.com/manpages/precise/man5/bitcoin.conf.5.html

3.1.3. Reprise des opérations avec création et configuration de bitcoin.conf

Note : J’avais déjà fait l’étape de création du fichier bitcoin.conf. Je vous indique comment faire : ouvrez un fichier texte (txt). Ecrivez les deux lignes suivantes :

Rpcuser= [indiquer le rpcuser qui vous a été indiqué dans le journal d’erreur]

Rpcpassword = [indiquer le rpcpassword qui vous a été indiqué dans le journal d’erreur]

Puis enregistrez ce fichier .txt sous le nom bitcoin.conf. Déplacez-le à l’emplacement indiqué dans votre journal d’erreur.

Ou, sinon autre méthode, créez directement votre fichier bitcoin.conf a l’emplacement nécessaire avec la commande cat. Cette commande vous permet de créer un fichier sans utiliser un éditeur de texte.

Commande cat

Indiquez votre rpcpassword. Faites entrée. Puis, sur la ligne du dessous, tapez : EOF. Pour End Of File. EOF indiquera la fin du fichier que vous venez de créer.

Relancez maintenant le client Bitcoin Core bitcoind. La première fois que vous le lancerez, il reconstruira la blockchain bitcoin en téléchargeant les blocs. C’est un fichier de plusieurs giga-octets et il prendra deux jours en moyenne pour être totalement téléchargé.

$ bitcoind -printtoconsole

bitoind -printtoconsole (cette option permet l’affichage du log)

NB. 1 : Par défaut bitcoind écrit le log dans un journal qui s’appelle debug.log. Avec -printtoconsole, le log est envoyé sur la console (en affichage). Vous n’avez donc plus besoin d’ouvrir le fichier debug.lol pour analyser ce qui s’est passé.

NB. 2 : A tout moment, vous pouvez stopper l’exécution en utilisant Ctrl+C.

Pour utiliser bitcoin localement, lancez le programme en mode daemon :

Bitcoind –daemon

3.2. Utilisation de l’API JSON-RPC de Bitcoin Core depuis la ligne de commande

Le client Bitcoin Core implémente une interface JSON-RPC qui peut être interrogée avec l’outil en ligne de commande bitcoin-cli. Cette ligne de commande nous permet d’expérimenter de façon interactive les fonctionnalités qui sont également disponibles au travers de l’API (Interface de Programmation). Pour commencer, utilisez la commande help pour consulter la liste des commandes RPC bitcoin disponibles:

3.2.1 Comprendre les possibilités de bitcoin-cli

bitcoin-cli help

Un exemple d’affichage. Mais la liste est longue…

Par exemple, utilisez la commande getblockchaininfo pour obtenir des informations concernant le statut de la blockchain bitcoin :

Bitcoin-cli getblockchaininfo

Voici la structure du résultat de la commande blockchaininfo :

{
  "chain": "xxxx",              (string) current network name as defined in BIP70 (main, test, regtest)
  "blocks": xxxxxx,             (numeric) the current number of blocks processed in the server
  "headers": xxxxxx,            (numeric) the current number of headers we have validated
  "bestblockhash": "...",       (string) the hash of the currently best block
  "difficulty": xxxxxx,         (numeric) the current difficulty
  "mediantime": xxxxxx,         (numeric) median time for the current best block
  "verificationprogress": xxxx, (numeric) estimate of verification progress [0..1]
  "initialblockdownload": xxxx, (bool) (debug information) estimate of whether this node is in Initial Block Download mode.
  "chainwork": "xxxx"           (string) total amount of work in active chain, in hexadecimal
  "size_on_disk": xxxxxx,       (numeric) the estimated size of the block and undo files on disk
  "pruned": xx,                 (boolean) if the blocks are subject to pruning
  "pruneheight": xxxxxx,        (numeric) lowest-height complete block stored (only present if pruning is enabled)
  "automatic_pruning": xx,      (boolean) whether automatic pruning is enabled (only present if pruning is enabled)
  "prune_target_size": xxxxxx,  (numeric) the target size used by pruning (only present if automatic pruning is enabled)
  "softforks": [                (array) status of softforks in progress
     {
        "id": "xxxx",           (string) name of softfork
        "version": xx,          (numeric) block version
        "reject": {             (object) progress toward rejecting pre-softfork blocks
           "status": xx,        (boolean) true if threshold reached
        },
     }, ...
  ],
  "bip9_softforks": {           (object) status of BIP9 softforks in progress
     "xxxx" : {                 (string) name of the softfork
        "status": "xxxx",       (string) one of "defined", "started", "locked_in", "active", "failed"
        "bit": xx,              (numeric) the bit (0-28) in the block version field used to signal this softfork (only for "started" status)
        "startTime": xx,        (numeric) the minimum median time past of a block at which the bit gains its meaning
        "timeout": xx,          (numeric) the median time past of a block at which the deployment is considered failed if not yet locked in
        "since": xx,            (numeric) height of the first block to which the status applies
        "statistics": {         (object) numeric statistics about BIP9 signalling for a softfork (only for "started" status)
           "period": xx,        (numeric) the length in blocks of the BIP9 signalling period 
           "threshold": xx,     (numeric) the number of blocks with the version bit set required to activate the feature 
           "elapsed": xx,       (numeric) the number of blocks elapsed since the beginning of the current period 
           "count": xx,         (numeric) the number of blocks with the version bit set in the current period 
           "possible": xx       (boolean) returns false if there are not enough blocks left in this period to pass activation threshold 
        }
     }
  }
  "warnings" : "...",           (string) any network and blockchain warnings.
}

Source :
https://bitcoincore.org/en/doc/0.16.0/rpc/blockchain/getblockchaininfo/ 

Structure de la commande bitcoin-cli :

Bitcoin-cli [options] <command> [params]

Info : Bitcoin-cli [options] help <command> – permet d’obtenir de l’aide sur la commande spécifique.

Options

-conf=
Spécifie le fichier de configuration  (par défaut, c’est bitcoin.conf)
 
-gen
Génère des tokens
 
-gen=0
Ne génère pas de coins
 
-min
Commence la minimisation
 
-datadir='dir'
Spécifie le répertoire de données
 
-proxy=
Connecte via le proxy socks4
 
-addnode=
Ajoute un nœud auquel se connecter.
 
-connect=
Connecte seulement au noeud spécifié
 
-paytxfee=
Frais par KB à ajouter aux transactions que vous envoyez.
 
-server
Accepte les lignes de commande et les commandes JSON-RPC
 
-daemon
Lance en arrière-plan en tant que daemon et accepte les commandes
 
-testnet
Utilise le réseau de test (test network)
 
-rpcuser=
Username for JSON-RPC connections
 
-rpcpassword=
Mdp pour les connexions JSON-RPC
 
-rpcport=
Connexion JSON-RPC sur le 
 
-rpcallowip=
Autorise les connexions JSON-RPC depuis l’adresse IP spécifiée
 
-rpcconnect=
Envoie des commandes au noeud en cours d’exécution sur cette 
 
Options SSL
 
-rpcssl=1
Utilise openSSL (https) pour les connexions JSON-RPC
 
-rpcsslcertificatchainfile=
Fichier de certificate de serveur (par défaut: server.cert)
 
-rpcsslprivatekeyfile=
Clef privée du serveur (par défaut: server.pem)
 
-rpcsslciphers=
Ciphers acceptés (par défaut: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)

Commandes :


backupwallet 'destination'
Copie en toute sécurité wallet.dat dans ‘destination’, qui peut être un répertoire ou un chemin avec un nom de fichier.
 
getaccount 'bitcoinaddress'
Renvoie le compte associé à l’adresse donnée
 
setaccount 'bitcoinaddress' ['account']
Définit le [‘compte’] associé à l’adresse donnée. ['compte'] peut être omis pour supprimer une adresse depuis le ['compte'].
 
getaccountaddress 'account'
Renvoie une nouvelle adresse bitcoin pour le ‘compte’.
 
getaddressesbyaccount 'account'
Renvoie la liste des addresses associées au ‘compte’ spécifié.
 
getbalance 'account'
Renvoie le solde disponible du serveur ou le solde du ‘compte’.
 
getblockcount
Renvoie le nombre de blocs dans la plus longue chaîne de blocs.
 
getblocknumber
Renvoie le numéro de bloc du dernier bloc de la plus longue chaîne de blocs.
 
getconnectioncount
Renvoie le nombre de connexions aux autres nœuds.
 
getdifficulty
Renvoie la difficulté du proof-of-work comme un multiple de la difficulté minimum.
 
getgenerate
Renvoie le booléen vrai si le serveur tente de générer des bitcoins ; faux sinon.
 
setgenerate 'generate' ['genproclimit']
La génération est limitée aux processeurs ['genproclimit'], -1 est illimitée.
 
gethashespersec
Renvoie une mesure récente de performance de hash par seconde lors de la génération.
 
getinfo
Renvoie un objet contenant certaines informations.
 
getnewaddress 'account'
Renvoie une nouvelle adresse bitcoin pour recevoir des paiements. Si le ‘compte’ est spécifié (il est recommandé de le faire) , il est ajouté au carnet d’adresse pour que les paiements reçus avec cette adresse soit crédité sur le ‘compte’. 
 
getreceivedbyaccount 'account' ['minconf=1']
Returns the total  amount  received  by  addresses  associated  with  'account'  in transactions with at least ['minconf'] confirmations.
 
getreceivedbyaddress 'bitcoinaddress' ['minconf=1']
Returns the total amount received by 'bitcoinaddress' in transactions with at least ['minconf'] confirmations.
 
gettransaction 'txid'
Returns information about a specific transaction, given hexadecimal transaction ID.
 
getwork 'data'
If 'data' is specified, tries to solve  the  block  and  returns  true  if  it  was successful. If 'data' is not specified, returns formatted hash 'data' to work on:
 
"midstate" : precomputed hash state after hashing the first half of the data.
"data"     : block data.
"hash1"    : formatted hash buffer for second hash.
"target"   : little endian hash target.
 
help 'command'
List commands, or get help for a command.
 
listaccounts ['minconf=1']
List accounts and their current balances.
*note: requires bitcoin 0.3.20 or later.
 
listreceivedbyaccount ['minconf=1'] ['includeempty=false']
['minconf']  is  the  minimum number of confirmations before payments are included.
['includeempty'] whether to include addresses that haven't received  any  payments.
Returns an array of objects containing:
 
"account"       : the account of the receiving address.
"amount"        : total amount received by the address.
"confirmations"  :  number  of  confirmations  of  the  most recent transaction included.
 
listreceivedbyaddress ['minconf=1'] ['includeempty=false']
              ['minconf'] is the minimum number of confirmations before  payments  are  included.
              ['includeempty']  whether  to include addresses that haven't received any payments.
              Returns an array of objects containing:
 
                  "address"       : receiving address.
                  "account"       : the account of the receiving address.
                  "amount"        : total amount received by the address.
                  "confirmations" : number  of  confirmations  of  the  most  recent  transaction
              included.
 
listtransactions 'account' ['count=10']
              Returns  a list of the last ['count'] transactions for 'account' - for all accounts
              if 'account' is not specified or is "*". Each entry in the list may contain:
 
                  "category"      : will be generate, send, receive, or move.
                  "amount"        : amount of transaction.
                  "fee"           : Fee (if any) paid (only for send transactions).
                  "confirmations" : number of confirmations (only for generate/send/receive).
                  "txid"          : transaction ID (only for generate/send/receive).
                  "otheraccount"  : account funds were moved to or from (only for move).
                  "message"       : message associated with transaction (only for send).
                  "to"            : message-to associated with transaction (only for send).
 
                  *note: requires bitcoin 0.3.20 or later.
 
move <'fromaccount'> <'toaccount'> <'amount'> ['minconf=1'] ['comment']
              Moves funds between accounts.
 
sendfrom* <'account'> <'bitcoinaddress'> <'amount'> ['minconf=1']  ['comment']  ['comment-to']
              Sends  amount  from account's balance to 'bitcoinaddress'. This method will fail if
              there is less than amount bitcoins with ['minconf'] confirmations in the  account's
              balance  (unless account is the empty-string-named default account; it behaves like
              the *sendtoaddress* method). Returns transaction ID on success.
 
       sendtoaddress 'bitcoinaddress' 'amount' ['comment'] ['comment-to']
              Sends amount from the server's available balance to 'bitcoinaddress'. amount  is  a
              real and is rounded to the nearest 0.01. Returns transaction id on success.
 
stop   Stops the bitcoin server.
 
validateaddress 'bitcoinaddress'
              Checks that 'bitcoinaddress' looks like a proper bitcoin address. Returns an object
              containing:
 
                  "isvalid" : true or false.
                  "ismine"  : true if the address is in the server's wallet.
                  "address" : bitcoinaddress.
 
                  *note: ismine and address are only returned if the address is valid.


Source : http://manpages.ubuntu.com/manpages/precise/man1/bitcoind.1.html

Quelques autres lignes de commandes : https://github.com/ChristopherA/Learning-Bitcoin-from-the-Command-Line/blob/master/bitcoin-cli-commands-help.md

3.2.2 Obtenir des informations sur le statut du client Bitcoin Core

La commande RPC bitcoin getinfo affiche des informations à propos du statut du nœud bitcoin, le portefeuille et la base de données de la blockchain.

bitcoin-cli getinfo (comme indiqué dans le message ci-dessous, il ne faudra bientôt plus utiliser cette commande).

Get info

bitcoin-cli getnetworkinfo

Commande getnetworkinfo
Spécificité de la commande getnetworkinfo

Retourne un objet contenant différentes infos sur le réseau P2P :

Result:
{
  "version": xxxxx,                      (numeric) the server version
  "subversion": "/Satoshi:x.x.x/",     (string) the server subversion string
  "protocolversion": xxxxx,              (numeric) the protocol version
  "localservices": "xxxxxxxxxxxxxxxx", (string) the services we offer to the network
  "localrelay": true|false,              (bool) true if transaction relay is requested from peers
  "timeoffset": xxxxx,                   (numeric) the time offset
  "connections": xxxxx,                  (numeric) the number of connections
  "networkactive": true|false,           (bool) whether p2p networking is enabled
  "networks": [                          (array) information per network
  {
    "name": "xxx",                     (string) network (ipv4, ipv6 or onion)
    "limited": true|false,               (boolean) is the network limited using -onlynet?
    "reachable": true|false,             (boolean) is the network reachable?
    "proxy": "host:port"               (string) the proxy that is used for this network, or empty if none
    "proxy_randomize_credentials": true|false,  (string) Whether randomized credentials are used
  }
  ,...
  ],
  "relayfee": x.xxxxxxxx,                (numeric) minimum relay fee for transactions in BTC/kB
  "incrementalfee": x.xxxxxxxx,          (numeric) minimum fee increment for mempool limiting or BIP 125 replacement in BTC/kB
  "localaddresses": [                    (array) list of local addresses
  {
    "address": "xxxx",                 (string) network address
    "port": xxx,                         (numeric) network port
    "score": xxx                         (numeric) relative score
  }
  ,...
  ]
  "warnings": "..."                    (string) any network and blockchain warnings
}

Examples:
> bitcoin-cli getnetworkinfo 
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getnetworkinfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

Source : https://bitcoincore.org/en/doc/0.16.0/rpc/network/getnetworkinfo/ 

bitcoin-cli getwalletinfo

Commande getwalletinfo
Spécificités de la commande getwalletinfo

Renvoie un objet contenant différentes informations sur l'état du wallet.

Result:
{
  "walletname": xxxxx,             (string) the wallet name
  "walletversion": xxxxx,          (numeric) the wallet version
  "balance": xxxxxxx,              (numeric) the total confirmed balance of the wallet in BTC
  "unconfirmed_balance": xxx,      (numeric) the total unconfirmed balance of the wallet in BTC
  "immature_balance": xxxxxx,      (numeric) the total immature balance of the wallet in BTC
  "txcount": xxxxxxx,              (numeric) the total number of transactions in the wallet
  "keypoololdest": xxxxxx,         (numeric) the timestamp (seconds since Unix epoch) of the oldest pre-generated key in the key pool
  "keypoolsize": xxxx,             (numeric) how many new keys are pre-generated (only counts external keys)
  "keypoolsize_hd_internal": xxxx, (numeric) how many new keys are pre-generated for internal use (used for change outputs, only appears if the wallet is using this feature, otherwise external keys are used)
  "unlocked_until": ttt,           (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked
  "paytxfee": x.xxxx,              (numeric) the transaction fee configuration, set in BTC/kB
  "hdmasterkeyid": ""     (string, optional) the Hash160 of the HD master pubkey (only present when HD is enabled)
}

Examples:
> bitcoin-cli getwalletinfo 
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getwalletinfo", "params": [] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

Source :  https://bitcoincore.org/en/doc/0.16.0/rpc/network/getnetworkinfo/ 

Les données sont retournées au format JavaScript Object Notation (JSON), un format facilement consommable par tous les langages de programmation mais également très lisible. Parmi ces données, nous voyons les numéros de version du client bitcoin (150000), du protocole (70015) et du portefeuille (139900). Nous voyons le solde actuel dans le portefeuille qui est égal à zéro. Il y a également la hauteur de bloc qui nous montre combien de blocs sont connus par ce client (199473).

Et nous voyons également des statistiques variées concernant le réseau bitcoin et les paramètres du client.

3.3. Configuration et cryptage du portefeuille

Avant de procéder à la création de clés et d’autres commandes, vous utiliserez la commande encryptwallet avec [votre_mdp_complexe].

$ bitcoin-cli encryptwallet [votre_mdp_complexe]

Vous pouvez vérifier que le portefeuille a bien été crypté en utilisant la commande getinfo. Cette fois, vous remarquerez une nouvelle entrée nommée unlocked_until. Il s’agit d’un compteur montrant combien de temps le mdp permettant le décryptage est enregistré en mémoire, et combien de temps le portefeuille est déverrouillé. La première fois, il sera à zéro, cela veut dire que le portefeuille est verrouillé.

Note : sur mon poste, l’encryptage du wallet a stoppé l’exécution de bitcoind. Je l’ai relancé pour le faire fonctionner avec le wallet encrypté.

$ bitcoin-cli getinfo

Pour déverrouiller le portefeuille, utilisez la commande walletpassphrase qui prend deux paramètres : le mdp et un nombre de secondes au bout desquelles le portefeuille sera verrouillé à nouveau (une minuterie).

$bitcoin-cli walletpassphrase [votre_mdp_complexe] 360

Vous pouvez vous assurer que le portefeuille est déverrouillé et voir l’état de la minuterie en tapant getinfo à nouveau :

$ bitcoin-cli getinfo

3.4. Sauvegarde du portefeuille, export au format texte et restauration

La prochaine étape consiste à vous entraîner à créer un fichier de sauvegarde du portefeuille pour ensuite le restaurer à partir de ce même fichier. Utilisez la commande backupwallet pour la sauvegarde en spécifiant le nom du fichier de destination en paramètre. Ici, nous sauvegardons le portefeuille dans un fichier nommé wallet.backup :

$ bitcoin-cli backupwallet wallet.backup

backupwallet "destination"

Copie de façon sécurisée le wallet actuel dans le fichier de destinations, lequel peut être un répertoire ou un chemin vers un nom de fichier.

Arguments:
1. "destination"   (string) The destination directory or file

Examples:
> bitcoin-cli backupwallet "backup.dat"
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "backupwallet", "params": ["backup.dat"] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/

Source :  https://bitcoincore.org/en/doc/0.16.0/rpc/wallet/backupwallet/ 

Maintenant, pour restaurer le fichier de sauvegarde, utilisez la commande importwallet. Si votre portefeuille est verrouillé, vous devrez d’abord le déverrouiller (voir commande walletpassphrase dans la section précédente) pour importer le fichier de sauvegarde :

$ bitcoin-cli importwallet wallet.backup

La commande dumpwallet peut être utilisée pour exporter le portefeuille dans un fichier texte lisible par un humain :

$ bitcoin-cli dumpwallet wallet.txt

3.5. Adresse du portefeuille et réception des transactions

Le client bitcoin maintient un pool d’adresses dont la taille est spécifiée par keypoolsize quand vous utilisez la commande getinfo. Ces adresses sont générées automatiquement et peuvent être utilisées comme des adresses publiques de réception ou des adresses utilisées pour la monnaie d’une transaction. Pour récupérer une de ces adresses, utilisez la commande getnewaddress.

$ bitcoin-cli getnewaddress

Maintenant, nous pouvons utiliser cette adresse obtenue pour envoyer de petits montants en bitcoin vers notre portefeuille depuis un portefeuille externe (en supposant que vous disposiez d’un peu de bitcoin sur un autre portefeuille bitcoin). Faites un test en envoyant un micro montant sur votre nouvelle adresse obtenue.

Vous pouvez ensuite interroger le client bitcoind sur le montant reçu par cette adresse et spécifier combien de confirmations sont requises avant que le montant puisse être effectivement pris en compte dans le solde. Pour cet exemple, nous spécifions zéro transaction. Vous devrez ainsi pouvoir les voir rapidement dans votre portefeuille. Utilisez la commande getreceivedbyaddress

$ bitcoin-cli getreceivedbyaddress [votre adresse]

Si vous omettez le zéro à la fin de cette commande, vous ne pourrez voir que les montants ayant au moins minconf confirmations. minconf étant le paramètre correspondant au minimum de confirmations avant que la transaction soit listée dans notre solde. Le paramètre minconf est spécifié dans le fichier de configuration de bitcoind.

Les transactions reçues par le portefeuille entier peuvent également être affichées en utilisant la commande listtransactions :

$ bitcoin-cli listtransactions

Vous pouvez également lister toutes les adresses du portefeuille en utilisant la commande getaddressesbyaccount:

$ bitcoin-cli getaddressesbyaccount ""

Enfin, la commande getbalance montrera le solde total du portefeuille en ajoutant toutes les transactions confirmées avec au moins minconf confirmations.

$ bitcoin-cli getbalance

3.6. Décodage et exploration des transactions

Utilisez une transaction id (identifiant de transaction) comme paramètre avec la commande: getrawtransaction

$ bitcoin-cli getrawtransaction 0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2

Le décodage de la transaction montre tous les composants de cette transaction (incluant les inputs et les outputs de la transaction). Sur votre journal d’exécution, vous voyez que la transaction a crédité notre nouvelle adresse avec 15 millibits en utilisant 1 input (une entrée) en générant deux outputs (deux sorties).

Vous pouvez explorer davantage la blockchain en examinant la transaction précédente référencée par son txid dans cette transaction en utilisant les mêmes commandes (par exemple, getrawtransaction). En passant de transaction en transaction, vous pouvez suivre une chaîne de transactions d’une adresse à une autre.

Nous explorerons maintenant la transaction entrante précédente en utilisant la commande gettransaction. Nous pouvons récupérer une transaction à l’aide de son hash, l’attribut txid montré précédemment à l’aide de la commande gettransaction:

Attention : Les identifiants de transactions (txid) ne font pas autorité tant qu’une transactinn n’a pas été confirmée. L’absence de hash de transaction dans la blockchain ne veut pas dire que la transaction n’a pas été traitée. Cet aspect est connu sous le nom de « transaction malleability » car les hashs de transaction peuvent être modifiés avant leur confirmation dans un bloc. Après la confirmation, les txids sont immuables et font autorité.

L’index de base de données de transactions et l’option txindex

Par défaut, Bitcoin Core construit une base de données contenant uniquement les transactions relatives au portefeuille de l’utilisateur. Si vous souhaitez accéder à n’importe quelle transaction avec des commandes telles que gettransaction, vous devez configurez Bitcoin Core pour qu’il construise un index complet des transactions à l’aide de l’option txindex. Positionnez l’option txindex=1 dans le fichier de configuration de Bitcoin Core (dans le répertoire .bitcoin/bitcoin.conf). Une fois que vous avez changé cette option, vous devrez redémarrer bitcoind et attendre qu’il reconstruise l’index.

3.7. Exploration des blocs

L’exploration des blocs est similaire à l’exploration des transactions (cf. plus bas). Toutefois, on peut faire référence aux blocs par le block height (le niveau/la hauteur ou par le block hash. Commencons d’abord par rechercher un bloc par sa hauteur.

Pour cela, vous pouvez utiliser la commande getblockhash. Elle prend la hauteur du block en paramètre et retourne le bloc hash du bloc en question :

$ bitcoin-cli getblockhash 277316

Maintenant que l’on sait dans quel bloc la transaction a été incluse, nous pouvons interroger ce bloc. Pour cela, il faut utiliser la commande getblock avec le hash du bloc comme paramètre :

$ bitcoin-cli getblock [hash recup]

Maintenant que nous connaissons le bloc dans lequel a été inclus notre transaction, nous pouvons effectuer des requêtes sur ce bloc. Nous utilisons la commande getblock avec le hash du block en paramètre :

De façon générale, pour explorer la base de données blockchain, vous utiliserez les commandes: getblock, getblockhash et gettransaction.

3.8. Créer, signer et soumettre des transactions basées sur les sorties non dépensées

Les transactions Bitcoin sont basées sur le concept de dépense de sorties (« output »), qui résultent de transactions précédentes, afin de créer une chaîne de transactions qui transfère la propriété d’une adresse vers une autre adresse.

Vous pouvez utiliser la commande listunspent pour afficher toutes les sorties non dépensées et confirmées de votre portefeuille.

$ bitcoin-cli listunspent

Source : Mastering Bitcoin.

NB. : Si vous désirez commencer à vous familiariser avec les services décentralisés : Vous pouvez télécharger l’explorateur Brave ici. Il permet l’élimination automatique des publicités et la protection de vos données personnelles. Personnellement, c’est l’explorateur que j’utilise.

Pour copier et partager : https://mikaelecanvil.com/maitriser-bitcoin/

Vous souhaitez soutenir notre mission d’éducation sur la blockchain et les crypto-monnaies ? Vous êtes libre de nous faire un don :

► BTC : 3JBDBdC2Lon9DCE4eT1xaEuTsU3X3LihR3
► ETH : 0x03fb371B18A21eDce65Bf76CF5C9AB76D0897682

 

Articles similaires

Laisser un commentaire

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