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.

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 ).
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 . 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 , 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 , elles ont Ă©tĂ© remplacĂ©es par les MLSAG â une version adaptĂ©e pour plusieurs entrĂ©es des signatures en anneau similaires unilocalisĂ©es, .
. 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
, et les images de clé pour elles respectivement :
Ainsi, nous avons une matrice de taille 2 x m. Pour commencer, nous devons calculer les soi-disant challenges pour chaque paire de sorties :

Nous commençons les calculs avec les sorties que nous dépensons, en utilisant leurs clés publiques :
et des nombres aléatoires
Au final, nous obtenons les valeurs :
, que nous utilisons pour calculer le challenge
de 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és
. Pour Ï-iĂšme colonne, ils nous seront Ă©galement nĂ©cessaires. Transformons
en s :
La signature elle-mĂȘme est un tuple de toutes ces valeurs :

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ées
, restaure les valeurs c1,âŠ, cm et vĂ©rifie que
. 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
(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 :
OĂč 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 :

L'engagement des frais est calculĂ© un peu diffĂ©remment â sans masque :
, 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) :

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 :
![]()
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 :

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 :

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 :
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 ):
Tout 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. , ils peuvent rĂ©duire la taille de la preuve de portĂ©e jusqu'Ă 94 %. Ă propos, Ă la mi-juillet, la technologie a Ă©tĂ© 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 , afin de rester informé de nos événements et publications.
Source : habr.com
