PayJoin / P2EP : des paiements plus anonymes pour Bitcoin
Acheter Bitcoin (BTC)
Publicité eToro
PayJoin, aussi appelé Pay-to-EndPoint (P2EP) en référence à son implémentation la plus répandue, est un procédé de mélange de pièces permettant d'améliorer la confidentialité des paiements sur Bitcoin. Il a été proposé initialement en juillet 2018, à la suite d'un atelier sur la confidentialité organisé par l'entreprise Blockstream. Il a récemment refait surface grâce à son implémentation dans BTCPay Server en avril 2020.
Quel est le principe derrière PayJoin ?
Comme chacun le sait, toutes les transactions sur la chaîne de blocs de Bitcoin sont publiques. Bien que le système soit pseudonyme et que ces transactions se fassent entre des adresses, la confidentialité sur Bitcoin est loin d'être parfaite : si on parvient à lier votre identité à une adresse, alors vos fonds deviennent traçables. C'est pour cela qu'il existe une multitude de techniques permettant de brouiller les pistes. PayJoin est l'une de ces techniques et a pour particularité de n'intervenir que lors des paiements. Voyons comment tout ceci fonctionne.
Un paiement a lieu lorsqu'un client envoie des bitcoins à un marchand, qui lui fournit un service en échange. Il s'agit d'un concept général : le client désigne ici celui qui envoie les fonds et le marchand celui qui les reçoit. Le marchand peut donc être un commerçant vendant des objets en tout genre, mais aussi une plateforme d'échange permettant à ses utilisateurs de convertir leurs bitcoins pour des euros ou d'autres cryptomonnaies, ou encore un site de jeu d'argent en ligne.
Contrairement à ce qu'on imagine parfois, le paiement sur la chaîne ne va pas être un simple transfert du type « A donne 3 BTC à B » mais va souvent prendre une forme plus complexe. En effet, dans Bitcoin, les transactions sont constituées d'entrées et de sorties (souvent multiples), chaque entrée étant le résultat d'une transaction précédente. Il faut donc voir le système de transactions comme une fonderie : dans une transaction, une ou plusieurs pièces de bitcoin en entrée (qui sont des sorties transactionnelles non dépensées ou UTXO) sont fondues pour donner une ou plusieurs pièces en sortie, ce qui permet de suivre naturellement la propriété des fonds.
? Pour comprendre comment les transactions fonctionnent dans Bitcoin, vous pouvez lire notre article Bitcoin, smart contracts et UTXO.
Pour procéder à un paiement, le client va ainsi débloquer la (ou les) pièce(s) de bitcoin en sa possession, créer un nouvelle pièce à l'adresse du marchand et, en général, se rendre la monnaie en s'octroyant le reste. Considérons par exemple qu'un client paie 3 mBTC (24 €) à un marchand : il mobilise pour cela une pièce de 13 mBTC (résultat d'une transaction précédente), crédite l'adresse du marchand de 3 mBTC, et se rend la monnaie en envoyant les 10 mBTC restants à une nouvelle adresse (les frais sont omis).
Ce fonctionnement fait qu'il est assez facile pour ceux qui surveillent la chaîne de blocs de déterminer quels fonds sont à l'utilisateur (les entrées) et de savoir qu'il y a eu un paiement. De plus, si l'utilisateur réutilise le reste de ses fonds dans une nouvelle transaction impliquant d'autres adresses associées à son identité, alors la transaction précédente devient encore plus lisible et il est possible d'en déduire le montant du paiement et l'adresse du marchand.
C'est pour améliorer cet état des choses que Payjoin a été imaginé en 2018. Il s'agit d'un type particulier de CoinJoin qui est appliqué au moment d'un paiement. Pour ce faire, le client et le marchand co-signent une transaction qui a le même résultat final, mais qui permet de brouiller les pistes. Dans notre exemple, le marchand implique ici 8 mBTC issus de ses fonds propres : cette fois-ci 11 mBTC sont envoyés à l'adresse du marchand, et 10 mBTC sont envoyés à l'adresse du client comme précédemment.
Dans cette transaction, il est plus difficile de deviner les choses. Un analyste externe naïf supposera en effet que les deux entrées appartiennent au client et que l'une des deux sorties est celle vers le marchand. En outre, même en connaissant l'existence de PayJoin et en supposant qu'il s'agisse de ce type de paiement, il existe de nombreuses façon d'interpréter les données.
Cela est encore plus flagrant lorsque le marchand en profite pour fusionner ses pièces en une seule (ce qu'il est de toute manière incité à faire) : l'adresse du client est alors noyée dans les adresses du marchand.
On voit donc l’intérêt direct de PayJoin qui permet d'améliorer l'anonymat des transactions. Cependant, PayJoin n'est que la description générale du procédé et ne dit rien de la mise en relation des deux participants. C'est là qu'intervient Pay-to-EndPoint (P2EP).
Le protocole de paiement Pay-to-EndPoint (P2EP)
Peu de gens le savent, mais aux débuts de Bitcoin, il était possible d'envoyer des fonds vers une adresse IP, ou plutôt vers la clé publique associée à une adresse IP. Cette fonctionnalité, appelée Pay-to-IP (P2IP), était pratique mais pas forcément très sécurisée, ni très bonne pour la préservation de la vie privée des utilisateurs. C'est pour ces raisons qu'elle a été supprimée en septembre 2011.
Le protocole de paiement Pay-to-EndPoint (P2EP) a ranimé cette idée : il s'agit en effet de pouvoir envoyer des fonds à une adresse IP ou un nom de domaine (de préférence une adresse Tor), qui est l'adresse du serveur du marchand. En communiquant avec le serveur, le client est ainsi en mesure de construire une transaction PayJoin pour procéder au paiement.
Dès 2018, un protocole de ce type nommé Bustapay avait été proposé par Ryan Havar, mais n'avait pas été mis en application. La version de P2EP actuelle est une version fortement modifiée de Bustapay qui a été développée en avril 2020 par Andrew Camilleri (BTCPay Server) grâce au financement de l'entreprise Blockstream. Notez également que les transactions collaboratives Stowaway du Samourai Wallet sont aussi des transactions PayJoin, construites grâce à un protocole qui n'est pas compatible avec P2EP.
Voici comment fonctionne le protocole de paiement P2EP :
- Le marchand crée une demande de paiement en générant un URI (Uniform Resource Identifier) semblable à ce qui est décrit dans le BIP-21 et facilement intégrable dans un code QR. Cet URI contient le nom de domaine du serveur du marchand. Par exemple :
bitcoin:bc1qe9s87yw62zu5qe7873x3zh3ahhls7677k4y5jt?amount=0.003&pj=https://btcpayserver789132.sideshift.ai/BTC/pj
- Le client contacte le serveur et lui transmet une transaction originale qui sert de modèle pour la suite. Il s'agit d'un paiement simple (sans PayJoin) qui peut être diffusé sur le réseau si le processus échoue.
- Le marchand vérifie qu'il dispose des fonds disponibles et construit une transaction partiellement signée qu'il renvoie au client. Cette transaction est la proposition de transaction PayJoin.
- Le client s'assure que tout est en règle, signe la transaction à son tour et la diffuse sur le réseau. La transaction résultante est la transaction PayJoin.
À l'heure actuelle, seul BTCPay Server a implémenté P2EP, ce qui permet à tous ses marchands d'accepter les paiements PayJoin : le service d'échange SideShift.ai a ainsi mis en place la chose assez récemment. Bien que BTCPay Server soit pour l'instant la seule infrastructure à offrir l'accès à P2EP, la fonctionnalité est en voie d'être intégrée dans de nombreux portefeuilles comme le Wasabi Wallet, le BlueWallet et Blockstream Green.
Conclusion
PayJoin est donc un procédé de mélange de pièces permettant de rendre les paiements plus anonymes sur Bitcoin, mis en place par le protocole de paiement Pay-to-EndPoint (P2EP), qui a été développé par BTCPay Server. Il dispose d'un certain nombre d'avantages qui pourraient contribuer à son adoption par l'écosystème :
- La confidentialité s'applique aux deux participants (client et marchand).
- La transaction ne laisse pas de trace détectable, à l'inverse d'une transaction CoinJoin classique qui est facilement repérable.
- PayJoin peut être implémenté facilement dans les portefeuilles légers comme le Wasabi Wallet ou le BlueWallet.
- Si utilisé massivement, ce procédé invaliderait l'heuristique de co-dépense (« toutes les entrées d'une transaction sont contrôlées par une seule entité ») utilisée par les sociétés d'analyse de chaîne.
- Le marchand peut utiliser la transaction pour fusionner ses pièces dans le même temps.
Toutefois, PayJoin n'est pas parfait et présente quelques inconvénients :
- Le client paie plus de frais.
- Les deux participants (notamment le marchand) doivent être en ligne pour que le paiement se fasse.
- Pour que le procédé ait lieu automatiquement, le marchand doit avoir un hot wallet, ce qui lui demande de sécuriser convenablement son système. Notons cependant que certains services, comme les plateformes d'échange, sont parfaitement adaptés pour cela.
Ainsi, bien qu'il soit imparfait, le procédé PayJoin et son application P2EP permettraient d'améliorer grandement la confidentialité des paiements sur Bitcoin s'il était adopté à grande échelle.
Pour aller plus loin
nopara73, Pay To EndPoint, 31 juillet 2018.
Matthew Haywood, Improving Privacy Using Pay-to-EndPoint (P2EP), 8 août 2018.
Samson Mow et Daniel Williams, Bitcoin Privacy Improves With BTCPay Server's P2EP Implementation, 16 avril 2020.
BTCPay Server, Payjoin implementation notes.
tres bon article!
Merci 🙂