Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije

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.

Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije

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 više potpisa).

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 značajno suziti područje traženja izlaza od interesa za napadača. Kako bi se zaštitio od takve analize, Monero je implementirao anonimni transakcijski protokol koji u potpunosti skriva iznose prijenosa na mreži.

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 članak Povjerljive transakcije. Trenutna implementacija RingCT-a je njegova modifikacija s mogućnošću korištenja prstenastih potpisa (bilo bez njih), a po tome je i dobio naziv - Ring Confidential Transactions.

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 "Od nule do Monera" S tim u vezi, rečeno je da je odluka da se pune transakcije ograniče na jedan unos donesena na brzinu i da bi se u budućnosti mogla promijeniti.

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 cryptonote prstenastih potpisa, zamijenjeni su MLSAG-om - verzijom sličnih jednoslojnih prstenastih potpisa prilagođenih za višestruke ulaze, LSAG.

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
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije, i ključne slike za njih u skladu s tim: Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije Tako dobivamo matricu veličine 2 x m. Prvo moramo izračunati takozvane izazove za svaki par izlaza:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
Izračune započinjemo s izlazima koje trošimo koristeći njihove javne ključeve:Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijei slučajni brojeviPovjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijeKao rezultat toga dobivamo sljedeće vrijednosti:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije, koji koristimo za izračunavanje izazova
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijesljedeć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 brojevePovjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije. Za π- stupac također će nam trebati. Preobrazimo sePovjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijeu s:Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
Sam potpis je skup svih ovih vrijednosti:

Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije

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 podatkePovjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije, vraća vrijednosti c1,…, cm i to provjeravaPovjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije. 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

Sheme obveza (češće se koristi engleski termin Commitments) koriste se kako bi jedna strana mogla dokazati da zna određenu tajnu (broj), a da je zapravo ne otkrije. Na primjer, bacite određeni broj na kocku, razmislite o obvezi i proslijedite ga strani koja potvrđuje. Dakle, u trenutku otkrivanja tajnog broja, verifikator samostalno izračunava obvezu, čime se uvjerava da ga niste prevarili.

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:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijegdje 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:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
Obvezujuće komisije to promatraju malo drugačije – bez maske:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijeGdje 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):

Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
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:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
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:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
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:
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
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:Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacije
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 здесь):
Povjerljive transakcije u Moneru ili kako prenijeti nepoznate stvari na nepoznate destinacijeUzeto 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. Prema nekim procjenama, mogu smanjiti veličinu dokaza dometa do 94%. Usput, sredinom srpnja tehnologija je prošla revizija iz Kudelski Securityja, koji nije otkrio značajnije nedostatke niti u samoj tehnologiji niti u njezinoj implementaciji. Tehnologija se već koristi u testnoj mreži, a s novom hard forkom vjerojatno se može premjestiti na glavnu mrežu.

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 Facebookkako bismo bili u tijeku s našim događanjima i publikacijama.

Izvor: www.habr.com

Dodajte komentar