top of page
  • Photo du rédacteurLoïc Morel

Comprendre et utiliser le CoinJoin sur Bitcoin.

Un des problèmes initiaux à tout système de paiement pair-à-pair est la double dépense. Comment éviter que des acteurs malveillants abusent du réseau de paiement, en dépensant plusieurs fois des mêmes unités compte sans pour autant recourir à une autorité centrale ?


Satoshi Nakamoto est venu résoudre ce problème avec son protocole Bitcoin, un réseau de paiement électronique pair-à-pair fonctionnant sans l'intervention d'une quelconque autorité centrale. Dans son White Paper, il nous explique que le seul moyen de confirmer l'absence d'une transaction, et donc de vérifier qu'il n'y a pas de tentative de double dépense, est d'être au courant de toutes les transactions effectuées sur le réseau de paiement distribué.

Bitcoin A Peer to Peer Electronic Cash System
.pdf
Download PDF • 184KB

Pour que chaque utilisateur soit informé des transactions, celles-ci doivent être annoncées publiquement. Le système de paiement pair-à-pair proposé par le protocole Bitcoin a donc été rendu possible par une infrastructure complètement transparente et distribuée. Ainsi, quiconque dispose d'un nœud est en capacité de vérifier la chaine de signatures électroniques et l'historique de chaque pièce, depuis sa création par un mineur.


Ce principe de distribution du registre et d'annonce publique des nouvelles transactions est utilisé sur la dernière crypto-monnaie (bitcoin), mais il l'était déjà sur les crypto-monnaies précédentes comme b-money, inventé par Wei Dai en 1998.

Cette transparence et cette distribution impliquent que chaque utilisateur du réseau Bitcoin est en capacité de retracer et d'observer les transactions de tous les autres usagers. La confidentialité est donc impossible au niveau du paiement. Au lieu de cela, elle se fait au niveau de l'identification de la personne.


Au lieu d'associer chaque unité de compte à une identité (nom, prénom...), comme dans le système bancaire traditionnel, les bitcoins sont associés à une paire de clés. Les utilisateurs sont donc représentés anonymement par un identifiant cryptographique.


Ainsi, la perte de confidentialité sur Bitcoin s'opère lorsqu'un observateur est capable de faire un lien entre certains UTXO et certains utilisateurs. Lorsque ce lien est fait entre un usager et ses unités de compte, il est alors possible de suivre ses paiements et d'analyser l'histoire de ses bitcoins.


Le CoinJoin est une pratique qui permet de casser cet historique des UTXO afin d'apporter un certain niveau de confidentialité à l'utilisateur de Bitcoin.


Dans cet article, nous allons étudier ensemble ce qu'est le CoinJoin, comment il fonctionne et comment l'utiliser de la bonne façon. Nous parlerons essentiellement de Whirlpool, l'implémentation de CoinJoin la plus efficace aujourd'hui selon moi, mais nous aborderons aussi les autres implémentations existantes. Je vais également vous parler des indicateurs permettant de calculer précisément le niveau de confidentialité de vos bitcoins. Pour ne pas rester uniquement dans la théorie, je vous montrerai concrètement comment réaliser une transaction CoinJoin de différentes manières. Enfin, nous étudierons les bonnes pratiques à observer pour ne pas perdre la confidentialité gagnée après une série de CoinJoin, et je vous présenterai les différents outils du portefeuille Samourai Wallet qui permettent cela.


Si cet article vous plait, partagez-le sur les réseaux sociaux et à vos connaissances qui en ont besoin.




Sommaire :



Si vous êtes un utilisateur débutant de Bitcoin, avant de pouvoir aborder cet article, je vous conseille fortement de comprendre la structure d'une transaction Bitcoin (UTXO, inputs et outputs) en lisant ce court article traitant ce sujet : Mécanisme d'une transaction Bitcoin : UTXO, inputs et outputs.


L'utilisation du CoinJoin peut présenter des risques indirects pour son utilisateur. Certains prestataires bloqueront potentiellement vos fonds et/ou votre compte en conséquence de vos agissements, et vous demanderont des justifications quant à l'origine de ces fonds. Les informations contenues dans cet article ne constituent pas un conseil en système et logiciels informatiques, ni une incitation quelconque à réaliser des CoinJoin. La réalisation d'un CoinJoin implique d'utiliser un portefeuille logiciel connecté à internet (dit « chaud »). Il est possible que vos fonds soient perdus et/ou volés. Je vous conseille de faire vos propres recherches sur les différents risques existants. Cet article ne peut en aucun cas constituer une source unique d'information sur ces sujets.


Tourbillon mer




CoinJoin et mixage de bitcoins.


Avant de commencer, il est important de comprendre la différence entre le CoinJoin et le mixage.


Le mixage (en anglais : "mixing", "blender" ou "tumbler"), est une technique permettant de mélanger des UTXO, c'est-à-dire mélanger des bitcoins, afin de rompre leurs historiques et afin de brouiller les pistes de traçage. L'objectif de ce type d'opération est de pseudonymiser des UTXO pour que l'utilisateur gagne en confidentialité. La pseudonymisation se produit lorsque l'UTXO se trouve au sein d'un groupe de plusieurs autres UTXO indifférenciables.


Le mixage et le CoinJoin sont initialement deux techniques ayant le même objectif, mais ne fonctionnant pas de la même façon. Le mixage s'établit sur un tiers de confiance à qui l'on va confier nos bitcoins à mixer, alors que le CoinJoin repose lui uniquement sur un coordinateur qui va synchroniser l'action des utilisateurs, mais qui n'aura jamais la main sur les fonds.


Avec l'arrivée du CoinJoin, le mixage est rapidement devenu désuet et les utilisateurs s'en sont détournés. Il existe encore quelques services de mixage comme ChipMixer. Cependant, aujourd'hui cette technique n'existe plus qu'en marge alors que le CoinJoin est utilisé par de plus en plus d'individus.


En conséquence, dans le langage courant des bitcoiners, beaucoup utilisent le mot « mixage » pour parler finalement d'un CoinJoin. Même si cette sémantique est initialement fausse, elle est globalement admise au sein des utilisateurs. On parle alors de « bitcoins mixés » pour évoquer des UTXO sortis d'une transaction CoinJoin.



Foule anonyme



Le CoinJoin est donc une technique permettant de casser l'historique des UTXO. Il repose sur une transaction collaborative à la structure spécifique de même nom : la transaction CoinJoin. Ce type de transaction a été initialement proposé par Gregory Maxwell en 2013 sur le forum Bitcoin Talk : https://bitcointalk.org/index.php?topic=279249.0


Le fonctionnement général est le suivant : différents utilisateurs souhaitant mixer déposent un montant en input d'une transaction. Ces inputs ressortiront en différents outputs de même montant (avec éventuellement un change, mais nous étudierons cela plus loin). À la sortie de la transaction, il est donc impossible de déterminer quel output appartient à quel utilisateur. Il n'y a techniquement aucun lien entre les entrées et les sorties de la transaction CoinJoin. Le lien entre chaque utilisateur et chaque UTXO est cassé, de la même manière que l'historique de chaque pièce.


Pour permettre le CoinJoin sans qu'aucun utilisateur ne perde la main sur ses fonds à aucun moment, la transaction est d'abord construite par le coordinateur puis transmise à chaque utilisateur. Chacun d'eux signe alors la transaction de son côté en vérifiant qu'elle lui convient, puis toutes les signatures sont ajoutées à la transaction. Si un utilisateur ou le coordinateur tente de voler les fonds des autres en modifiant les outputs de la transaction CoinJoin, alors les signatures seront invalides et la transaction sera refusée par les nœuds.


Si je peux me permettre une analogie, nous pouvons imaginer le CoinJoin comme une course poursuite entre un hélicoptère et une voiture. Imaginons un hélicoptère qui tente de suivre une voiture blanche. L'hélicoptère représente la personne qui souhaite analyser vos paiements et la voiture blanche représente votre UTXO. L'hélicoptère peut facilement suivre la voiture en volant au-dessus d'elle.


Imaginons qu'il y ait maintenant quatre autres véhicules blancs similaires qui circulent sur cette route à proximité de la voiture suivie. L'hélicoptère peut toujours suivre la voiture blanche qu'il suivait initialement.


Maintenant, imaginons que ces cinq voitures prennent un tunnel empêchant l'hélicoptère de voir les voitures durant un court instant. À la sortie du tunnel, l'hélicoptère ne pourra pas savoir laquelle des cinq voitures blanches correspond à la voiture qu'il suivait initialement. Dans cet exemple, le tunnel agit comme un CoinJoin. Votre UTXO en sortie de transaction CoinJoin sera caché parmi un groupe d'autres UTXO. Un éventuel observateur saura que votre UTXO se trouve dans ce groupe, mais il ne pourra pas déterminer avec certitude quel est le vôtre.


L'objectif technique pour l'utilisateur de CoinJoin sera de disposer sur ses UTXO d' "Anonymity Sets" les plus grands possibles. Ce concept est très important à comprendre pour la suite. "Anonymity Sets", parfois également nommé "Anon Sets" désigne les paramètres permettant de calculer le niveau d'anonymat d'un UTXO donné. Il en existe deux : le score prospectif et le score rétrospectif.


Le score prospectif donne la taille du groupe d'UTXO parmi lequel l'UTXO qui nous appartient se cache. Par exemple, si je fais un CoinJoin avec quatre autres utilisateurs, mon score prospectif sera égal à cinq directement après la transaction CoinJoin.


Si l'on reprend notre exemple de l'hélicoptère, chaque voiture blanche à la sortie du tunnel dispose d'un score prospectif égal à 5. L'hélicoptère sait que sa cible se trouve parmi ce groupe de cinq voitures, mais il est incapable de distinguer quelle est sa voiture cible initiale.


Je vous explique plus en détail ce que représentent ces deux paramètres dans cette partie : Anon Sets. Pour le moment, retenez simplement qu'au plus les Anon Sets sont élevés pour un UTXO mixé, au plus celui-ci sera difficile à traquer par un observateur.





Les différentes implémentations de CoinJoin.


Une transaction CoinJoin pourrait parfaitement être réalisée manuellement, directement avec d'autres utilisateurs de Bitcoin que vous rencontrez. Mais, cette solution, en plus d'être très fastidieuse, est assez peu efficace. Pour que la transaction CoinJoin soit efficace, rapide et passe à l'échelle du réseau, il faut pouvoir s'entendre avec n'importe quel autre utilisateur dans le monde. On utilise alors plutôt les services d'un coordinateur dont le rôle sera de développer une implémentation avec un modèle de transaction, de mettre en relation les différents utilisateurs et de transmettre les informations permettant la bonne réalisation de la transaction collaborative.


Il existe principalement 3 implémentations de CoinJoin sur Bitcoin :


Même si l'objectif final de ces trois implémentations est le même, à savoir casser l'historique d'un UTXO en réalisant des transactions CoinJoin, leurs fonctionnements sont très différents. Il convient donc de s'informer sur les rouages de chacun afin de choisir l'implémentation qui correspond le mieux à nos attentes.


Vous l'aurez sûrement compris si vous me suivez sur Twitter, personnellement, je préfère utiliser l'implémentation Whirlpool. Je vais donc vous expliquer rapidement le fonctionnement théorique des deux autres solutions, en vous détaillant pourquoi je les trouve moins adaptées. Puis, nous étudierons plus en détail le fonctionnement de Whirlpool, l'implémentation développée par les équipes de Samourai Wallet, qui est selon moi la meilleure solution de CoinJoin actuellement.


Les caractéristiques évoquées pour chaque implémentation sont valables actuellement. Il est possible qu'elles aient évoluées lorsque vous lisez cet article.



gif



JoinMarket.


JoinMarket se différencie franchement des autres principales implémentations grâce à son modèle de mise en relation des utilisateurs. En effet, il est établi sur un marché d'échange entre des utilisateurs qui fournissent des liquidités pour mixer, et des utilisateurs qui prennent les liquidités pour mixer.


Lorsque l'on souhaite réaliser un CoinJoin sur JoinMarket, on va devoir choisir entre laisser ses bitcoins pour que les autres puissent les utiliser pour mixer contre rémunération, ou bien prendre les liquidités des autres utilisateurs pour mixer directement en payant la rémunération demandée. Il y a donc les "makers" qui laissent leurs bitcoins à disposition et les "takers" qui utilisent les liquidités. Les "takers" rémunèrent les "makers" pour leur service.


On parle donc d'un marché totalement libre, sans condition d'utilisation.


L'inconvénient principal de ce service est qu'il est assez complexe à prendre en main. Il faut disposer d'un minimum de connaissance en lignes de commandes Linux pour arriver à bien l'utiliser. Cette implémentation est relativement efficace, mais elle n'est clairement pas adaptée pour le grand public.


Au niveau des fonctionnalités liées à la transaction CoinJoin, JoinMarket dispose de quelques points faibles par rapport à Whirlpool. Par exemple, la structure de la transaction CoinJoin utilisée fait qu'il ne peut pas y avoir 0 % de liens déterministes entre les inputs et les outputs. On peut également remarquer que JoinMarket n'inclut pas d'outil permettant de prévenir un nouveau CoinJoin entre des pièces qui se sont déjà rencontrées par le passé.


Au niveau des services complémentaires proposés à l'utilisateur, JoinMarket n'inclut pas d'outil pour calculer facilement les Anon Sets d'un UTXO. Quant aux outils de dépense d'UTXO mixés, l'implémentation propose seulement le PayJoin.


Finalement, JoinMarket est une implémentation de CoinJoin intéressante, mais elle n'est pas destinée à n'importe qui. Si vous êtes à l'aise avec les lignes de commande, si vous maîtrisez bien le fonctionnement du CoinJoin et si le modèle de "takers" / "makers" vous plait, alors cette implémentation peut vous convenir.




Wasabi 2.0.


Le service de CoinJoin de Wasabi fonctionne en théorie comme celui de Whirlpool. Contrairement à JoinMarket où l'organisation se fait sur un marché libre, Wasabi agit comme un coordinateur qui va automatiquement mixer les bitcoins de tous les utilisateurs du service.


La structure de la transaction CoinJoin en elle-même est en revanche bien différente de celle de Whirlpool. Comme nous le verrons dans la partie suivante, l'augmentation du score prospectif (Anon Set) des UTXO mixés sur Whirlpool se fait sur l'accumulation de plusieurs CoinJoin avec peu d'utilisateurs à chaque fois. Au contraire, les Anon Sets des UTXO mixés sur Wasabi se font sur peu de transactions avec un grand nombre d'utilisateurs.


Exemple de Coinjoin possiblement réalisé sur Wasabi 1.0 :

https://kycp.org/#/b994a9cbdc20e971207bde4f800b9ce99dba35478a2a997bc48e7f9f80bd2d02


Exemple de Coinjoin réalisé sur Whirlpool : https://kycp.org/#/323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2


Les deux implémentations se différencient également dans la gestion du change. Sur Whirlpool, le change est écarté et isolé des UTXO avant le CoinJoin grâce à la TX0 (je vous en parle dans la partie suivante). Sur Wasabi, le change est un output de la transaction CoinJoin. Le choix de cette structure de CoinJoin sur Wasabi fait que des liens déterministes subsistent entre les inputs et certains outputs.


Sur la version 2.0, Wasabi a complètement changé sa politique de frais de CoinJoin. Les frais de coordinateur sont dorénavant de 0.3 % pour les UTXO supérieurs à 0.01 bitcoin, et ils sont offerts pour les UTXO inférieur à cette somme. Les petits UTXO bénéficient également de remixes gratuits. Notons que même si les frais de coordinateur sont offerts, l'utilisateur devra toujours s'acquitter des frais de minage pour toutes les transactions, y compris les transactions de remixes.


Ainsi, contrairement à Whirlpool, au plus vous voudrez avoir des Anon Sets conséquents sur vos UTXO mixés avec Wasabi, au plus vous devrez payer de frais. Cela est vrai autant pour la version 1.0, que pour la version 2.0 de Wasabi. Même si cette dernière version offre les frais de coordinateur aux petits UTXO, il reste toujours les frais de minage. De plus, j'ai eu l'impression en utilisant la version 2.0 que le score prospectif maximum atteignable est de 300 sur Wasabi. Sur Whirlpool, on peut facilement atteindre un score prospectif à cinq chiffres en l'espace de quelques mois, et ce score n'est pas limité.


Au-delà de la structure du CoinJoin en lui-même, selon moi, Wasabi manque cruellement d'outils complémentaires au CoinJoin, notamment pour pouvoir dépenser proprement les UTXO mixés. Sur la version 1.0 il n'y a pas d'outil de dépense. Sur la version 2.0, Wasabi a tout de même inclut un outil de dépense des UTXO mixés qui permet d'ajuster les inputs et les outputs automatiquement afin de maximiser la confidentialité en supprimant le change. Bien que cette fonctionnalité puisse être utile, elle semble être bien moins efficace et pratique à utiliser que la myriade d'outils proposés sur Samourai et Sparrow Wallet pour dépenser proprement les UTXO mixés avec Whirlpool. Je vous parle de tous ces outils plus loin dans l'article, dans cette partie : Les outils de dépense.


Contrairement à Whirlpool, Wasabi ne sépare pas les comptes des UTXO mixés, des UTXO non mixés et des UTXO de change. Cette structure du portefeuille fait que des réutilisations d'adresse sont possibles entre des UTXO mixés et d'autres UTXO. Si ça se produit, cela peut venir casser complètement un CoinJoin.


Finalement, après avoir essayé la version 2.0, je ressors vraiment avec cette impression de ne pas maîtriser mon Coinjoin lorsque j'utilise Wasabi. Tout y est simplifié et automatisé, l'interface utilisateur est magnifique, mais est-ce cela que l'on attend d'une implémentation de CoinJoin ?





Fonctionnement théorique de Whirlpool.


Contrairement aux autres implémentations évoquées, Whirlpool se démarque par la construction de transactions CoinJoin "ZeroLink", c'est-à-dire avec strictement aucun lien technique possible entre tous les inputs et tous les outputs.


Cela est rendu possible par une transaction Coinjoin où chaque utilisateur dépose un même montant en input, qui ressortent en autant d'outputs de même montant.


Avec ce type de construction restrictive sur les inputs, la transaction CoinJoin de Whirlpool est la seule qui permette aux utilisateurs de disposer de 0 % de liens déterministes entre les inputs et les outputs. Cela signifie que chaque output a parfaitement la même probabilité d'appartenir à un utilisateur que tous les autres outputs de la transaction.


Le nombre de participants à chaque mix est limité à 5 : 2 entrants et 3 remixeurs (nous découvrirons plus tard en quoi cela consiste). Toute transaction CoinJoin sur Whirlpool dispose donc toujours de 5 entrées et de 5 sorties.


Représentation schématique d'une transaction CoinJoin Whirlpool.
Représentation schématique d'une transaction CoinJoin Whirlpool.



Conception de Whirlpool.


Le modèle proposé par Whirlpool est ainsi basé sur de toutes petites transactions. Contrairement à Wasabi et à JoinMarket, la force des Anon Sets n'est pas acquise par le nombre d'utilisateurs participant au CoinJoin, mais par la succession de plusieurs petits CoinJoin de 5 participants à chaque fois.


L'utilisateur sera amené à payer une seule fois, lors de son entrée dans une pool, puis il pourra gratuitement remixer autant qu'il le souhaite. Ce sont les nouveaux entrants qui paient les frais de minage pour les remixeurs.


Les Anon Sets viendront augmenter de façon exponentielle au fur et à mesure des remixes de l'utilisateur et de ses pairs rencontrés. L'objectif est donc de profiter au maximum de tous ces remixes gratuits qui viennent à chaque fois ajouter de la profondeur aux Anon Sets de l'UTXO.


Whirlpool a été imaginé selon 2 critères principaux :

  • Que l'implémentation soit utilisable sur mobile.

  • Que les cycles de remixes se fassent rapidement.

Ce sont pour ces deux raisons que les équipes de Samourai ont choisi de limiter le nombre d'utilisateurs à 5 par cycle. Un nombre plus faible n'aurait pas permis un CoinJoin assez efficace et serait venu réduire trop fortement les Anon Sets par cycle. Un nombre plus élevé n'aurait sûrement pas été gérable sur des clients mobiles, et il serait venu réduire le flux de cycles.


Finalement, nul besoin d'avoir un nombre élevé de participants par CoinJoin sur Whirlpool puisque les Anon Sets se font sur l'accumulation de plusieurs cycles de mixage.




Pools et frais.


Pour que ces multiples cycles permettent bien de faire augmenter les Anon Sets des UTXO, il faut mettre un certain cadre afin de restreindre les montants des UTXO utilisés. Whirlpool défini ainsi différentes pools (en français : « bassins »).


Une pool est un groupement d'utilisateurs souhaitant mixer, qui se sont entendus sur le montant des UTXO utilisés afin d'optimiser le fonctionnement du CoinJoin. Chaque pool définit un montant fixe de l'UTXO auquel l'utilisateur doit s'adapter pour pouvoir y entrer. Concrètement, lorsque vous souhaitez réaliser des CoinJoin, vous devez choisir une pool dans laquelle entrer pour commencer à mixer. Les différentes pools existantes sur Whirlpool actuellement sont :

  • 0,5 bitcoin.

  • 0,05 bitcoin.

  • 0,01 bitcoin.

  • 0,001 bitcoin (= 100 000 sats).


Tout le monde peut donc trouver chaussure à son pied.


Chaque pool dispose d'un montant maximal pour pouvoir y entrer :

Pool (bitcoin)

Montant maximum par entrée (bitcoin)

0,5

35

0,05

3,5

0,01

0,7

0,001

0,025


Pour entrer dans une pool, il faut régler des frais. Ils sont fixes pour chaque pool et sont destinés aux équipes qui développent et gèrent Whirlpool afin de les rémunérer pour ce service. Les frais sont uniquement prélevés une fois lorsque vous accédez à la pool. Une fois entré dans une pool, vous pourrez gratuitement remixer autant de fois que vous le souhaitez.


Actuellement, voici les frais appliqués pour chaque pool :

Pool (bitcoin)

Frais d'entrée (bitcoin)

0,5

0,0175

0,05

0,00175

0,01

​0,0005 (50 000 sats)

0,001

​0,00005 (5 000 sats)

Vous pouvez facilement calculer les frais engagés sur vos mix avec Whirlpool sur ce site : https://www.whirlpoolfees.com/


Notez également que ces frais sont "un ticket d'entrée" pour la pool. Ainsi, que vous entriez dans la pool 0,01 avec 0,01 btc, ou avec 0,5 btc, les frais seront exactement les mêmes. Avant de mixer, un utilisateur doit donc se demander s'il souhaite payer moins de frais avec une petite pool, auquel cas, il ressortira avec plusieurs petits UTXO, ou bien s'il préfère utiliser une plus grosse pool en payant plus de frais, mais en ressortant avec moins d'UTXO.


A la sortie des différents cycles de mixage, il est généralement déconseillé de fusionner ensemble plusieurs UTXO mixés. Cela pourrait venir casser la confidentialité durement gagnée précédemment. Alors, il vaut mieux parfois utiliser une plus grosse pool, quitte à payer plus de frais, afin de ressortir avec moins d'UTXO d'une taille plus importante.


Les autres frais à considérer seront évidemment les frais de minage inhérents à toute transaction Bitcoin. En tant qu'utilisateur de Whirlpool, vous devrez payer les frais de minage de la Tx0 et les frais de minage du mix initial. Tous les autres remixes seront gratuits pour vous puisque le modèle de frais de Whirlpool est fondé sur les nouveaux entrants.


Chaque CoinJoin est composé de 5 utilisateurs. Parmi ceux-ci, 2 sont des entrants et 3 sont des remixes. Ainsi, les deux entrants de chaque mix paieront les frais de minage pour les 5 utilisateurs, puis ces deux entrants pourront à leur tour profiter de la gratuité des remixes suivants.

Représentation schématique d'un CoinJoin Bitcoin Whirlpool

Grâce à ce modèle de frais, Whirlpool se différencie réellement des autres services de CoinJoin puisque les Anon Sets des UTXO ne sont pas proportionnels au prix payé par l'utilisateur. On peut donc aboutir à des Anon Sets très élevés, en ayant simplement payé les frais de la pool, et les frais de minage pour deux transactions (Tx0 et mix initial).


Évidemment, l'utilisateur devra également payer les frais de minage lorsqu'il souhaitera sortir ses UTXO de la pool après avoir effectué ses nombreux remixes.


Comme expliqué précédemment, on dit qu'un UTXO est dans une pool lorsque celui-ci est disponible pour mixage. Cela ne signifie pas que l'utilisateur en perd sa propriété. Tout au long des différents CoinJoin avec Whirlpool, vous restez pleinement maître de vos clés, et donc maître de vos bitcoins.



Les comptes sur Whirlpool.


Pour pouvoir mettre en place ce type de transaction CoinJoin, un portefeuille utilisant Whirlpool va devoir dériver plusieurs comptes.


Un compte est une sous-section dans un portefeuille HD. Cette séparation se fait en profondeur 3 du portefeuille, c'est-à-dire au niveau des xpub/xprv.


Si vous êtes peu à l'aise avec ce concept de comptes au sein d'un portefeuille HD, je vous conseille de lire mon e-book dédié à ce sujet que vous pouvez gratuitement télécharger en cliquant ici. J'ai également écrit tout un article sur le fonctionnement des chemins de dérivations : Comprendre les chemins de dérivation d'un portefeuille Bitcoin.


Vous n'avez évidemment pas besoin de comprendre tout cela pour utiliser Whirlpool, mais retenez simplement qu'un compte est une sous-section d'un portefeuille HD, qui est complètement séparée des autres comptes et qui dispose de sa propre xpub/zpub.


C'est grâce à cette séparation stricte des différents comptes qu'il est impossible qu'une réutilisation d'adresse se produise entre des bitcoins mixés et des bitcoins non-mixés sur Whirlpool.

Sur chaque portefeuille HD, il est possible de dériver jusqu'à 2^(32/2) comptes différents. Le premier compte, celui que vous utilisez par défaut sur votre portefeuille sans le savoir est le compte 0'.


Lorsque que vous utilisez un portefeuille adapté à l'utilisation de Whirlpool, celui-ci va automatiquement créer 5 comptes :

  • Le compte Dépôt déterminé par l'index 0'.

  • Le compte Bad Bank (doxxic change) déterminé par l'index 2 147 483 644'.

  • Le compte Pre Mix déterminé par l'index 2 147 483 645'.

  • Le compte Post Mix déterminé par l'index 2 147 483 646'.

  • Le compte Ricochet déterminé par l'index 2 147 483 647' : Ce dernier compte n'est pas utilisé directement au sein du protocole Whirlpool, mais il y est lié. Je vous en parle plus bas, dans la partie dédiée aux outils de dépense.

Chaque compte a sa propre utilité et sera destiné à une tâche précise.


L'intégralité des comptes dépend d'une même graine. L'utilisateur peut donc récupérer facilement l'accès à tous ses fonds en cas de problème avec sa phrase de récupération et son éventuelle passphrase. Il faudra tout de même indiquer au logiciel de récupération les différents index des comptes utilisés.


Voyons maintenant les différentes étapes d'un CoinJoin Whirlpool au sein de ces comptes.




Tx0.


Au départ d'un CoinJoin, tout part du compte Dépôt. C'est le compte que vous utilisez par défaut lorsque vous créez un nouveau portefeuille Bitcoin. Ce compte devra être crédité des bitcoins que l'utilisateur souhaite mixer.


La Tx0 est la première transaction dans le processus de mixage Whirlpool. Son objectif est de venir nettoyer le ou les UTXO à mixer avant de les envoyer vers un premier mix. Cette transaction va permettre de venir diviser l'UTXO en entrée en plusieurs UTXO qui correspondent au montant de la pool choisie. Tous ces UTXO égalisés seront envoyés vers le compte Prémix. La différence restante ne pouvant pas entrer dans la pool choisie sera séparée sur un compte qui lui est dédié : Bad Bank (ou "Doxxic Change").


Cette Tx0 permettra également de payer les frais au coordinateur.


Vous devrez payer des frais de minage pour la Tx0.


Schéma d'une Tx0 CoinJoin Bitcoin
Crédit (image modifiée) : KYCP.org : https://kycp.org/#/a126e48d4a6eb8d19682ec0e23ad45e76cd52b45f6c17be5068ae051d4b2cc24


Sur cet exemple d'une transaction Tx0, nous pouvons voir un input de 2,2550 bitcoins depuis le compte de dépôt de l'utilisateur qui initie la Tx0. Cet input est divisé en plusieurs UTXO en sortie qui représentent :

  • Les frais du coordinateur, ici : 0,0250 B.

  • Les quatre UTXO prêts à être mixés qui vont aller vers le compte Premix de l'utilisateur. Ces UTXO sont également enregistrés auprès du coordinateur.

  • La différence qui ne peut pas entrer dans la pool, car elle demeure trop petite : c'est le change toxique qui va aller vers son compte dédié et isolé.


Les frais ici sont différents de ceux que je vous ai donnés dans le tableau précédent car Samourai a revu à la baisse ses prix pour Whirlpool en Mars 2021.


Compte doxxic change.


Le change que l'on ne peut pas faire entrer dans la pool est envoyé vers le compte Doxxic Change (également nommé "Bad Bank") afin de le séparer complètement du reste des comptes.


Cet UTXO est dangereux pour la confidentialité de l'utilisateur puisque non seulement il est toujours attaché à son passé, et donc éventuellement à l'identité de son propriétaire, mais en plus, il est noté comme appartenant à un propriétaire qui a fait un CoinJoin.


Si cet UTXO est fusionné avec des UTXO mixés, ces derniers perdront toute confidentialité gagnée précédemment. S'il est fusionné avec d'autres Doxxic Changes, l'utilisateur risque de perdre en confidentialité. Il faut donc le traiter avec prudence. Je vous explique précisément comment traiter cet UTXO toxique dans cette partie.




Compte Pre Mix.


Dans le compte Pre Mix, on retrouvera les UTXO égalisés lors de la Tx0 prêts à être mélangés. Ces UTXO sont légèrement supérieurs au montant de la pool puisqu'ils devront solder les frais de minage de leur mix initial.


Une fois que ces UTXO sont passés dans leur mix initial, le compte Pre Mix sera vide et de nouveaux UTXO seront présents dans le compte suivant.




Compte Post Mix.


Le compte Post Mix accueille les UTXOs fraichement mixés depuis leur mix initial. Il accueille également tous les autres UTXO qui restent disponibles pour des remixes.


Si le client Whirlpool est en cours d'exécution, les UTXO présents dans le compte Post Mix sont disponibles pour des remixes. Ils seront sélectionnés aléatoirement pour être remixés.


Lorsque l'utilisateur souhaite dépenser des UTXO mixés, il peut directement le faire depuis ce compte Post Mix. Il est par ailleurs conseillé de laisser ses UTXO mixés dans ce compte, non seulement pour qu'ils soient remixés gratuitement, mais également pour qu'ils ne sortent pas du circuit Whirlpool, sans quoi ils risquent de perdre en confidentialité.




Anon Sets.


Comme expliqué précédemment, les Anon Sets sont deux paramètres qui vont vous permettre de calculer à quel point un UTXO est confidentiel, et donc à quel point votre session de CoinJoin est efficace.


Le premier paramètre est le score prospectif (en anglais : "Forward-looking Anon Set"). Bien que cette sémantique soit fausse, ce score est souvent nommé directement "Anon Set" par raccourci.


Le score prospectif d'un UTXO représente la taille du groupe parmi lequel celui-ci est caché à un moment donné.


Pour vous donner une image, le score prospectif est le nombre d'UTXO actuels qui peuvent correspondre à un UTXO donné dans le passé. Par exemple, imaginons un acteur observant la chaine Bitcoin qui traque un UTXO qui vous appartient avant que celui-ci entre dans la pool de CoinJoin. Après que votre pièce a passé plusieurs mix, l'observateur se demande où elle est passée. Il commence alors à tracer les différents chemins possibles et, grâce à la nature du CoinJoin, il tombera sur plusieurs UTXO qui peuvent potentiellement correspondre au vôtre. Ce nombre d'UTXO potentiels, c'est le score prospectif de votre UTXO qui se trouve parmi eux.


Ainsi, à la sortie d'un premier CoinJoin Whirlpool, un UTXO aura un score prospectif égal à 5. C'est-à-dire qu'il sera caché dans un groupe probable de 5 UTXO :

Schéma de calcul du score prospectif d'un UTXO Bitcoin

Si une personne surveille mon UTXO en entrée, il ne pourra pas savoir lequel de ces 5 UTXO en sortie m'appartient.


Ce score prospectif augmente au fur et à mesure des remixes de l'utilisateur, mais également des remixes des pairs qu'il a rencontrés durant ses mix précédents. Reprenons notre exemple avec un UTXO qui dispose d'un score prospectif de 5 pour le moment. Si cet UTXO qui nous appartient est remixé, alors son score passera à 9.


Ce qui est très intéressant avec Whirlpool, c'est que même si mon UTXO n'est pas remixé, puisqu'il fait partie d'un groupe dans lequel on ne peut pas le différencier des autres, son score augmentera en fonction des remixes de ses pairs rencontrés dans le passé.


Imaginons que notre UTXO ait passé un premier mix, et qu'il dispose donc d'un score de 5. Si un UTXO présent dans ce même mix passe dans un nouveau remixe, alors le score de mon UTXO augmentera à 9, alors même que celui-ci n'a pas bougé depuis le mix initial :

Schéma de calcul du score prospectif d'un UTXO Bitcoin


Cette augmentation du score prospectif est exponentielle puisque, si un UTXO rencontré par l'UTXO que j'ai rencontré lors de mon premier mix se remixe, alors mon Anon Set augmente encore :



Schéma de calcul du score prospectif d'un UTXO Bitcoin


Cette augmentation exponentielle est rendue possible par le modèle unique de Whirlpool établi sur de nombreux petits CoinJoin successifs.


Pour rappel, tous ces remixes sont gratuits, il est donc très judicieux de laisser ses UTXO se mixer et se remixer, tout en profitant des remixes de ses pairs rencontrés, tant que l'on n'a pas besoin de dépenser ces UTXO qui nous appartiennent.


gif



Le deuxième Anon Set que l'on peut déterminer sur un UTXO donné pour calculer son niveau de confidentialité est le score rétrospectif (en anglais "Backward-looking Anon Set")


Ce score rétrospectif est en quelque sorte l'héritage que vous laissent les pairs précédents votre mix initial. Il indique le nombre de Tx0 qui peuvent correspondre à votre UTXO mixé.


Il permet donc de juger du niveau de confidentialité d'un UTXO face à une tentative de traçage opposée à la première évoquée.


Rappelez-vous pour le score prospectif, ce paramètre permet de juger à quel point on est confidentiel en cas de tentative de traçage depuis un UTXO en entrée de cycles de CoinJoin, vers notre UTXO en sortie. Pour le score rétrospectif, le paramètre permet de juger à quel point un UTXO en entrée est confidentiel en prenant comme point de départ de traçage un UTXO en sortie de cycle. C'est-à-dire que l'on fait le chemin inverse.


Par exemple, imaginons qu'un observateur de la chaine Bitcoin connaisse un UTXO, et qu'il souhaiterait tracer d'où il vient pour essayer d'en déterminer son origine. Il va alors voir que cet UTXO a traversé des CoinJoin, et il va tomber sur de nombreux UTXO en entrée de CoinJoin qui pourraient potentiellement être celui recherché. Ce nombre d'UTXO potentiels est le score rétrospectif de l'UTXO tracé.


Pour calculer ce score rétrospectif, il faut d'abord compter à partir de l'UTXO visé tous les UTXO en entrée issus d'une Tx0. Ensuite, il faudra analyser les UTXO de remixage en entrée de la transaction et remonter vers les 3 transactions CoinJoin antérieures dont ils sont issus. Sur chacune de ces trois transactions, on effectuera le même calcul. On continue aussi ainsi de suite jusqu'à la transaction CoinJoin Genesis, c'est-à-dire la première transaction CoinJoin de la pool.



Schéma de calcul du score rétrospectif d'un UTXO Bitcoin


Sur le schéma ci-dessus, le calcul du score rétrospectif d'un des UTXO en sortie du CoinJoin tout en haut revient à calculer le nombre de Tx0 (les bulles bleues) présentes dans les CoinJoin ascendants au CoinJoin visé, jusqu'au CoinJoin Genesis.


Contrairement au score prospectif d'un UTXO qui commencera à 5 après son mix initial puis augmentera, le score rétrospectif d'un UTXO sera immédiatement très élevé lorsque vous avez effectué votre mix initial. Au plus un UTXO a été mixé récemment, au plus son score rétrospectif est élevé. Vous bénéficiez de l'héritage des mix précédents sur la pool choisie.




Whirlpool Stats Tool (WST).


Pour calculer facilement les Anon Sets d'un de vos UTXO mixé sur Whirlpool, vous pouvez utiliser le Whirlpool Stats Tool (WST). Un outil spécialement conçu pour calculer vos Anon Sets sur Whirlpool.


Si vous êtes un utilisateur de RoninDojo, l'outil est préinstallé sur votre nœud. Pour y accéder depuis RoninCLI, allez dans :

Samourai Toolkit > Whirlpool Stat Tool

Si vous ne disposez pas d'un RoninDojo, voici comment installer l'outil WST sur une machine sous Linux :


Vous aurez besoin de : Tor Browser (ou Tor), Python 3.4.4 ou supérieur, git et pip3.


Pour vérifier leur version, entrez les commandes :

python --version
git --version
pip --version

Installez les dépendances :

pip install PySocks
pip install requests[sock5]
pip install plotly
pip install datasketch
pip install numpy

Installez Whirlpool Stats Tool :

#Clonnez le répertoire :
git clone https://code.samourai.io/whirlpool/whirlpool_stats.git

#Accédez au répertoire /whirlpool_stats :
cd whirlpool_stats

#Installez les dépendances avec pip :
pip3 install -r ./requirements.txt

J'ai personnellement eu quelques soucis sur cette dernière version de WST. Si jamais elle ne fonctionne pas pour vous, vous pouvez également cloner la version précédente sur github qui fonctionne parfaitement : https://github.com/Samourai-Wallet/whirlpool_stats. Les étapes suivantes seront les mêmes. Notez simplement que la pool 100k sats n'existait pas à cette époque, il faut donc l'ajouter manuellement au code si vous utilisez l'ancienne release.


Créez ensuite un répertoire de travail pour stocker les données des transactions, puis lancez WST :

#Accédez au répertoire souhaité, par exemple home :
cd ~

#Créez un répertoire dédié, par exemple nommé "wst" :
mkdir wst

#Accèdez au sous-répertoire /whirlpool_stats :
cd whirlpool_stats/whirlpool_stats/

#Lancez WST :
python3 wst.py


Une fois WST installé et lancé, voici comment calculer des Anon Sets. Ces étapes sont similaires que vous soyez sur une machine lambda ou sur RoninDojo :


Tapez la commande suivante pour définir le proxy sur Tor (pour RoninDojo ce sera obligatoirement cette commande) :

socks5 127.0.0.1:9050