Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut

Continuăm ciclul nostru despre structura blockchain-ului Monero, iar astăzi articolul va fi dedicat protocolului RingCT (Ring Confidential Transactions), în cadrul căruia sunt prezentate tranzacțiile confidențiale și noile semnături în cerc. Din păcate, există puține informații pe internet despre modul în care funcționează, iar noi am încercat să umplem această lacună.

Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut

Vom discuta despre modul în care acest protocol permite rețelei să ascundă sumele transferurilor, de ce s-a abandonat utilizarea semnăturilor eliptice tradiționale pentru cryptonote și cum va evolua această tehnologie în continuare.

Deoarece acest protocol este una dintre cele mai complexe tehnologii din Monero, cititorii vor avea nevoie de cunoștințe de bază despre structura acestui blockchain și cunoștințe superficiale în criptografie pe curbe eliptice (pentru a-și reîmprospăta aceste cunoștințe, se pot citi primele capitole ale articolului nostru anterior despre semnăturile multiple).

Protocolul RingCT

Una dintre posibilele atacuri asupra monedelor cryptonote este analiza blockchain-ului, bazată pe cunoașterea sumei și a timpului de efectuare a unei tranacții. Aceasta permite restrângerea semnificativă a domeniului de căutare al ieșirilor care interesează atacatorul. Pentru a proteja împotriva unei astfel de analize, Monero a implementat protocolul tranzacțiilor anonime, care ascunde complet sumele transferurilor din rețea.

Este important de menționat că ideea de a ascunde sumele nu este nouă. Unul dintre primii care a descris-o a fost dezvoltatorul Bitcoin Core, Greg Maxwell, în articolul său Tranzacțiile confidențiale. Realizarea actuală a RingCT este o modificare a acesteia, cu posibilitatea de a utiliza semnături în cerc (cum altfel?), și astfel a primit numele său - Ring Confidential Transactions.

În plus, protocolul ajută la eliminarea problemelor legate de amestecarea ieșirilor de tip dust - ieșiri de o sumă mică (de obicei rezultate din restul tranzacțiilor), care au creat mai multe probleme decât costul lor.

În ianuarie 2017 a avut loc un hard fork al rețelei Monero, care permite utilizarea opțională a tranzacțiilor confidențiale. Iar deja în septembrie aceluiași an, cu hard fork-ul pentru versiunea 6, aceste tranzacții au devenit singurele permise în rețea.

RingCT folosește imediat mai multe mecanisme: semnături de grup anonime spontane legate multilayer (Multilayered Linkable Spontaneous Anonymous Group Signature, în continuare – MLSAG), schema angajamentelor (Pedersen Commitments) și dovezi de interval (nu există un termen stabilit în limba română pentru acest termen).

Protocolul RingCT introduce două tipuri de tranzacții anonime: simple și complete. Prima este generată de portofel atunci când tranzacția utilizează mai mult de o intrare, iar a doua – în situația inversă. Acestea diferă prin validarea sumelor tranzacțiilor și prin datele semnate cu semnătura MLSAG (vom discuta despre acest lucru mai jos). De asemenea, tranzacțiile de tip complet pot fi generate cu orice număr de intrări, nu există o diferență esențială. În cartea „Zero to Monero” se menționează că decizia de a limita tranzacțiile complete la o singură intrare a fost luată în grabă și că aceasta ar putea fi modificată în viitor.

Semnătura MLSAG

Să ne amintim ce reprezintă intrările semnate ale tranzacției. Fiecare tranzacție cheltuiește o anumită sumă de bani și generează. Generarea banilor se realizează prin crearea ieșirilor tranzacției (analogie directă – bancnote), iar ieșirea pe care tranzacția o cheltuiește (deoarece în viața reală folosim exact bancnotele), devine intrarea (atenție, aici este foarte ușor să te confuzi).

O intrare face referire la mai multe ieșiri, dar cheltuiește doar una, creând astfel un „fumat craft” pentru a complica analiza istoricului tranzacțiilor. Dacă tranzacția are mai mult de o intrare, atunci această structură poate fi reprezentată sub formă de matrice, unde rândurile sunt intrările, iar coloanele – ieșirile implicate. Pentru a dovedi rețelei că tranzacția cheltuiește exact ieșirile sale (cunoaște cheile sale secrete), intrările sunt semnate cu o semnătură ring. Această semnătură oferă garanția că semnatarul cunoștea cheile secrete ale tuturor elementelor din oricare coloană.

Tranzacțiile confidențiale nu mai folosesc semnăturile ring clasice pentru cryptonote ci au fost înlocuite de MLSAG – o variantă adaptată pentru mai multe intrări a semnăturilor ring unilayer, LSAG.

Se numesc multilayer deoarece semnează simultan mai multe intrări, fiecare dintre ele fiind amestecată cu alte câteva, adică se semnează o matrice, nu un singur rând. Așa cum vom vedea mai departe, acest lucru ajută la economisirea dimensiunii semnăturii.

Să analizăm cum se formează semnătura circulară, folosind exemplul unei tranzacții care cheltuie 2 ieșiri reale și folosește pentru amestecare m - 1 aleatorii din blockchain. Să denumim cheile publice ale ieșirilor pe care le cheltuim ca
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut, iar imaginile cheie pentru acestea, respectiv: Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut Astfel, obținem o matrice de dimensiune 2 x m. Mai întâi, trebuie să calculăm așa-numitele provocări pentru fiecare pereche de ieșiri:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Calculele începem cu ieșirile pe care le cheltuim, folosind cheile lor publice:Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutși numere aleatoriiTranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutÎn final, obținem valorile:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut, pe care le folosim pentru a calcula provocarea
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutpentru următoarea pereche de ieșiri (pentru a fi mai ușor de înțeles ce se substituie, am evidențiat aceste valori cu culori diferite). Toate următoarele valori sunt calculate în cerc conform formulilor prezentate în prima ilustrație. Ultima provocare calculată este pentru perechea de ieșiri reale.

După cum vedem, în toate coloanele, cu excepția celei care conține ieșiri reale, se folosesc numere generate aleatoriuTranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut. Pentru π-a coloană, acestea ne vor fi de asemenea necesare. TransformămTranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutîn s:Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Semnătura în sine constă într-un tuplu al tuturor acestor valori:

Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut

Ulterior, aceste date sunt salvate în tranzacție.

După cum vedem, MLSAG conține doar o provocare c0, ceea ce permite economisirea la dimensiunea semnăturii (care oricum necesită mult spațiu). Ulterior, orice verificator, folosind dateleTranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut, recuperează valorile c1,…, cm și verifică căTranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut. Astfel, cercul nostru s-a încheiat și semnătura a trecut verificarea.

Pentru tranzacțiile RingCT de tip full, se adaugă încă un rând în matrice cu ieșirile amestecate, dar despre aceasta vom vorbi mai jos.

Angajamentele Pedersen

Schemele de angajamente (se folosește adesea termenul englezesc - commitments) sunt utilizate pentru ca o parte să poată dovedi că știe un anumit secret (număr), fără a-l dezvălui efectiv. De exemplu, arunci un număr pe zaruri, calculezi angajamentul și îl transmiți părții care verifică. Astfel, în momentul dezvăluirii numărului secret, verificatorul calculează singur angajamentul, asigurându-se astfel că nu l-ai înșelat.

În Monero, angajamentele sunt utilizate pentru a ascunde sumele transferurilor și aplică cea mai utilizată variantă — angajamentele Pedersen. Apropo, un fapt interesant — inițial, dezvoltatorii au sugerat să ascundă sumele prin amestecare obișnuită, adică adăugând ieșiri la sume arbitrare pentru a introduce incertitudine, dar apoi au trecut la angajamente (fără a fi sigur că au economisit pe dimensiunea tranzacției, așa cum vom vedea mai jos).
În cazul general, un angajament arată astfel:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutUnde C — valoarea angajamentului propriu-zis, a — suma ascunsă, H — un punct fix pe curba eliptică (generator suplimentar), și x — o mască arbitrară, factor de ascundere, generată aleatoriu. Masca este necesară pentru ca o a treia parte să nu poată determina prin simplă examinare valoarea angajamentului.

Atunci când generează o nouă ieșire, portofelul calculează pentru aceasta angajamentul, iar la cheltuire ia fie valoarea calculată la generare, fie o recalculă — în funcție de tipul tranzacției.

RingCT simplu

În cazul tranzacțiilor RingCT simple, pentru a garanta că tranzacția a creat ieșiri pentru o sumă egală cu suma intrărilor (nu a creat bani din aer), este necesar ca suma angajamentelor primelor și celor secondate să fie aceeași, adică:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Angajamentul comisionului se calculează puțin diferit — fără mască:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut, unde a — suma comisionului, este public de accesibil.

Această abordare permite demonstrării părții de verificare că folosim sume identice, fără a le dezvălui.

Pentru a face totul mai clar, să luăm un exemplu. Să presupunem că tranzacția cheltuie două ieșiri (deci devin intrări) de 10 și 5 XMR și generează trei ieșiri în total 12 XMR: 3, 4 și 5 XMR. În acest timp, plătește un comision de 3 XMR. Astfel, suma banilor cheltuiți plus suma generată și comisionul sunt egale cu 15 XMR. Să încercăm să calculăm angajamentele și să ne uităm la diferența dintre sumele lor (să ne amintim de matematică):

Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Aici vedem că pentru ca ecuația să se îndeplinească — sumele măștilor intrărilor și ieșirilor trebuie să fie identice. Pentru aceasta, portofelul generează aleatoriu x1, y1, y2 și y3, iar restul x2 se calculează astfel:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Folosind aceste măști, putem demonstra oricărei părți de verificare că nu generăm fonduri mai mult decât cheltuim, fără a dezvălui sumele. Original, nu-i așa?

RingCT complet

În tranzacțiile full RingCT, verificarea sumelor transferurilor se desfășoară într-un mod puțin mai complicat. În aceste tranzacții, portofelul nu recalculază angajamentele pentru intrări, ci utilizează cele calculate la generarea lor. Este de presupus că diferența sumelor nu va mai fi zero, ci, în schimb:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Aici z — diferența dintre măștile intrărilor și ieșirilor. Dacă luăm în considerare zG ca cheia publică (ceea ce, de facto, este), atunci z — aceasta este cheia privată. Astfel, știm cheile publice și corespunzătoarele lor chei private. Având aceste date, putem folosi aceste chei în semnătura în cerc MLSAG împreună cu cheile publice ale ieșirilor amestecate:
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Astfel, o semnătură validă în cerc va garanta că știm toate cheile private ale uneia dintre coloane, iar cheia privată din ultima linie o putem cunoaște doar dacă tranzacția nu generează mai multe fonduri decât cheltuie. Apropo, aici se află răspunsul la întrebarea „de ce diferența sumelor angajamentelor nu este zero” — dacă zG = 0, atunci vom dezvălui coloana cu ieșirile reale.

Și cum va ști deținătorul fondurilor cât de mulți bani i-au fost trimiși? Aici este simplu — expeditorul tranzacției și încasatorul schimbă cheile prin protocolul Diffie-Hellman, folosind cheia tranzacției și cheia de vizualizare a încasatorului pentru a calcula un secret comun. Expeditorul înregistrează în câmpurile speciale ale tranzacției date despre sumele ieșirilor, criptate cu acea cheie comună.

Dovezi de intervale

Și ce se întâmplă dacă folosim un număr negativ ca sumă în angajamente? Acest lucru poate conduce la generarea de monede suplimentare! Această situație este inacceptabilă, așa că este necesară o garanție că sumele pe care le folosim nu sunt negative (fără a dezvălui aceste sume, desigur, altfel atâta muncă și toate în van). Cu alte cuvinte, trebuie să demonstrăm că suma se află în intervalul [0, 2n — 1].

Pentru aceasta, suma fiecărei ieșiri este împărțită în cifre binare și se calculează angajamentul pentru fiecare cifră în parte. Cum se desfașoară acest proces, cel mai bine ar fi să luăm un exemplu.

Să presupunem că sumele sunt mici și se încadrează în 4 biți (în practică, 64 de biți), iar noi creăm o ieșire de 5 XMR. Calculăm angajamentele pentru fiecare cifră și angajamentul total pentru întreaga sumă:Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscut
Apoi fiecare angajament este amestecat cu un surrogate (Ci-2iH) și este semnat în mod parit cu semnătura Borromeo (o altă semnătură circulară), propusă de Greg Maxwell în 2015 (mai multe detalii pot fi citite aici aici):
Tranzacții confidențiale în Monero, sau cum să trimitem ceva necunoscut în loc necunoscutÎmpreună, acestea se numesc dovezi de interval și permit garantarea faptului că în angajamente sunt folosite sume din interval [0, 2n — 1].

Ce urmează?

În implementarea actuală, dovezile de interval ocupă foarte mult spațiu — 6176 de byte pentru o ieșire. Acest lucru duce la tranzacții mari și, în consecință, la comisioane mai mari. Pentru a reduce dimensiunea tranzacției, dezvoltatorii Monero introduc în locul semnăturilor Borromeo bulletproofs — un mecanism de dovezi de interval fără angajamente pe bit. Potrivit unor estimări, acestea pot reduce dimensiunea dovezilor de interval cu 94%. De altfel, la mijlocul lunii iulie, tehnologia a trecut în audit din partea companiei Kudelski Security, care nu a identificat defecte semnificative nici în tehnologie, nici în implementarea acesteia. Tehnologia este deja utilizată în rețeaua de testare, iar cu noul hard fork, ar putea fi transferată și în rețeaua principală.

Adresați întrebările dumneavoastră, propuneți teme pentru articole noi despre tehnologii în domeniul criptomonedelor, precum și abonați-vă la grupul nostru din Facebook, pentru a fi la curent cu evenimentele și publicările noastre.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster