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.
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
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
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
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
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
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
, en sleutelbeelde vir hulle dienooreenkomstig: Dus kry ons 'n matriks van grootte 2 x m. Eerstens moet ons die sogenaamde uitdagings vir elke paar uitsette bereken:
Ons begin die berekeninge met die uitsette wat ons spandeer met hul publieke sleutels:en ewekansige getalleAs gevolg hiervan kry ons die volgende waardes:
, wat ons gebruik om uitdaging te bereken
die 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 getalle. Vir π- kolom ons sal hulle ook nodig hê. Kom ons transformeerin s:
Die handtekening self is 'n tupel van al hierdie waardes:
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 data, herstel die waardes c1,..., cm en kontroleer dit. 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
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:
waar 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:
Verbinteniskommissies beskou dit 'n bietjie anders - sonder 'n masker:
Waar 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):
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:
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:
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:
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:
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
Saamgevat 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.
Vra jou vrae, stel onderwerpe voor vir nuwe artikels oor tegnologieë op die gebied van cryptocurrency, en teken ook in op ons groep in
Bron: will.com