Jätkame oma sarja Monero plokiahela kohta ja tänane artikkel keskendub protokollile RingCT (Ring Confidential Transactions), mis tutvustab konfidentsiaalseid tehinguid ja uusi ringsignatuure. Kahjuks on Internetis vähe teavet selle toimimise kohta ja me püüdsime seda lünka täita.
Räägime sellest, kuidas võrk selle protokolli abil ülekandesummasid peidab, miks nad loobusid klassikalistest krüptonotirõnga allkirjadest ja kuidas see tehnoloogia edasi areneb.
Kuna see protokoll on Monero üks keerukamaid tehnoloogiaid, on lugejal vaja põhiteadmisi selle plokiahela ülesehituse kohta ja teadmisi elliptilise kõvera krüptograafiast (nende teadmiste täiendamiseks võite lugeda meie artikli esimesi peatükke eelmine artikkel teemal
RingCT protokoll
Üks võimalik rünnak krüptonote valuutade vastu on plokiahela analüüs, mis põhineb teadmisel saadetud tehingu summa ja aja kohta. See võimaldab
Väärib märkimist, et summade peitmise idee pole uus. Bitcoin Core'i arendaja Greg Maxwell oli üks esimesi, kes seda omas kirjeldas
Protokoll aitab muuhulgas vabaneda tolmuväljundite segamise probleemidest – väikese koguse väljunditest (tavaliselt laekub tehingutest vahetusrahana), mis tekitas rohkem probleeme, kui need väärt olid.
2017. aasta jaanuaris toimus Monero võrgu kõva hark, mis võimaldas valikuliselt kasutada konfidentsiaalseid tehinguid. Ja juba sama aasta septembris said versiooni 6 hard forkiga sellised tehingud ainsad võrgus lubatud.
RingCT kasutab korraga mitut mehhanismi: mitmekihilised lingitud spontaansed anonüümsed grupiallkirjad (mitmekihilised lingitud spontaansed anonüümsed rühmaallkirjad, edaspidi MLSAG), kohustuste skeem (Pedersen Commitments) ja vahemiku tõendid (sellel terminil pole vene keelde tõlget). .
RingCT-protokoll tutvustab kahte tüüpi anonüümseid tehinguid: lihtsaid ja täistehinguid. Rahakott genereerib esimese, kui tehing kasutab rohkem kui ühte sisendit, teise - vastupidises olukorras. Need erinevad tehingusummade ja MLSAG-allkirjaga allkirjastatud andmete valideerimise poolest (sellest räägime allpool). Lisaks saab täis tüüpi tehinguid genereerida suvalise arvu sisenditega, põhimõttelist erinevust pole. Raamatus
MLSAG-i allkiri
Meenutagem, mis on allkirjastatud tehingute sisendid. Iga tehing kulutab ja loob raha. Vahendid genereeritakse tehinguväljundite loomisega (otse analoogiaga on pangatähed) ja sisendiks saab väljund, mille tehing kulutab (reaalses elus kulutame ju pangatähti) (olge ettevaatlik, siin on väga lihtne segadusse sattuda) .
Sisend viitab mitmele väljundile, kuid kulutab ainult ühe, luues seega "suitsuekraani", mis muudab tõlkeajaloo analüüsimise keeruliseks. Kui tehingul on rohkem kui üks sisend, siis saab sellist struktuuri esitada maatriksina, kus sisenditeks on read ja segaväljunditeks veerud. Tõestamaks võrgule, et tehing kulutab täpselt oma väljundid (teab nende salavõtmeid), allkirjastatakse sisendid ringsignatuuriga. Selline allkiri tagab, et allkirjastaja teadis mis tahes veeru kõigi elementide salavõtmeid.
Konfidentsiaalsete tehingute puhul ei kasutata enam klassikalisi tehinguid
Neid nimetatakse mitmekihilisteks, kuna nad allkirjastavad korraga mitu sisendit, millest igaüks on segatud mitme teisega, st allkirjastatakse maatriks, mitte üks rida. Nagu hiljem näeme, aitab see säästa allkirja suurust.
Vaatame, kuidas tekib ringsignatuur, kasutades tehingu näidet, mis kulutab 2 reaalset väljundit ja kasutab segamiseks m - 1 juhuslikku plokiahelast. Tähistame nende väljundite avalikud võtmed, mida me kulutame
ja nende jaoks võtmekujutised vastavalt: Seega saame suuruse maatriksi 2 x m. Esiteks peame arvutama iga väljundi paari jaoks nn väljakutsed:
Alustame arvutusi väljunditega, mille kulutame nende avalike võtmete abil:ja juhuslikud numbridSelle tulemusena saame järgmised väärtused:
, mida kasutame väljakutse arvutamiseks
järgmine väljundpaar (et oleks lihtsam aru saada, mida kus asendame, oleme need väärtused eri värvidega esile tõstnud). Kõik järgmised väärtused arvutatakse ringis, kasutades esimesel joonisel toodud valemeid. Viimane asi, mida arvutada, on reaalse väljundi paari väljakutse.
Nagu näeme, kasutavad kõik veerud, välja arvatud see, mis sisaldab reaalseid väljundeid, juhuslikult genereeritud numbreid. Jaoks π- veerus, me vajame ka neid. Muutkems:
Signatuur ise koosneb kõigist järgmistest väärtustest:
Seejärel kirjutatakse need andmed tehingusse.
Nagu näeme, sisaldab MLSAG ainult ühte väljakutset c0, mis võimaldab säästa allkirja suuruselt (mis nõuab juba palju ruumi). Lisaks iga inspektor, kes andmeid kasutab, taastab väärtused c1,…, cm ja kontrollib seda. Seega on meie ring suletud ja allkiri kontrollitud.
Täistüüpi RingCT tehingute puhul lisatakse segaväljunditega maatriksisse veel üks rida, kuid sellest räägime allpool.
Pederseni kohustused
Monero kohustusi kasutatakse ülekannete summade peitmiseks ja kõige levinuma võimaluse – Pederseni kohustuste – kasutamiseks. Muide, huvitav fakt - algul tegid arendajad ettepaneku peita summad tavalise segamise teel ehk lisada suvaliste summade jaoks väljundeid, et tekitada ebakindlust, kuid siis läksid üle kohustustele (pole fakt, et säästsid tehingu suurus, nagu allpool näeme).
Üldiselt näeb pühendumus välja järgmine:
kus C — kohustuse enda tähendus, a - varjatud summa, H on elliptilise kõvera fikseeritud punkt (täiendav generaator) ja x — mingi suvaline mask, juhuslikult genereeritud peittegur. Maski on siin vaja selleks, et kolmas osapool ei saaks pühendumise väärtust lihtsalt ära arvata.
Uue väljundi genereerimisel arvutab rahakott selle eest kohustuse ja kulumisel võtab kas genereerimisel arvutatud väärtuse või arvutab selle ümber, olenevalt tehingu tüübist.
RingCT lihtne
Lihtsate RingCT tehingute puhul on selleks, et tehing tekitaks väljundeid summas, mis on võrdne sisendite hulgaga (ei tootnud tühjast ilmast raha), on vajalik, et esimese ja teise kohustuste summa need on samad, see tähendab:
Pühendumuskomisjonid peavad seda veidi erinevalt - ilma maskita:
Kus a — komisjonitasu suurus, see on avalikult kättesaadav.
Selline lähenemine võimaldab meil tõestada tuginevale poolele, et kasutame samu summasid ilma neid avaldamata.
Asjade selgemaks muutmiseks vaatame näidet. Oletame, et tehing kulutab kaks väljundit (see tähendab, et neist saavad sisendid) 10 ja 5 XMR ning genereerib kolm väljundit väärtusega 12 XMR: 3, 4 ja 5 XMR. Samal ajal maksab ta vahendustasu 3 XMR. Seega on kulutatud rahasumma pluss genereeritud summa ja vahendustasu võrdne 15 XMR-iga. Proovime arvutada kohustused ja vaadata nende summade erinevust (pidage meeles matemaatikat):
Siin näeme, et võrrandi koondumiseks on vaja, et sisend- ja väljundmaskide summad oleksid samad. Selleks genereerib rahakott juhuslikult x1, y1, y2 ja y3, ja ülejäänud x2 arvutab nii:
Neid maske kasutades saame igale kontrollijale tõestada, et me ei teeni rohkem raha, kui kulutame, ilma summat avaldamata. Originaal, eks?
RingCT täis
Täielike RingCT tehingute puhul on ülekandesummade kontrollimine veidi keerulisem. Nende tehingute puhul ei arvuta rahakott sisendite kulukohustusi ümber, vaid kasutab neid, mis on arvutatud nende loomise ajal. Sel juhul peame eeldama, et me ei saa enam nulliga võrdsete summade vahet, vaid selle asemel:
see on z — erinevus sisend- ja väljundmaskide vahel. Kui arvestada zG avaliku võtmena (mida see de facto on), siis z on privaatvõti. Seega teame avalikke ja vastavaid privaatvõtmeid. Kui need andmed käes, saame neid kasutada MLSAG-i helisignaalis koos segatavate väljundite avalike võtmetega:
Seega tagab kehtiv ringsignatuur selle, et me teame ühe veeru kõiki privaatvõtmeid ja me saame teada ainult viimase rea privaatvõtit, kui tehing ei tekita rohkem raha kui kulutab. Muide, siin on vastus küsimusele "miks ei vii kohustuste summade erinevus nullini" - kui zG = 0, siis laiendame veergu reaalsete väljunditega.
Kuidas raha saaja teab, kui palju raha talle saadeti? Siin on kõik lihtne – tehingu saatja ja saaja vahetavad võtmeid kasutades Diffie-Hellmani protokolli, kasutades tehinguvõtit ja saaja vaatevõtit ning arvutavad välja jagatud saladuse. Saatja kirjutab selle jagatud võtmega krüpteeritud väljundkoguste andmed tehingu eriväljadele.
Vahemiku tõendid
Mis juhtub, kui kasutate kulukohustuste summana negatiivset arvu? See võib kaasa tuua täiendavate müntide genereerimise! Selline tulemus on vastuvõetamatu, seega peame tagama, et kasutatavad summad ei oleks negatiivsed (muidugi ilma neid summasid avaldamata, muidu on tööd nii palju ja kõik asjata). Teisisõnu peame tõestama, et summa on intervallis [0, 2n - 1].
Selleks jagatakse iga väljundi summa kahendnumbriteks ja kohustus arvutatakse iga numbri kohta eraldi. Parem on näha, kuidas see juhtub näitega.
Oletame, et meie kogused on väikesed ja mahuvad 4 bitti (praktikas on see 64 bitti) ning loome väljundi väärtusega 5 XMR. Arvutame kulukohustused iga kategooria kohta ja kogukohustuse kogu summa kohta:
Järgmisena segatakse iga kohustus surrogaadiga (Ci-2iH) ja see on allkirjastatud paaris Borromeo sõrmuse allkirjaga (teine sõrmusallkiri), mille pakkus välja Greg Maxwell 2015. aastal (selle kohta saate rohkem lugeda
Kokkuvõttes nimetatakse seda vahemiku tõendiks ja see võimaldab teil tagada, et kohustused kasutavad vahemikus olevaid summasid [0, 2n - 1].
Mis edasi?
Praeguses teostuses võtavad vahemiku tõendid palju ruumi – 6176 baiti väljundi kohta. See toob kaasa suuremad tehingud ja seega ka kõrgemad tasud. Monero tehingu mahu vähendamiseks võtavad arendajad Borromeo allkirjade asemel kasutusele kuulikindlad mehhanismid – vahemikukindel mehhanism ilma bitipõhiste kohustusteta.
Esitage oma küsimusi, soovitage teemasid uute artiklite jaoks krüptovaluuta valdkonna tehnoloogiate kohta ja tellige ka meie grupp
Allikas: www.habr.com