Nastavljamo seriju o Monero blockchainu, a današnji članak fokusirat ćemo se na protokol RingCT (Ring Confidential Transactions), koji uvodi povjerljive transakcije i nove potpise prstena. Nažalost, na internetu ima malo informacija o tome kako funkcionira, a mi smo pokušali popuniti tu prazninu.
Razgovarat ćemo o tome kako mreža skriva iznose prijenosa pomoću ovog protokola, zašto su odustali od klasičnih cryptonote ring signatura te kako će se ova tehnologija dalje razvijati.
Budući da je ovaj protokol jedna od najsloženijih tehnologija u Moneru, čitatelj će trebati osnovno znanje o dizajnu ovog blockchaina i prolazno znanje o kriptografiji eliptične krivulje (kako biste osvježili ovo znanje, možete pročitati prva poglavlja našeg prethodni članak o
RingCT protokol
Jedan od mogućih napada na valute cryptonote je blockchain analiza temeljena na saznanjima o iznosu i vremenu poslane transakcije. Ovo dopušta
Vrijedno je napomenuti da ideja skrivanja iznosa nije nova. Programer Bitcoin Corea Greg Maxwell bio je jedan od prvih koji ga je opisao u svojoj
Između ostalog, protokol pomaže u rješavanju problema s miješanjem dust outputa - izlaza male količine (obično primljenih u obliku kusura iz transakcija), koji su stvarali više problema nego što su vrijedili.
U siječnju 2017. dogodio se hard fork mreže Monero, dopuštajući izbornu upotrebu povjerljivih transakcija. A već u rujnu iste godine, s hard forkom verzije 6, takve su transakcije postale jedine dopuštene na mreži.
RingCT koristi nekoliko mehanizama odjednom: višeslojne povezane spontane anonimne grupne potpise (Multilayered Linkable Spontaneous Anonymous Group Signature, u daljnjem tekstu MLSAG), shemu obveza (Pedersen Commitments) i dokaze raspona (ovaj termin nema uspostavljen prijevod na ruski) .
Protokol RingCT uvodi dvije vrste anonimnih transakcija: jednostavne i pune. Novčanik generira prvi kada transakcija koristi više od jednog unosa, drugi - u suprotnoj situaciji. Razlikuju se u potvrđivanju iznosa transakcija i podataka potpisanih MLSAG potpisom (o tome ćemo više u nastavku). Štoviše, transakcije tipa full mogu se generirati s bilo kojim brojem ulaza, nema temeljne razlike. U knjizi
MLSAG potpis
Prisjetimo se što su potpisani transakcijski ulazi. Svaka transakcija troši i stvara određena sredstva. Generiranje sredstava događa se stvaranjem transakcijskih izlaza (izravna analogija su računi), a izlaz koji transakcija troši (uostalom, u stvarnom životu trošimo novčanice) postaje ulaz (budite oprezni, vrlo je lako zbuniti se ovdje).
Unos upućuje na više izlaza, ali troši samo jedan, stvarajući tako "dimnu zavjesu" koja otežava analizu povijesti prijevoda. Ako transakcija ima više od jednog ulaza, tada se takva struktura može predstaviti kao matrica, gdje su redovi ulazi, a stupci mješoviti izlazi. Kako bi se mreži dokazalo da transakcija troši točno svoje izlaze (zna svoje tajne ključeve), ulazi se potpisuju prstenastim potpisom. Takav potpis jamči da je potpisnik znao tajne ključeve za sve elemente bilo kojeg od stupaca.
Povjerljive transakcije više ne koriste klasične
Zovu se višeslojni jer potpisuju nekoliko ulaza odjednom, od kojih je svaki pomiješan s nekoliko drugih, tj. potpisana je matrica, a ne jedan red. Kao što ćemo vidjeti kasnije, ovo pomaže uštedi na veličini potpisa.
Pogledajmo kako se formira prstenasti potpis na primjeru transakcije koja troši 2 stvarna izlaza i koristi m - 1 slučajnih iz blockchaina za miješanje. Označimo javne ključeve izlaza koje trošimo kao
, i ključne slike za njih u skladu s tim: Tako dobivamo matricu veličine 2 x m. Prvo moramo izračunati takozvane izazove za svaki par izlaza:
Izračune započinjemo s izlazima koje trošimo koristeći njihove javne ključeve:i slučajni brojeviKao rezultat toga dobivamo sljedeće vrijednosti:
, koji koristimo za izračunavanje izazova
sljedeći par izlaza (kako bismo lakše razumjeli što gdje zamjenjujemo, te smo vrijednosti istaknuli različitim bojama). Sve sljedeće vrijednosti izračunate su u krugu pomoću formula danih na prvoj ilustraciji. Zadnje što treba izračunati je izazov za par stvarnih rezultata.
Kao što vidimo, svi stupci osim onog koji sadrži stvarne izlaze koriste nasumično generirane brojeve. Za π- stupac također će nam trebati. Preobrazimo seu s:
Sam potpis je skup svih ovih vrijednosti:
Ti se podaci zatim zapisuju u transakciju.
Kao što vidimo, MLSAG sadrži samo jedan izazov c0, što vam omogućuje uštedu na veličini potpisa (što već zahtijeva puno prostora). Zatim, bilo koji inspektor, koristeći podatke, vraća vrijednosti c1,…, cm i to provjerava. Dakle, naš prsten je zatvoren i potpis ovjeren.
Za RingCT transakcije punog tipa, u matricu se dodaje još jedan redak s miješanim izlazima, ali o tome ćemo govoriti u nastavku.
Pedersenove obveze
Monero obveze se koriste za skrivanje iznosa transfera i koriste najčešću opciju - Pedersen obveze. Usput, zanimljiva činjenica - u početku su programeri predlagali skrivanje iznosa običnim miješanjem, odnosno dodavanjem izlaza za proizvoljne iznose kako bi se unijela nesigurnost, ali onda su se prebacili na obveze (nije činjenica da su uštedjeli na veličina transakcije, kao što ćemo vidjeti u nastavku).
Općenito, predanost izgleda ovako:
gdje C — značenje same obveze, a - skriveni iznos, H je fiksna točka na eliptičkoj krivulji (dodatni generator), i x — neka vrsta proizvoljne maske, faktor skrivanja generiran nasumično. Maska je ovdje potrebna kako treća strana ne bi mogla jednostavno pogoditi vrijednost obveze.
Kada se generira novi izlaz, novčanik izračunava obvezu za njega, a kada se potroši, uzima ili vrijednost izračunatu tijekom generiranja ili je ponovno izračunava, ovisno o vrsti transakcije.
RingCT jednostavan
U slučaju jednostavnih RingCT transakcija, kako bi se osiguralo da je transakcija stvorila outpute jednake količini inputa (nije proizvela novac iz ničega), potrebno je da zbroj obveza prvog i drugog bude isto, odnosno:
Obvezujuće komisije to promatraju malo drugačije – bez maske:
Gdje a — iznos provizije, javno je dostupan.
Ovaj pristup nam omogućuje da dokažemo pouzdanoj strani da koristimo iste iznose bez da ih otkrijemo.
Da stvari budu jasnije, pogledajmo primjer. Recimo da transakcija troši dva izlaza (što znači da postaju ulazi) od 10 i 5 XMR i generira tri izlaza u vrijednosti od 12 XMR: 3, 4 i 5 XMR. Istovremeno plaća proviziju od 3 XMR. Dakle, iznos potrošenog novca plus generirani iznos i provizija jednaki su 15 XMR. Pokušajmo izračunati obveze i pogledati razliku u njihovim iznosima (sjetite se matematike):
Ovdje vidimo da je za konvergiranje jednadžbe potrebno da sume ulaznih i izlaznih maski budu iste. Da biste to učinili, novčanik generira nasumično x1, y1, y2 i y3, i preostalih x2 izračunava ovako:
Pomoću ovih maski možemo dokazati bilo kojem verifikatoru da ne stvaramo više sredstava nego što trošimo, a da pritom ne otkrivamo iznos. Originalno, zar ne?
RingCT pun
U potpunim RingCT transakcijama, provjera iznosa prijenosa malo je složenija. U tim transakcijama novčanik ne preračunava obveze za unose, već koristi one izračunate kada su generirani. U ovom slučaju moramo pretpostaviti da više nećemo dobiti razliku u zbrojevima jednaku nuli, već umjesto toga:
Ovdje z — razlika između ulaznih i izlaznih maski. Ako uzmemo u obzir zG kao javni ključ (što on de facto i jest), dakle z je privatni ključ. Dakle, poznajemo javni i odgovarajući privatni ključ. S ovim podacima u ruci, možemo ih koristiti u MLSAG potpisu prstena zajedno s javnim ključevima izlaza koji se miješaju:
Dakle, važeći potpis prstena će osigurati da znamo sve privatne ključeve jednog od stupaca, a možemo znati samo privatni ključ u zadnjem retku ako transakcija ne generira više sredstava nego što troši. Usput, evo odgovora na pitanje "zašto razlika u iznosima obveza ne dovede do nule" - ako zG = 0, tada ćemo proširiti stupac sa stvarnim izlazima.
Kako primatelj sredstava zna koliko mu je novca poslano? Ovdje je sve jednostavno - pošiljatelj transakcije i primatelj razmjenjuju ključeve pomoću Diffie-Hellman protokola, koristeći transakcijski ključ i ključ prikaza primatelja i izračunavaju zajedničku tajnu. Podatke o izlaznim iznosima pošiljatelj upisuje u posebna polja transakcije, šifrirane ovim zajedničkim ključem.
Dokaz dometa
Što se događa ako koristite negativan broj kao iznos u obvezama? To može dovesti do stvaranja dodatnih novčića! Ovakav ishod je neprihvatljiv, stoga moramo jamčiti da iznosi koje koristimo nisu negativni (naravno, bez otkrivanja tih iznosa, inače je toliko posla i sve uzalud). Drugim riječima, moramo dokazati da je zbroj u intervalu [0, 2n - 1].
Da bi se to postiglo, zbroj svakog izlaza dijeli se na binarne znamenke, a obveza se izračunava za svaku znamenku zasebno. Bolje je vidjeti kako se to događa na primjeru.
Pretpostavimo da su naši iznosi mali i da stanu u 4 bita (u praksi je to 64 bita), a mi stvaramo izlaz vrijedan 5 XMR. Izračunavamo obveze za svaku kategoriju i ukupnu obvezu za cijeli iznos:
Zatim se svaka obveza miješa sa surogatom (Ci-2iH) i potpisan je u paru Borromeo prstenastim potpisom (još jedan prstenasti potpis), koji je predložio Greg Maxwell 2015. (možete pročitati više o tome
Uzeto zajedno, to se naziva dokazom raspona i omogućuje vam da osigurate da obveze koriste iznose u rasponu [0, 2n - 1].
Što je sljedeće?
U trenutnoj implementaciji, dokazi raspona zauzimaju puno prostora - 6176 bajtova po izlazu. To dovodi do većih transakcija, a time i do viših naknada. Kako bi smanjili veličinu Monero transakcije, programeri uvode neprobojnost umjesto Borromeo potpisa - mehanizam za provjeru raspona bez bitovnih obveza.
Postavite svoja pitanja, predložite teme za nove članke o tehnologijama u području kriptovalute, a također se pretplatite na našu grupu u
Izvor: www.habr.com