Bitcoin 100% anonyme : c’est possible, avec JoinMarket !

Dans la sphère crypto, il ne se passe pas un jour sans que l’on ne parle de la finance décentralisée. Si la majorité de la DEFI passe aujourd’hui par Ethereum, sachez que Bitcoin offrait déjà cette possibilité… depuis 2015 ! 

Suivez-moi dans une petite présentation de la finance décentralisée sur Bitcoin, c’est-à-dire des tractations non censurables : connaissez-vous JoinMarket, le marché libre aux bitcoins permettant d’améliorer la fongibilité du Bitcoin et votre confidentialité lorsque vous l’utilisez ?

Mixeurs bitcoin

Le CoinJoin de Bitcoin et son histoire

On ne peut pas tuer une idée

Il faut creuser dans les archives de bitcointalk.org pour trouver un premier message évoquant “joinmarket”. Contrairement à ce que le nom peut laisser entendre, JoinMarket n’est pas une plateforme de service. Il s’agit plutôt d’un wallet Bitcoin amélioré à l’aide de scripts python. Grossièrement, ce wallet permet de faire deux choses :

  • Demander des participants pour réaliser une transaction jointe (ou CoinJoin),
  • Mobiliser des fonds pour participer aux transactions jointes.

Qu’est-ce qu’une transaction jointe et pourquoi en avons-nous besoin, me direz-vous ?

Comme évoqué dans un précédent article où je vous expliquais comment utiliser Samourai Wallet pour dépenser vos bitcoins anonymement, le protocole Bitcoin n’est absolument pas intraçable per se… et contrairement à votre compte bancaire, vos échanges sont librement accessibles sur le registre des transactions.

Une transaction Bitcoin est en réalité constituée d’une ou plusieurs actions de déblocage de fonds – ce sont les entrées et d’une ou plusieurs dépenses – ce sont les sorties.

Il est donc possible de remonter la paternité d’une transaction et ainsi distinguer les bitcoins vérolés – car reconnus comme ayant un jour transités par des détenteurs peu recommandables – des bitcoins tout neufs tous juste minés.

Une transaction Bitcoin pouvant avoir plusieurs entrées et plusieurs sorties, plusieurs wallets peuvent effectuer un transfert en n’utilisant qu’une seule transaction commune : c’est alors qu’est née l’idée de permettre à plusieurs utilisateurs de mélanger leurs transferts respectifs en une seule transaction. C’est ce que l’on appelle une transaction Coinjoin. Le but est donc de faire appel à des amis afin de joindre nos forces (et nos bitcoins) dans l’objectif de rendre les transactions de ce type difficilement interprétables.

Se battre pour son droit à utiliser Bitcoin sans tout dévoiler

Si l’idée de briser les antécédents de mes bitcoins avant de les dépenser me plait, je n’ai pour autant pas envie d’immobiliser mes fonds pour participer aux transactions des autres.

JoinMarket propose de résoudre cette équation en créant un marché libre de la transaction jointe. Il met face à face les demandeurs de participants aux transactions jointes (“takers”) et les fournisseurs de liquidité (“les makers”). Cerise sur le gâteau, ce marché est géré à travers des salons IRC. Aucune information personnelle n’est divulguée puisqu’il n’y a tout simplement pas de compte.

Chantilly à la crème faite maison sur le gâteau, les fournisseurs de liquidité ni ne prêtent ni ne séquestrent leurs fonds. Ils peuvent interrompre leurs offres sans coût ni durée, et ne se séparent jamais de leurs fonds, grâce au fonctionnement d’une transaction jointe dans lequel les participants ne font que s’envoyer des fonds sur leur propre wallet (mais sur des adresses différentes). Le fait de joindre ces transactions permet astucieusement d’en complexifier l’analyse statistique.

Comment utiliser JoinMarket ?

Nous allons voir ensemble comment utiliser JoinMarket. Il ne s’agira pas d’un tutoriel étape par étape qui serait fastidieux à développer du fait des possibilités du wallet, mais plutôt une prise en main accompagnée de plusieurs informations fondamentales. 

Les pré-requis avant de se lancer tête baissée

Vous constaterez également que son utilisation demande préalablement d’avoir sous la main un nœud complet Bitcoin, ainsi qu’un environnement Python.

  • Pour installer le nœud complet Bitcoin si vous ne l’avez pas encore, vous pouvez vous reporter au début de ce tutoriel (plus complet, puisqu’il permet aussi d’y greffer un nœud Lightning Network),
  • Récupérez la dernière version de JoinMarket du code source ici.

Pour installer JoinMarket sur Linux, il suffit de lancer la commande suivante dans le répertoire joinmarket-clientserver :

./install.sh

Installez également l’interface graphique joinmarket-qt, lorsque cela vous sera automatiquement proposé par l’utilitaire d’installation.

Créer son wallet JoinMarket

La seconde étape consistera à créer son wallet. Il faudra préalablement initialiser l’environnement python à l’aide de la commande suivante :

source jmvenv/bin/activate

Retenez bien cette commande, car elle vous permettra d’initialiser l’environnement de joinmarket. Allez dans le répertoire script et lancez la commande suivante pour générer le fichier de configuration :

python wallet-tool.py generate

Le fichier de configuration se trouve dans le répertoire de votre utilisateur (/home) sous .joinmarket/joinmarket.cfg. Modifiez-le afin de paramétrer la section suivante. Elle consiste à spécifier l’utilisateur de votre nœud Bitcoin. Vous pouvez également remplacer les paramètres rpc_user et rpc_password par le chemin du cookie. Dans ce cas, utilisez le paramètre rpc_cookie_file.

[BLOCKCHAIN]  #options: bitcoin-rpc, regtest, electrum-server  #for instructions on bitcoin-rpc read  blockchain_source = bitcoin-rpc  network = mainnet  rpc_host = localhost  rpc_port = 8332  rpc_user = bitcoin  rpc_password =  password rpc_wallet_file =

Pour créer un wallet, rien de plus simple ! Dans le répertoire scripts, lancez à nouveau la commande suivante :

python wallet-tool.py generate

A la question « Would you like to use a two-factor mnemonic recovery phrase? write ‘n’ if you don’t know what this is (y/n) », répondez non.

Définissez le mot de passe du wallet – et notez-le scrupuleusement !, ainsi que son nom de fichier.

La commande vous retournera la phrase mnémonique renvoyant à la clé privée de votre nouveau wallet. Enregistrez-la ainsi que le fichier wallet.jmdat que vous retrouverez dans le répertoire de votre utilisateur (/home) sous .joinmarket/wallets.

Réaliser sa première transaction jointe CoinJoin avec JoinMarket

Donner ou prendre, pour obscurcir vos bitcoins

Votre wallet est créé, et vous souhaitez l’utiliser pour mélanger vos précieux satoshis.

Deux possibilités vous sont offertes. La première permet de mélanger ses coins en 24 à 48 heures, et nécessite de payer les fournisseurs de liquidité. Vous êtes considéré comme un “taker”. La seconde est d’être un fournisseur de liquidité : dans ce cas, le mélange sera bien plus long, mais en contrepartie, vous serez payé. Vous êtes considéré comme un “maker”.

Vous noterez également que JoinMarket fait référence à deux types de frais. Les premiers sont ceux payés aux mineurs, et les seconds aux fournisseurs de liquidité (makers).

Quoi qu’il en coûte : la question des frais !

La configuration des frais du réseau se fait le paramètre tx_fees dans le fichier joinmarket.cfg. Entre 1 et 999, ce paramètre permet de définir une cible de confirmation, c’est-à-dire le nombre de blocs maximum pour valider la transaction. Configuré à trois, les frais sont définis par le wallet pour inclure la transaction dans l’un des trois prochains blocs. Au-dessus de 1000, la valeur est interprétée en Satoshi par Kilo octet. Configuré à 1000, la transaction coûtera 1 satoshi par octet. Notez également que les frais de minage dépendent de la taille de la transaction (et pas de son montant). Prenez garde, une transaction jointe nécessite plusieurs participants, ce qui peut multiplier par 6 – voire 9 ! – le coût par rapport à une transaction classique.

Les frais à payer aux fournisseurs de liquidité se déclinent de deux façons. Dans le fichier joinmarket.conf, le paramètre max_cj_fee_abs permet de préciser le montant maximum à payer à un fournisseur de liquidité. Le paramètre max_cj_fee_rel quant à lui permet de définir le montant total des frais pour une transaction jointe.

Plus ces montants sont élevés, et plus votre transaction jointe est coûteuse. En contrepartie, elle sera plus facilement constituée.

Réaliser sa transaction en tant que demandeur (taker)

Avant toute chose, il faudra définir les différents frais. Dans mon cas, voici ma configuration :

  • tx_fee (frais de minage) : 2000 (2 Satoshis / octet),
  • max_cj_fee_abs : 100 satoshis par participant,
  • max_cj_fee_rel : 0.0001 (0.01% du montant de la transaction jointe).

Lancez JoinMarket à l’aide de la commande suivante :

python joinmaket-qt.py

Chargez votre wallet en allant dans le menu Wallet et « load ».  Votre fichier wallet se trouve dans le répertoire de votre utilisateur (/home) sous votre .joinmarkets/wallets sous le nom wallet.jmdat.

Votre wallet est compartimenté en mixdepth. Cela permet d’améliorer la confidentialité dans le processus de mélange. Dans le résultat présenté, ouvrez le compartiment mixdepth 0 et récupérez les trois premières adresses. Envoyez des fonds dessus, et attendez cinq confirmations.

Allez dans l’onget coinjoin et Multiple join. Cette option permet de réaliser plusieurs transactions jointes consécutivement. Cliquez sur “Generate tumble schedule” puis sur “Generate a tumble schedule automatically”. Ceci permettra de créer un fichier décrivant l’ensemble des transactions. 

L’écran suivant permet de définir les paramètres du planificateur de transaction. Dans l’ordre, ces paramètres décrivent le compartiment de départ (mixdepth 0), le nombre moyen de fournisseurs de liquidités (9), le nombre de transactions jointes (4), le temps entre chaque transaction et le nombre moyen de transactions par compartiment (2).

Cliquez sur Next.

Le dernier écran vous demandera de fournir trois adresses d’un de vos wallets. Point d’attention, ne transférez pas des bitcoins issus de transactions jointes vers le wallet ayant servi à envoyer les fonds sur JoinMarket. Cela rendrait caduque tous les bénéfices de confidentialité gagné par le processus.

Si vous utilisez Ledger Live, je vous suggère de créer spécialement un nouveau compte pour recevoir vos bitcoins. Cliquez sur Next, ne touchez pas aux options avancées et cliquez sur Finish

L’interface graphique vous affiche le résultat de la planification.

Cliquez sur Run schedule pour lancer le processus. 

A partir de là, ne touchez plus à rien ! Le processus va réaliser l’ensemble des transactions sur une durée variant de un à trois jours. Si par malheur JoinMarket devait être arrêté, il vous suffira d’utiliser l’action « Choose schedule file » afin de recharger le fichier TUMBLE.schedule que vous trouverez dans le répertoire de votre utilisateur (/home/) sous .joinmarkets /logs/le répertoire logs.

Vous constaterez que la solution JoinMarket reste probablement une des solutions les moins coûteuses. Je vous déconseille cependant de tester la solution avec des montants inférieurs à 0.01 bitcoin. En effet, les frais de minage d’une transaction jointe avec un grand nombre de participants seraient trop significatifs par rapport au montant engagé.

Manipuler JoinMarket reste assez délicat même si son interface graphique rend l’usage plus abordable. On préférera le wallet Android Samourai qui facilite considérablement la tâche, en permettant d’utiliser non pas JoinMarket mais Whirlpool pour mixer vos bitcoins. Cependant, JoinMarket reste une des solutions les moins coûteuses et qui ne nécessite pas de coordinateur pour créer les transactions jointes. 

Dans un prochain article, nous verrons comment gagner des fractions de bitcoins en prenant le rôle de fournisseur de liquidité avec JoinMarket !

Jonathan Fraga

De formation réseau et sécurité, je suis tombé en 2014 dans Bitcoin. J'ai vécu la popularisation des "technologies blockchains" avec l'émergence de Ethereum et survécu à l'euphorie de 2017. J'aime analyser Bitcoin à travers ses concepts et sa technologie. J'aime encore plus partager mes découvertes.