Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra

Ons gaan voort met ons reeks oor die Monero-blokketting, en vandag se artikel sal fokus op die RingCT (Ring Confidential Transactions) protokol, wat vertroulike transaksies en nuwe ringhandtekeninge bekendstel. Ongelukkig is daar min inligting op die internet oor hoe dit werk, en ons het probeer om hierdie leemte te vul.

Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra

Ons sal praat oor hoe die netwerk oordragbedrae met behulp van hierdie protokol verberg, hoekom hulle die klassieke kriptonote-ringhandtekeninge laat vaar het, en hoe hierdie tegnologie verder sal ontwikkel.

Aangesien hierdie protokol een van die mees komplekse tegnologieë in Monero is, sal die leser 'n basiese kennis nodig hê van die ontwerp van hierdie blokketting en 'n verbygaande kennis van elliptiese kromme kriptografie (om hierdie kennis op te knap, kan u die eerste hoofstukke van ons lees. vorige artikel oor multihandtekeninge).

RingCT protokol

Een van die moontlike aanvalle op kriptonote-geldeenhede is blokkettinganalise gebaseer op kennis van die bedrag en tyd van die gestuurde transaksie. Dit laat toe die soekgebied vir uitgange van belang vir die aanvaller aansienlik vernou. Om teen sulke ontleding te beskerm, het Monero 'n anonieme transaksieprotokol geïmplementeer wat die bedrae van oordragte op die netwerk heeltemal verberg.

Dit is opmerklik dat die idee om bedrae weg te steek nie nuut is nie. Bitcoin Core-ontwikkelaar Greg Maxwell was een van die eerstes wat dit in sy beskryf het artikel Vertroulike Transaksies. Die huidige implementering van RingCT is die wysiging daarvan met die moontlikheid om ringhandtekeninge te gebruik (hetsy sonder hulle), en dit is hoe dit sy naam gekry het - Ring Confidential Transactions.

Die protokol help onder meer om ontslae te raak van probleme met die vermenging van stofuitsette – uitsette van 'n klein hoeveelheid (gewoonlik ontvang in die vorm van verandering van transaksies), wat meer probleme geskep het as wat dit werd was.

In Januarie 2017 het 'n harde vurk van die Monero-netwerk plaasgevind, wat die opsionele gebruik van vertroulike transaksies moontlik gemaak het. En reeds in September van dieselfde jaar, met die weergawe 6 harde vurk, het sulke transaksies die enigste geword wat op die netwerk toegelaat word.

RingCT gebruik verskeie meganismes gelyktydig: meerlaagse gekoppelde spontane anonieme groephandtekeninge (Multilayered Linkable Spontaneous Anonymous Group Signature, hierna verwys as MLSAG), 'n verbintenisskema (Pedersen Commitments) en reeksbewyse (hierdie term het nie 'n gevestigde vertaling in Russies nie) .

Die RingCT-protokol stel twee tipes anonieme transaksies bekend: eenvoudig en volledig. Die beursie genereer die eerste wanneer 'n transaksie meer as een inset gebruik, die tweede - in die teenoorgestelde situasie. Hulle verskil in die validering van transaksiebedrae en die data wat met 'n MLSAG-handtekening onderteken is (ons sal hieronder meer hieroor praat). Boonop kan transaksies van tipe vol gegenereer word met enige aantal insette, daar is geen fundamentele verskil nie. In die boek "Nul na Monero" In hierdie verband word gesê dat die besluit om volle transaksies tot een inset te beperk, inderhaas geneem is en in die toekoms kan verander.

MLSAG handtekening

Kom ons onthou wat getekende transaksie-insette is. Elke transaksie bestee en genereer 'n paar fondse. Die generering van fondse vind plaas deur transaksie-uitsette te skep ('n direkte analogie is rekeninge), en die uitset wat die transaksie spandeer (na alles, in die werklike lewe spandeer ons banknote) word die inset (wees versigtig, dit is baie maklik om deurmekaar te raak hier).

'n Inset verwys na veelvuldige uitsette, maar spandeer slegs een, en skep dus 'n "rookskerm" om dit moeilik te maak om die vertaalgeskiedenis te ontleed. As 'n transaksie meer as een inset het, kan so 'n struktuur as 'n matriks voorgestel word, waar die rye die insette is en die kolomme die gemengde uitsette. Om aan die netwerk te bewys dat die transaksie presies sy uitsette spandeer (ken hul geheime sleutels), word die insette onderteken met 'n ringhandtekening. So 'n handtekening waarborg dat die ondertekenaar die geheime sleutels vir alle elemente van enige van die kolomme geken het.

Vertroulike transaksies gebruik nie meer klassieke transaksies nie cryptonote ringhandtekeninge, is hulle vervang deur MLSAG - 'n weergawe van soortgelyke enkellaag-ringhandtekeninge wat aangepas is vir veelvuldige insette, LSAG.

Hulle word meerlaagse genoem omdat hulle verskeie insette gelyktydig onderteken, wat elkeen met verskeie ander gemeng word, dit wil sê 'n matriks is geteken, en nie een ry nie. Soos ons later sal sien, help dit om op handtekeninggrootte te bespaar.

Kom ons kyk na hoe 'n ringhandtekening gevorm word, deur die voorbeeld van 'n transaksie te gebruik wat 2 werklike uitsette spandeer en m - 1 ewekansiges van die blokketting gebruik vir vermenging. Kom ons noem die publieke sleutels van die uitsette wat ons spandeer as
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra, en sleutelbeelde vir hulle dienooreenkomstig: Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra Dus kry ons 'n matriks van grootte 2 x m. Eerstens moet ons die sogenaamde uitdagings vir elke paar uitsette bereken:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Ons begin die berekeninge met die uitsette wat ons spandeer met hul publieke sleutels:Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te draen ewekansige getalleVertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te draAs gevolg hiervan kry ons die volgende waardes:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra, wat ons gebruik om uitdaging te bereken
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dradie volgende paar uitsette (om dit makliker te maak om te verstaan ​​wat ons waar vervang, het ons hierdie waardes in verskillende kleure uitgelig). Al die volgende waardes word in 'n sirkel bereken deur die formules in die eerste illustrasie te gebruik. Die laaste ding om te bereken is die uitdaging vir 'n paar werklike uitsette.

Soos ons kan sien, gebruik alle kolomme behalwe die een wat werklike uitsette bevat willekeurig gegenereerde getalleVertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra. Vir π- kolom ons sal hulle ook nodig hê. Kom ons transformeerVertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te drain s:Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Die handtekening self is 'n tupel van al hierdie waardes:

Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra

Hierdie data word dan in 'n transaksie ingeskryf.

Soos ons kan sien, bevat MLSAG net een uitdaging c0, wat jou toelaat om op handtekeninggrootte te bespaar (wat reeds baie spasie verg). Verder, enige inspekteur, met behulp van die dataVertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra, herstel die waardes c1,..., cm en kontroleer ditVertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra. Dus, ons ring is gesluit en die handtekening is geverifieer.

Vir RingCT-transaksies van die volle tipe, word nog een reël by die matriks gevoeg met gemengde uitsette, maar ons sal hieronder hieroor praat.

Pedersen-verbintenisse

Verpligtingskemas (die Engelse term commitments word meer dikwels gebruik) word gebruik sodat een party kan bewys dat hulle 'n sekere geheim (nommer) ken sonder om dit werklik te openbaar. Byvoorbeeld, jy gooi 'n sekere nommer op die dobbelsteen, oorweeg toewyding en gee dit deur aan die verifierende party. Dus, op die oomblik van die bekendmaking van die geheime nommer, bereken die verifieerder die verbintenis onafhanklik en maak sodoende seker dat jy hom nie bedrieg het nie.

Monero-verbintenisse word gebruik om die bedrae van oordragte weg te steek en gebruik die mees algemene opsie - Pedersen-verpligtinge. Terloops, 'n interessante feit - die ontwikkelaars het aanvanklik voorgestel om die bedrae te verberg deur gewone vermenging, dit wil sê, uitsette vir arbitrêre bedrae by te voeg om onsekerheid in te stel, maar toe het hulle oorgeskakel na verpligtinge (dit is nie 'n feit dat hulle gespaar het op die transaksiegrootte, soos ons hieronder sal sien).
Oor die algemeen lyk toewyding so:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te drawaar C - die betekenis van toewyding self, a - verborge bedrag, H is 'n vaste punt op die elliptiese kurwe (bykomende kragopwekker), en x - 'n soort arbitrêre masker, 'n wegkruipfaktor wat lukraak gegenereer word. Die masker is hier nodig sodat 'n derde party nie net die waarde van toewyding kan raai nie.

Wanneer 'n nuwe uitset gegenereer word, bereken die beursie verbintenis daarvoor, en wanneer dit bestee word, neem dit óf die waarde wat tydens generering bereken is óf herbereken dit, afhangende van die tipe transaksie.

RingCT eenvoudig

In die geval van eenvoudige RingCT-transaksies, om te verseker dat die transaksie uitsette geskep het in 'n bedrag gelykstaande aan die hoeveelheid insette (nie geld uit die lug geproduseer het nie), is dit nodig dat die som van verpligtinge van die eerste en tweede wees dieselfde, dit is:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Verbinteniskommissies beskou dit 'n bietjie anders - sonder 'n masker:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te draWaar a — die bedrag van die kommissie, dit is publiek beskikbaar.

Hierdie benadering stel ons in staat om aan die vertrouende party te bewys dat ons dieselfde bedrae gebruik sonder om dit bekend te maak.

Om dinge duideliker te maak, kom ons kyk na 'n voorbeeld. Kom ons sê 'n transaksie spandeer twee uitsette (wat beteken dat hulle insette word) van 10 en 5 XMR en genereer drie uitsette ter waarde van 12 XMR: 3, 4 en 5 XMR. Terselfdertyd betaal hy 'n kommissie van 3 XMR. Dus, die bedrag geld spandeer plus die bedrag wat gegenereer word en die kommissie is gelyk aan 15 XMR. Kom ons probeer om verpligtinge te bereken en kyk na die verskil in hul bedrae (onthou die wiskunde):

Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Hier sien ons dat vir die vergelyking om te konvergeer, ons die somme van die inset- en uitsetmaskers nodig het om dieselfde te wees. Om dit te doen, genereer die beursie lukraak x1, y1, y2 en y3, en die oorblywende x2 bereken so:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Deur hierdie maskers te gebruik, kan ons aan enige verifieerder bewys dat ons nie meer fondse genereer as wat ons spandeer nie, sonder om die bedrag bekend te maak. Oorspronklik, reg?

RingCT vol

In volle RingCT-transaksies is dit 'n bietjie meer ingewikkeld om die oordragbedrae na te gaan. In hierdie transaksies herbereken die beursie nie verpligtinge vir insette nie, maar gebruik dié wat bereken is toe dit gegenereer is. In hierdie geval moet ons aanvaar dat ons nie meer die verskil in die somme gelyk aan nul sal kry nie, maar eerder:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Hier z - verskil tussen inset- en uitsetmaskers. As ons oorweeg zG as 'n publieke sleutel (wat dit de facto is), dan z is die private sleutel. Ons ken dus die publieke en ooreenstemmende private sleutels. Met hierdie data in die hand, kan ons dit gebruik in die MLSAG ring handtekening saam met die publieke sleutels van die uitsette wat gemeng word:
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Dus sal 'n geldige ringhandtekening verseker dat ons al die private sleutels van een van die kolomme ken, en ons kan slegs die private sleutel in die laaste ry ken as die transaksie nie meer fondse genereer as wat dit spandeer nie. Terloops, hier is die antwoord op die vraag "hoekom lei die verskil in die bedrae van verpligtinge nie tot nul nie" - as zG = 0, dan sal ons die kolom uitbrei met werklike uitsette.

Hoe weet die ontvanger van die fondse hoeveel geld aan hom gestuur is? Alles is eenvoudig hier - die sender van die transaksie en die ontvanger ruil sleutels met behulp van die Diffie-Hellman-protokol, met behulp van die transaksiesleutel en die ontvanger se aansigsleutel en bereken die gedeelde geheim. Die sender skryf data oor die uitvoerbedrae, geïnkripteer met hierdie gedeelde sleutel, in spesiale velde van die transaksie.

Reeksbewyse

Wat gebeur as jy 'n negatiewe getal as die bedrag in verpligtinge gebruik? Dit kan lei tot die generering van bykomende munte! Hierdie uitkoms is onaanvaarbaar, daarom moet ons waarborg dat die bedrae wat ons gebruik nie negatief is nie (sonder om hierdie bedrae natuurlik bekend te maak, anders is daar soveel werk en alles tevergeefs). Met ander woorde, ons moet bewys dat die som in die interval is [0, 2n - 1].

Om dit te doen, word die som van elke uitset in binêre syfers verdeel en die verbintenis word vir elke syfer afsonderlik bereken. Dit is beter om te sien hoe dit gebeur met 'n voorbeeld.

Kom ons neem aan dat ons hoeveelhede klein is en in 4 bisse pas (in praktyk is dit 64 bisse), en ons skep 'n uitset ter waarde van 5 XMR. Ons bereken verpligtinge vir elke kategorie en die totale verbintenis vir die hele bedrag:Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te dra
Vervolgens word elke verbintenis met 'n surrogaat gemeng (Ci-2iH) en is in pare onderteken met die Borromeo-ringhandtekening (nog 'n ringhandtekening), voorgestel deur Greg Maxwell in 2015 (jy kan meer daaroor lees hier):
Vertroulike transaksies in Monero, of hoe om onbekende dinge na onbekende bestemmings oor te draSaamgevat word dit reeksbewys genoem en laat jou toe om te verseker dat verpligtinge bedrae in die reeks gebruik [0, 2n - 1].

Wat is volgende?

In die huidige implementering neem reeksbewyse baie spasie op - 6176 grepe per uitset. Dit lei tot groter transaksies en dus hoër fooie. Om die grootte van 'n Monero-transaksie te verminder, stel ontwikkelaars bulletproofs in plaas van Borromeo-handtekeninge bekend - 'n reeks bewysmeganisme sonder bitsgewyse verpligtinge. Volgens sommige skattings, is hulle in staat om die grootte van reeksbewys met tot 94% te verminder. Terloops, in die middel van Julie het die tegnologie geslaag oudit van Kudelski Security, wat geen noemenswaardige tekortkominge in die tegnologie self of in die implementering daarvan aan die lig gebring het nie. Die tegnologie word reeds in die toetsnetwerk gebruik, en met die nuwe hardevurk kan dit waarskynlik na die hoofnetwerk beweeg.

Vra jou vrae, stel onderwerpe voor vir nuwe artikels oor tegnologieë op die gebied van cryptocurrency, en teken ook in op ons groep in Facebookom op hoogte te bly van ons gebeure en publikasies.

Bron: will.com

Voeg 'n opmerking