Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu

Nous continuons notre série sur le fonctionnement de la blockchain Monero, et l'article d'aujourd'hui sera consacré au protocole RingCT (Ring Confidential Transactions), qui introduit des transactions confidentielles et de nouvelles signatures en anneau. Malheureusement, il y a peu d'informations sur son fonctionnement sur Internet, et nous avons essayé de combler cette lacune.

Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu

Nous parlerons de la maniÚre dont ce protocole dissimule les montants des transactions dans le réseau, pourquoi les signatures en anneau classiques utilisées dans les cryptonotes ont été abandonnées et comment cette technologie va évoluer à l'avenir.

Étant donnĂ© que ce protocole est l'une des technologies les plus complexes de Monero, le lecteur aura besoin de connaissances de base sur le fonctionnement de cette blockchain et d'une comprĂ©hension superficielle de la cryptographie sur courbes elliptiques (pour rafraĂźchir ces connaissances, vous pouvez lire les premiers chapitres de notre prĂ©cĂ©dent article sur les signatures multiples).

Le protocole RingCT

Une des attaques possibles sur les cryptomonnaies cryptonote est l'analyse de la blockchain, basée sur la connaissance du montant et de l'heure de la transaction envoyée. Cela permet de réduire considérablement le champ de recherche des sorties qui intéressent l'attaquant. Pour se protéger contre une telle analyse, Monero a mis en place un protocole de transactions anonymes qui dissimule complÚtement les montants des transactions dans le réseau.

Il convient de noter que l'idĂ©e de dissimuler les montants n'est pas nouvelle. L'un des premiers Ă  l'avoir dĂ©crite est le dĂ©veloppeur de Bitcoin Core Greg Maxwell dans son article sur les Transactions Confidentielles. La rĂ©alisation actuelle de RingCT en est une modification, permettant l'utilisation de signatures en anneau (comment s'en passer), et elle a pris son nom — Ring Confidential Transactions.

En outre, le protocole aide Ă  rĂ©soudre les problĂšmes liĂ©s Ă  la confusion des sorties poussiĂšres — des sorties de faible montant (qui rĂ©sultent gĂ©nĂ©ralement de monnaie rendue lors de transactions), qui posaient plus de problĂšmes qu'elles n'en valaient la peine.

En janvier 2017, un hard fork du rĂ©seau Monero a eu lieu, permettant d'utiliser des transactions confidentielles de maniĂšre optionnelle. Et en septembre de la mĂȘme annĂ©e, avec le hard fork de la version 6, ces transactions sont devenues les seules autorisĂ©es sur le rĂ©seau.

RingCT utilise plusieurs mĂ©canismes : des signatures de groupe anonymes spontanĂ©es liĂ©es multilayered (Multilayered Linkable Spontaneous Anonymous Group Signature, ensuite — MLSAG), un schĂ©ma d'engagement (Pedersen Commitments) et des preuves de portĂ©e (ce terme n'a pas d'Ă©quivalent Ă©tabli en français).

Le protocole RingCT introduit deux types de transactions anonymes : simple et full. La premiĂšre est gĂ©nĂ©rĂ©e par le portefeuille lorsque la transaction utilise plus d'une entrĂ©e, les secondes dans le cas inverse. Elles diffĂšrent par la validation des montants des transactions et les donnĂ©es signĂ©es par la signature MLSAG (nous en parlerons plus en dĂ©tail ci-dessous). De plus, les transactions de type full peuvent ĂȘtre gĂ©nĂ©rĂ©es avec n'importe quel nombre d'entrĂ©es, il n'y a aucune diffĂ©rence fondamentale. Dans le livre «Zero to Monero» , il est mentionnĂ© que la dĂ©cision de limiter les transactions full Ă  une entrĂ©e a Ă©tĂ© prise Ă  la hĂąte et pourrait changer Ă  l'avenir.

La signature MLSAG

Rappelons ce que reprĂ©sentent les entrĂ©es signĂ©es d'une transaction. Chaque transaction dĂ©pense des fonds et en gĂ©nĂšre. La gĂ©nĂ©ration de fonds se fait par la crĂ©ation d'ouvertures de transaction (analogie directe — billets), et l'ouverture que la transaction dĂ©pense (car dans la vie rĂ©elle, nous dĂ©pensons prĂ©cisĂ©ment des billets) devient une entrĂ©e (attention, il est trĂšs facile de se perdre ici).

Une entrĂ©e fait rĂ©fĂ©rence Ă  plusieurs ouvertures, mais n'en dĂ©pense qu'une seule, ainsi crĂ©ant un « Ă©cran de fumĂ©e » pour compliquer l'analyse de l'historique des transferts. Si une transaction a plus d'une entrĂ©e, cette structure peut ĂȘtre reprĂ©sentĂ©e sous forme de matrice, oĂč les lignes sont des entrĂ©es et les colonnes — les ouvertures mĂ©langĂ©es. Pour prouver au rĂ©seau que la transaction dĂ©pense bien ses propres ouvertures (connaissant leurs clĂ©s secrĂštes), les entrĂ©es sont signĂ©es par une signature en anneau. Cette signature garantit que le signataire connaissait les clĂ©s secrĂštes de tous les Ă©lĂ©ments d'une colonne.

Les transactions confidentielles n'utilisent plus les signatures en anneau classiques de cryptonote , elles ont Ă©tĂ© remplacĂ©es par les MLSAG — une version adaptĂ©e pour plusieurs entrĂ©es des signatures en anneau similaires unilocalisĂ©es, LSAG.

. Elles sont appelées multischichtées car elles signent plusieurs entrées à la fois, chacune étant mélangée avec plusieurs autres, c'est-à-dire qu'une matrice est signée et non une seule ligne. Comme nous le verrons plus loin, cela aide à économiser de la taille de la signature.

Examinons comment une signature en anneau est formĂ©e, Ă  l'exemple d'une transaction qui dĂ©pense 2 ouvertures rĂ©elles et utilise pour le mĂ©lange m — 1 alĂ©atoires de la blockchain. DĂ©signons les clĂ©s publiques des ouvertures que nous dĂ©pensons comme
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu, et les images de clé pour elles respectivement : Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu Ainsi, nous avons une matrice de taille 2 x m. Pour commencer, nous devons calculer les soi-disant challenges pour chaque paire de sorties :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
Nous commençons les calculs avec les sorties que nous dépensons, en utilisant leurs clés publiques :Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnuet des nombres aléatoiresTransactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnuAu final, nous obtenons les valeurs :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu, que nous utilisons pour calculer le challenge
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnude la prochaine paire de sorties (pour faciliter la compréhension de ce que nous remplaçons, nous avons mis ces valeurs en couleurs différentes). Toutes les valeurs suivantes sont calculées en rond selon les formules présentées dans la premiÚre illustration. Le challenge pour la paire réelle de sorties est calculé en dernier.

Comme nous le voyons, dans toutes les colonnes, sauf celle contenant les sorties rĂ©elles, des nombres gĂ©nĂ©rĂ©s alĂ©atoirement sont utilisĂ©sTransactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnu. Pour π-iĂšme colonne, ils nous seront Ă©galement nĂ©cessaires. TransformonsTransactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnuen s :Transactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnu
La signature elle-mĂȘme est un tuple de toutes ces valeurs :

Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu

Ensuite, ces données sont enregistrées dans la transaction.

Comme nous le voyons, le MLSAG contient un seul challenge c0, ce qui permet d'économiser sur la taille de la signature (qui demande déjà beaucoup d'espace). Ensuite, tout vérificateur, en utilisant les donnéesTransactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu, restaure les valeurs c1,
, cm et vérifie queTransactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu. Ainsi, notre anneau s'est bouclé et la signature a passé la vérification.

Pour les transactions RingCT de type full, une ligne supplémentaire est ajoutée à la matrice avec les sorties mélangées, mais nous en parlerons plus tard.

Engagements de Pedersen

SchĂ©mas d'engagements (le terme anglais — commitments — est le plus souvent utilisĂ©) sont utilisĂ©s pour qu'une partie puisse prouver qu'elle connaĂźt un certain secret (nombre) sans le rĂ©vĂ©ler rĂ©ellement. Par exemple, vous lancez un certain nombre sur des dĂ©s, calculez l'engagement et le transmettez Ă  la partie vĂ©rificatrice. Ainsi, au moment de dĂ©voiler le nombre secret, le vĂ©rificateur calcule lui-mĂȘme l'engagement, s'assurant ainsi que vous ne l'avez pas trompĂ©.

Dans Monero, les engagements sont utilisĂ©s pour masquer les montants des transferts et appliquent la variante la plus courante — les engagements de Pedersen. D'ailleurs, un fait intĂ©ressant — au dĂ©part, les dĂ©veloppeurs proposaient de masquer les montants par un simple mĂ©lange, c'est-Ă -dire d'ajouter des sorties Ă  des montants alĂ©atoires pour introduire de l'incertitude, mais ont ensuite optĂ© pour des engagements (il n'est pas certain que cela ait permis d'Ă©conomiser sur la taille de la transaction, comme nous le verrons plus bas).
Dans l'ensemble, un engagement se présente comme suit :
Transactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnuOĂč C — la valeur de l'engagement lui-mĂȘme, a — le montant masquĂ©, H — un point fixe sur une courbe elliptique (gĂ©nĂ©rateur additionnel), x — un masque arbitraire, un facteur cachĂ©, gĂ©nĂ©rĂ© alĂ©atoirement. Ce masque est nĂ©cessaire pour que la troisiĂšme partie ne puisse pas deviner la valeur d'engagement simplement par essais et erreurs.

Lors de la gĂ©nĂ©ration d'une nouvelle sortie, le portefeuille calcule une valeur d'engagement, et en cas de dĂ©pense, il utilise soit la valeur calculĂ©e lors de la gĂ©nĂ©ration, soit la recalcule — selon le type de transaction.

RingCT simple

Dans le cas de transactions RingCT simples, pour garantir que la transaction ait créé des sorties dont le montant est égal à la somme des entrées (et n'ait pas généré de l'argent à partir de rien), il est nécessaire que les sommes des engagements des premiÚres et deuxiÚmes sorties soient identiques, c'est-à-dire :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
L'engagement des frais est calculĂ© un peu diffĂ©remment — sans masque :
Transactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnu, oĂč a — le montant des frais, qui est publiquement accessible.

Cette approche permet de prouver à la partie vérificatrice que nous utilisons des sommes identiques, sans les révéler.

Pour rendre cela plus clair, prenons un exemple. Supposons qu'une transaction dépense deux sorties (c'est-à-dire qu'elles deviennent des entrées) de 10 et 5 XMR et génÚre trois sorties d'un montant total de 12 XMR : 3, 4 et 5 XMR. Dans ce cas, elle paie des frais de 3 XMR. Ainsi, la somme d'argent dépensée plus la somme générée et les frais égalent 15 XMR. Essayons de calculer les engagements et observons la différence de leurs sommes (rappelons un peu de mathématiques) :

Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
Ici, nous voyons que, pour que l'Ă©quation soit correcte, les sommes des masques des entrĂ©es et des sorties doivent ĂȘtre identiques. Pour cela, le portefeuille gĂ©nĂšre alĂ©atoirement x1, y1, y2 et y3, tandis que le reste x2 est calculĂ© comme suit :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
En utilisant ces masques, nous pouvons prouver à n'importe quel vérificateur que nous ne générons pas plus de fonds que nous ne dépensons, sans révéler les sommes. Original, n'est-ce pas ?

RingCT complet

Dans les transactions RingCT complÚtes, la vérification des montants des transferts se fait de maniÚre un peu plus complexe. Dans ces transactions, le portefeuille ne recalcule pas les engagements pour les entrées, mais utilise ceux calculés lors de leur génération. Il faut alors supposer que la différence des sommes n'est plus égale à zéro, mais à la place :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
Ici z — la diffĂ©rence des masques des entrĂ©es et des sorties. Si nous considĂ©rons zG comme une clĂ© publique (ce qu'elle est de facto), alors z — c'est une clĂ© privĂ©e. Ainsi, nous connaissons la clĂ© publique et sa clĂ© privĂ©e correspondante. Avec ces informations, nous pouvons les utiliser dans la signature en anneau MLSAG avec les clĂ©s publiques des sorties mĂ©langĂ©es :
Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
Ainsi, une signature en anneau valide garantira que nous connaissons toutes les clĂ©s privĂ©es d'une des colonnes, tandis que la clĂ© privĂ©e de la derniĂšre ligne ne peut ĂȘtre connue que si la transaction ne gĂ©nĂšre pas plus de fonds qu'elle n'en dĂ©pense. D'ailleurs, ici se trouve la rĂ©ponse Ă  la question « pourquoi la diffĂ©rence des sommes des commitments ne donne-t-elle pas zĂ©ro » — si zG = 0, alors nous dĂ©voilerons la colonne avec les sorties rĂ©elles.

Mais comment le destinataire saura-t-il combien d'argent il a reçu ? C'est simple : l'expéditeur de la transaction et le destinataire échangent des clés selon le protocole de Diffie-Hellman, en utilisant la clé de la transaction et la clé de vue du destinataire pour calculer un secret commun. L'expéditeur enregistre dans des champs spéciaux de la transaction les montants des sorties, chiffrés avec cette clé commune.

Preuves d'intervalle

Que se passe-t-il si nous utilisons un nombre nĂ©gatif comme montant dans les commitments ? Cela pourrait conduire Ă  la gĂ©nĂ©ration de piĂšces supplĂ©mentaires ! Un tel rĂ©sultat est inacceptable, donc nous avons besoin d'une garantie que les sommes que nous utilisons ne sont pas nĂ©gatives (sans rĂ©vĂ©ler ces sommes, bien sĂ»r, sinon tout ce travail serait vain). En d'autres termes, nous devons prouver que la somme se situe dans l'intervalle [0, 2n — 1].

Pour cela, chaque montant de sortie est décomposé en bits binaires et un commitment est calculé pour chaque bit séparément. Comment cela se passe, il est préférable de l'observer avec un exemple.

Supposons que nos montants soient petits et tiennent dans 4 bits (en pratique, c'est 64 bits), et que nous créons une sortie pour un montant de 5 XMR. Calculons les commitments pour chaque bit et le commitment total pour l'ensemble du montant :Transactions confidentielles dans Monero, ou comment transférer quelque chose d'inconnu vers un endroit inconnu
Ensuite, chaque commitment est mélangé avec un substitut (Ci-2iH) et signé par une signature en anneau de Borromeo (une autre signature en anneau), proposée par Greg Maxwell en 2015 (vous pouvez lire plus à son sujet ici):
Transactions confidentielles dans Monero, ou comment transfĂ©rer quelque chose d'inconnu vers un endroit inconnuTout cela s'appelle preuve d'intervalle et permet de garantir que les sommes dans les commitments sont dans l'intervalle [0, 2n — 1].

Et aprĂšs ?

Dans la mise en Ɠuvre actuelle, les preuves de portĂ©e occupent beaucoup d'espace — 6176 octets par sortie. Cela entraĂźne des transactions de grande taille et, par consĂ©quent, des frais plus Ă©levĂ©s. Pour rĂ©duire la taille des transactions, les dĂ©veloppeurs de Monero introduisent des bulletproofs — un mĂ©canisme de preuve de portĂ©e sans engagements bit Ă  bit, Ă  la place des signatures de Borromeo. Selon certaines estimations, ils peuvent rĂ©duire la taille de la preuve de portĂ©e jusqu'Ă  94 %. À propos, Ă  la mi-juillet, la technologie a Ă©tĂ© auditĂ©e par la sociĂ©tĂ© Kudelski Security, qui n'a identifiĂ© aucun dĂ©faut significatif dans la technologie elle-mĂȘme ni dans sa mise en Ɠuvre. La technologie est dĂ©jĂ  utilisĂ©e sur le rĂ©seau de test et, avec le nouveau hard fork, pourrait probablement ĂȘtre intĂ©grĂ©e dans le rĂ©seau principal.

Posez vos questions, proposez des sujets pour de nouveaux articles sur les technologies dans le domaine des cryptomonnaies, et abonnez-vous à notre groupe sur Facebook, afin de rester informé de nos événements et publications.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster