Nous nous intĂ©ressons depuis longtemps Ă la question de l'anonymat dans les cryptomonnaies et nous nous efforçons de suivre l'Ă©volution des technologies dans ce domaine. Dans nos articles, nous avons dĂ©jĂ dĂ©taillĂ© les principes de fonctionnement dans Monero, et nous avons Ă©galement examinĂ© les technologies existantes dans ce domaine. Cependant, toutes les cryptomonnaies anonymes actuellement reposent sur le modĂšle de donnĂ©es proposĂ© par Bitcoin â Unspent Transaction Output (UTXO). Pour les blockchains basĂ©es sur des comptes comme Ethereum, les solutions existantes pour mettre en Ćuvre l'anonymat et la confidentialitĂ© (par exemple, ou ) ont tentĂ© de reproduire le modĂšle UTXO dans des contrats intelligents.
En février 2019, un groupe de chercheurs de l'Université de Stanford et de Visa Research publiés par « Zether : Vers la confidentialité dans le monde des contrats intelligents ». Les auteurs ont proposé pour la premiÚre fois une approche pour garantir l'anonymat dans les blockchains basées sur des comptes et ont présenté deux variantes de contrats intelligents : pour des transactions confidentielles (cachant les soldes et les montants des transferts) et anonymes (cachant le destinataire et l'expéditeur). Nous trouvons cette technologie proposée intéressante et aimerions partager son fonctionnement, ainsi que discuter du fait que le problÚme de l'anonymat dans les blockchains basées sur des comptes est considéré comme trÚs complexe et si les auteurs ont réussi à le résoudre complÚtement.
Sur le fonctionnement de ces modÚles de données
Dans le modĂšle UTXO, une transaction se compose d'« entrĂ©es » et d'« sorties ». L'analogue direct des « sorties » â ce sont des billets dans votre portefeuille : chaque « sortie » a une certaine valeur. Lorsque vous payez quelqu'un (formez une transaction), vous dĂ©pensez une ou plusieurs « sorties », qui deviennent alors des « entrĂ©es » de la transaction, et la blockchain les marque comme dĂ©pensĂ©es. Pendant ce temps, le destinataire de votre paiement (ou vous-mĂȘme, si vous avez besoin de monnaie en retour) reçoit de nouvelles « sorties » gĂ©nĂ©rĂ©es. SchĂ©matiquement, cela peut ĂȘtre reprĂ©sentĂ© comme suit :

Les blockchains basées sur des comptes fonctionnent à peu prÚs comme votre compte bancaire. Elles opÚrent uniquement sur le montant de votre compte et le montant de transfert. Lorsque vous transférez une certaine somme de votre compte, vous ne brûlez aucune « sortie », le réseau n'a pas besoin de se souvenir quelles piÚces ont été dépensées et lesquelles ne l'ont pas été. Dans le cas le plus simple, la vérification de la transaction se résume à vérifier la signature de l'expéditeur et le montant de son solde :

Analyse de la technologie
Ensuite, nous parlerons de la façon dont Zether cache le montant des transactions, le destinataire et l'expĂ©diteur. Au fur et Ă mesure que nous dĂ©crivons les principes de son fonctionnement, nous noterons les diffĂ©rences entre la version confidentielle et la version anonyme. Ătant donnĂ© qu'il est beaucoup plus simple de garantir la confidentialitĂ© dans les blockchains basĂ©es sur des comptes, certaines des limitations imposĂ©es par l'anonymisation ne seront pas pertinentes pour la version confidentielle de la technologie.
Masquage des soldes et des montants des transferts
Pour chiffrer les soldes et les montants des transferts dans Zether, un schéma de cryptage est utilisé . Il fonctionne comme suit. Lorsque Alice souhaite envoyer à Bob b des piÚces à l'adresse (sa clé publique) Y, elle choisit un nombre aléatoire r et chiffre le montant :

oĂč C â montant chiffrĂ©, D â valeur auxiliaire nĂ©cessaire pour dĂ©chiffrer ce montant, G â point fixe sur la courbe elliptique, en multipliant la clĂ© secrĂšte par lequel on obtient la clĂ© publique.
Lorsque Bob reçoit ces valeurs, il les additionne simplement Ă son solde chiffrĂ© de la mĂȘme maniĂšre, ce qui rend ce schĂ©ma pratique.
De la mĂȘme maniĂšre, Alice soustrait de son solde les mĂȘmes valeurs, en utilisant son Y clĂ© publique.
Masquage du destinataire et de l'expéditeur
Le mĂ©lange des « sorties » dans UTXO existe depuis les dĂ©buts des cryptomonnaies et aide Ă cacher l'expĂ©diteur. Pour ce faire, l'expĂ©diteur lui-mĂȘme choisit des « sorties » alĂ©atoires dans la blockchain lors de l'effectuation d'un transfert et les mĂ©lange avec les siennes. Ensuite, il signe les « sorties » avec une signature en anneau â un mĂ©canisme cryptographique permettant de convaincre le vĂ©rificateur qu'il y a parmi les « sorties » mĂ©langĂ©es des piĂšces de l'expĂ©diteur. Les piĂšces mĂ©langĂ©es ne sont, bien entendu, pas dĂ©pensĂ©es.
Cependant, pour cacher le destinataire, nous ne pourrons pas générer de fausses « sorties ». Par conséquent, dans l'UTXO, chaque « sortie » a sa propre adresse unique, et elle est cryptographiquement liée à l'adresse du destinataire de ces piÚces. Actuellement, il n'existe aucune méthode pour identifier le lien entre l'adresse unique de la « sortie » et l'adresse du destinataire, sans connaßtre ses clés secrÚtes.
Dans un modĂšle basĂ© sur les comptes, nous ne pouvons pas utiliser des adresses jetables (sinon cela deviendrait un modĂšle de « sorties »). Par consĂ©quent, l'expĂ©diteur et le destinataire doivent ĂȘtre mĂ©langĂ©s avec d'autres comptes dans la blockchain. Dans ce cas, des 0 piĂšces chiffrĂ©es sont dĂ©pensĂ©es (ou ajoutĂ©es 0 â dans le cas du mĂ©lange du destinataire) depuis les comptes mĂ©langĂ©s, sans changer leur vĂ©ritable solde.
Puisque l'expĂ©diteur et le destinataire ont toujours une adresse permanente, il est nĂ©cessaire lors des transferts vers les mĂȘmes adresses d'utiliser les mĂȘmes groupes pour le mĂ©lange. Il est plus simple d'examiner cela par un exemple.
Supposons qu'Alice a dĂ©cidĂ© de faire un don Ă la fondation caritative de Bob, mais prĂ©fĂšre que ce transfert reste anonyme pour un observateur externe. Alors, pour se camoufler dans le champ de l'expĂ©diteur, elle inscrit Ă©galement les comptes d'Adam et d'AdĂšle. Pour cacher Bob â dans le champ du destinataire, elle ajoute les comptes de Ben et de Bill. Lors du prochain don, Alice a choisi d'inscrire Alex et Amanda Ă ses cĂŽtĂ©s, et Bruce et Benjen Ă cĂŽtĂ© de Bob. Dans ce cas, lors de l'analyse de la blockchain, il n'y aura qu'une seule paire d'intervenants qui se croisent dans ces deux transactions â Alice et Bob, ce qui dĂ©-anonymise ces transactions.

Courses de transactions
Comme nous l'avons déjà mentionné, pour masquer son solde dans les systÚmes basés sur les comptes, l'utilisateur chiffre son solde et la somme du transfert. Cependant, il doit prouver que le solde de son compte reste non négatif. Le problÚme est que, lors de la formation d'une transaction, l'utilisateur construit une preuve concernant l'état actuel de son compte. Que se passe-t-il si Bob envoie une transaction à Alice, et qu'elle est acceptée avant celle envoyée par Alice ? Alors, la transaction d'Alice sera considérée comme invalide, car la preuve du solde a été construite avant l'acceptation de la transaction de Bob.

La premiÚre solution qui vient à l'esprit dans une telle situation est de geler le compte jusqu'à la réalisation de la transaction. Mais cette approche ne convient pas, car au-delà de la complexité de cette tùche dans un systÚme distribué, dans un schéma anonyme, il sera difficile de savoir quel compte geler.
Pour rĂ©soudre ce problĂšme, la technologie sĂ©pare les transactions entrantes et sortantes : les dĂ©penses ont un effet immĂ©diat sur l'Ă©tat du solde, tandis que les recettes sont diffĂ©rĂ©es. Pour cela, le concept d'« Ă©poque » est introduit â un groupe de blocs de taille fixe. L'« Ă©poque » actuelle est dĂ©terminĂ©e par la division de la hauteur du bloc par la taille du groupe. Lors du traitement d'une transaction, le rĂ©seau met immĂ©diatement Ă jour le solde de l'expĂ©diteur, tandis que les fonds du destinataire sont accumulĂ©s. Les fonds accumulĂ©s ne sont disponibles pour le destinataire du paiement qu'Ă l'arrivĂ©e de la nouvelle « Ă©poque ».
En consĂ©quence, l'utilisateur peut envoyer des transactions indĂ©pendamment de la frĂ©quence Ă laquelle il reçoit des fonds (dans la mesure oĂč son solde le permet, bien sĂ»r). La taille de l'Ă©poque est dĂ©terminĂ©e en fonction de la rapiditĂ© avec laquelle les blocs se rĂ©pandent dans le rĂ©seau et de la vitesse Ă laquelle une transaction est intĂ©grĂ©e dans un bloc.
Cette solution fonctionne bien pour les transferts confidentiels, mais elle crée de sérieux problÚmes avec les transactions anonymes, comme nous le verrons plus loin.
Protection contre les attaques de reproduction
Dans les blockchains basĂ©es sur des comptes, chaque transaction est signĂ©e par la clĂ© privĂ©e de l'expĂ©diteur, ce qui convainc le vĂ©rificateur que la transaction n'a pas Ă©tĂ© modifiĂ©e et qu'elle a Ă©tĂ© créée par le propriĂ©taire de cette clĂ©. Mais que se passe-t-il si un malfaiteur, ayant interceptĂ© le canal de transmission, rĂ©introduit exactement le mĂȘme message ? Le vĂ©rificateur comparera la signature de la transaction et sera convaincu de son autorisation, et le rĂ©seau dĂ©bitera Ă nouveau le mĂȘme montant du solde de l'expĂ©diteur.
Cette attaque est appelée une attaque de reproduction. Dans le modÚle UTXO, ces attaques ne sont pas pertinentes, car le malfaiteur tentera d'utiliser des sorties dépensées, ce qui en soi n'est pas valide et est rejeté par le réseau.
Pour éviter cela, un champ de données aléatoires, appelé nonce ou simplement « sel », est intégré à la transaction. Lors de la renvoi d'une transaction avec le « sel », le vérificateur vérifie si ce nonce a été utilisé auparavant et, si ce n'est pas le cas, considÚre cette transaction comme valide. Pour ne pas stocker toute l'historique des nonces des utilisateurs dans la blockchain, on accepte généralement que le nonce de la toute premiÚre transaction soit égal à zéro, puis on l'augmente de un. Il ne reste plus qu'à vérifier que le nonce de la nouvelle transaction diffÚre de l'ancien de un.
Dans un schéma de transfert anonyme, le problÚme de validation des nonces des transactions se présente. Nous ne pouvons pas lier explicitement le nonce à l'adresse de l'expéditeur, car cela dé-anonymiserait clairement le transfert. Nous ne pouvons pas non plus incrémenter le nonce de tous les comptes impliqués, car cela pourrait entrer en conflit avec d'autres transferts en cours de traitement.
Les auteurs de Zether proposent de gĂ©nĂ©rer des nonces de maniĂšre cryptographique â en fonction de l'« Ă©poque ». Par exemple :

Ici x â la clĂ© secrĂšte de l'expĂ©diteur, et Gepoch â un gĂ©nĂ©rateur supplĂ©mentaire pour l'Ă©poque, obtenu en hachant une chaĂźne de type 'Zether + '. Maintenant, le problĂšme semble ĂȘtre rĂ©solu â nous ne rĂ©vĂ©lons pas le nonce de l'expĂ©diteur et ne nous mĂȘlons pas aux nonces des participants non impliquĂ©s. Mais cette approche impose une limite sĂ©rieuse : un compte ne peut envoyer plus d'une transaction par « Ă©poque ». Malheureusement, ce problĂšme reste non rĂ©solu et rend, Ă notre avis, la version anonyme de Zether Ă peine utilisable.
La complexité des preuves à divulgation nulle
Dans UTXO, l'expéditeur doit prouver au réseau qu'il ne dépense pas un montant négatif, sinon il deviendrait possible de générer de nouvelles piÚces de toutes piÚces (nous avons discuté de pourquoi cela est possible dans l'un de nos précédents ). Il doit également signer les « entrées » avec une signature de type anneau pour prouver que parmi les piÚces mélangées, il y a des fonds qui lui appartiennent.
Dans la version anonyme de la blockchain basée sur les comptes, les expressions pour la preuve deviennent beaucoup plus complexes. L'expéditeur prouve que :
- Le montant envoyé est positif ;
- Le solde reste non négatif ;
- L'expéditeur a correctement chiffré les montants des transferts (y compris zéro) ;
- Le solde change uniquement pour l'expéditeur et le destinataire ;
- L'expéditeur possÚde la clé secrÚte de son compte et il est réellement présent sur la liste des expéditeurs (parmi les mélangés) ;
- Le nonce utilisé dans la transaction est constitué correctement.
Pour une telle preuve complexe, les auteurs utilisent un mĂ©lange (l'un des auteurs, soit dit en passant, a participĂ© Ă sa crĂ©ation) et , que l'on appelle Sigma-bullets. La preuve formelle de cette affirmation est assez complexe, et elle limite fortement le nombre de personnes dĂ©sireuses de se lancer dans la mise en Ćuvre de la technologie.
Quel est le résultat ?
Ă notre avis, la partie Zether, qui apporte de la confidentialitĂ© aux blockchains basĂ©es sur des comptes, peut dĂ©jĂ ĂȘtre utilisĂ©e. Mais pour le moment, la version anonyme de la technologie impose de sĂ©rieuses restrictions Ă son utilisation, et sa complexitĂ© complique sa mise en Ćuvre. Cependant, il ne faut pas oublier que les auteurs l'ont publiĂ©e il y a seulement quelques mois, et il se peut que quelqu'un d'autre trouve une solution aux problĂšmes existants aujourd'hui. C'est exactement ainsi que la science progresse.
Source : habr.com
