JĂ€tkame meie tsĂŒklit Monero blockchain'i ĂŒlesehituse teemal, ja tĂ€nane artikkel keskendub RingCT (Ring Confidential Transactions) protokollile, milles tutvustatakse konfidentsiaalseid tehinguid ja uusi rĂ”ngassigneeringuid. Kahjuks on internetis vĂ€he teavet selle toimimise kohta, ning oleme proovinud seda puudust tĂ€ita.

RÀÀgime sellest, kuidas see protokoll varjab ĂŒlekannete summasid, miks on loobutud klassikalistest cryptonote rĂ”ngassigneeringutest ja kuidas tehnoloogia tulevikus areneb.
Kuna see protokoll on ĂŒks Monero keerukamaid tehnoloogiaid, vajab lugeja pĂ”hiteadmisi selle blockchain'i ĂŒlesehitusest ja pindmist teadlikkust elliptsete kĂ”verate krĂŒptograafiast (et oma teadmisi vĂ€rskendada, vĂ”ib lugeda meie eelmise artikli esimesi peatĂŒkke) ).
RingCT protokoll
Ăks vĂ”imalikke rĂŒnnakuid cryptonote valuutade vastu on blokiketi analĂŒĂŒs, mis pĂ”hineb saadetud tehingu summal ja ajas. See vĂ”imaldab oluliselt kitsendada huvides oleva vĂ€ljundite otsimise ala. Sellel analĂŒĂŒsile vastupanu saavutamiseks on Moneros rakendatud anonĂŒĂŒmsete tehingute protokoll, mis varjab tĂ€ielikult ĂŒlekannete summasid vĂ”rgus.
Tuleb mĂ€rkida, et summa varjamise idee ei ole uus. Ăks esimesi, kes seda kirjeldas, oli Bitcoin Core'i arendaja Greg Maxwell oma Praegune RingCT rakendus on selle modifikatsioon koos ringallkirjade kasutamise vĂ”imalusega (kuidas siis ilma neist), ja seetĂ”ttu on see saanud oma nime â Ring Confidential Transactions.
Pealegi aitab protokoll vabaneda mustade vĂ€ljundite segamisprobleemidest â vĂ€ikeste summade vĂ€ljunditest (mis tavaliselt tekivad tehingute vahetasudena), mis pĂ”hjustasid rohkem probleeme kui neid vÀÀrt.
2017. aasta jaanuaris toimus Monero vĂ”rgus hard fork, mis vĂ”imaldas konfidentsiaalsete tehingute valikulist kasutamist. Juba sama aasta septembris sai versiooni 6 hard forkist selline tehingute tĂŒĂŒp vaid ainukeseks lubatud vormiks vĂ”rgus.
RingCT kasutab mitmeid mehhanisme: mitmekihilised seotud spontaansed anonĂŒĂŒmsed grupiallarid (Multilayered Linkable Spontaneous Anonymous Group Signature, edaspidi â MLSAG), kohustuste skeem (Pedersen Commitments) ja vahemiku tĂ”endid (sellel terminil ei ole kindlat tĂ”lget).
RingCT protokoll toob kahte tĂŒĂŒpi anonĂŒĂŒmseid tehinguid: simple ja full. Esimene genereerib rahakott, kui tehing kasutab rohkem kui ĂŒhte sisendit, teine â vastupidises olukorras. Need erinevad tehingusummade valideerimise ja allkirjastatavate MLSAG-allkirjade andmete poolest (rÀÀgime sellest lĂ€hemalt hiljem). TĂŒĂŒpi full tehingute genereerimine on vĂ”imalik mistahes sisendite arvuga, pĂ”himĂ”tteliselt pole vahet. Raamat sel teemal ĂŒtleb, et otsus piirata full tehingud ĂŒhe sisendiga tehti kiiruga ja tulevikus vĂ”ib see muutuda.
MLSAG-allkiri
Korratakse, mis kujutavad endast allkirjastatavad tehingu sisendid. Iga tehing kulutab teatud vahendeid ja genereerib. Vahendite genereerimine toimub tehingu vĂ€ljundite loomise kaudu (otse analoogia â rahatĂ€hed), ja vĂ€ljund, mida tehing kulutab (sest tegelikus elus kulutame me just rahakĂ€si), muutub sisendiks (ole ettevaatlik, siin on vĂ€ga kerge segadusse minna).
Sisend viitab mitmele vĂ€ljundile, kuid kulutab vaid ĂŒhe, luues seelĂ€bi âsuitsuvahuâ, et raskendada ĂŒlekannete ajaloo analĂŒĂŒsi. Kui tehingul on rohkem kui ĂŒks sisend, saab sellist struktuuri kujutada maatriksina, kus read on sisendid ja veerud â segatud vĂ€ljundid. Et tĂ”estada vĂ”rgule, et tehing kulutab tĂ”eliselt oma vĂ€ljundeid (teab nende salajasi vĂ”tmeid), allkirjastavad sisendid ringallkirjaga. Selline allkiri garanteerib, et allkirjastajal oleks teada salajased vĂ”tmed kĂ”igi mingi veeru elementide kohta.
Konfidentsiaalsed tehingud ei kasuta enam traditsioonilisi ringallkirju, nende asemel on tulnud MLSAG â mitme sisendi jaoks kohandatud analoogne ĂŒhekihiliste ringallkirjade versioon, .
Nimetatakse multi-kihilisteks, kuna nad allkirjastavad kohe mitu sisendit, millest igaĂŒks on segatud mitme teisega, st allkirjastatakse maatriks, mitte ainult ĂŒks rida. Nagu me hiljem nĂ€eme, aitab see kokku hoida allkirja suuruses.
Vaadakem, kuidas ringallkiri moodustatakse, vĂ”ttes nĂ€iteks tehingu, mis kasutab 2 reaalset vĂ€ljundit ja segab kasutamiseks m â 1 juhuslikku blokiahelast. MĂ€rgime vĂ€lja, mida me kulutame, kui
, ja nende vastavad key images:
Nii et, meil on tulemuseks maatriks suurusega 2 x m. Esiteks peame arvutama nii nimetatud challenge'id iga vÀljundi paari jaoks:

Arvutused alustame vÀljunditega, mille avalikke vÔtmeid me kasutame:
ja juhuslikud numbrid
Tulemusena saame vÀÀrtused:
, mida kasutame challenge'i arvutamiseks
jÀrgmise vÀljundi paari jaoks (et oleks lihtsam aru saada, kuhu mis pannakse, oleme need vÀÀrtused esile tÔstnud erinevate vÀrvidega). KÔik jÀrgmised vÀÀrtused arvutatakse ringis vastavalt esimeses illustreerimises toodud valemitele. Viimasena arvutatakse challenge reaalse vÀljundi paari jaoks.
Kuidas me nÀeme, kasutatakse kÔigis veergudes, vÀlja arvatud reaalseid vÀljundeid sisaldavas veerus, juhuslikult genereeritud numbreid
. Ăheks vĂ”imaluseks on see, et seda montaaĆŸ on eraldi osasse, mis on kirjutamiseks kergesti kĂ€tessĂ€adav, samas kui enda Ï-ndas veerus need meil ka vajalikud. Muudame
s:ks:
Allkiri on kÔigi nende vÀÀrtuste tuple:

SeejÀrel kirjutatakse need andmed tehingusse.
Kuidas me nĂ€eme, sisaldab MLSAG ainult ĂŒhte challenge'it c0, mis vĂ”imaldab kokkuhoidu allkirja suuruses (mis juba nĂ”uab palju ruumi). Edasi iga kontrollija, kasutades andmeid
, taastab vÀÀrtused c1,âŠ, cm ja kontrollib, et
. Nii et meie ring on suletud ja allkiri lÀbis kontrolli.
Full RingCT tehingute puhul lisatakse maatriksile veel ĂŒks rida segatud vĂ€ljunditega, kuid sellest rÀÀgime hiljem.
Pederseni kohustused
(tihti kasutatakse ingliskeelset terminit â commitments) on mĂ”eldud selleks, et ĂŒks pool saaks tĂ”estada, et ta teab mingit saladust (numbrist), paljastamata seda tegelikult. NĂ€iteks viskate tĂ€ringul mingit arvu, arvutate kohustuse ja edastate selle kontrollivale poolele. Nii, saladusliku numbri paljastamise hetkel arvestab kontrollija iseseisvalt kohustuse, veendudes seelĂ€bi, et te ei petnud teda.
Moneros kasutatakse kohustusi ĂŒlekannete summade varjamiseks ja rakendatakse kĂ”ige laialdasemalt levinud varianti â Pederseni kohustusi. Muide, huvitav fakt â algselt pakkusid arendajad vĂ€lja summa varjamise tavapĂ€rase segamise teel, lisades vĂ€ljundeid juhuslike summadega, et tekitada ebakindlust, kuid seejĂ€rel lĂ€ksid nad ĂŒle kohustustele (mille tulemusena ei pruugi nad siiski tehingu suuruses kokku hoida, nagu nĂ€eme hiljem).
Ăldiselt nĂ€eb kohustus vĂ€lja jĂ€rgmiselt:
Kus C â kohustuse vÀÀrtus, a â varjatav summa, H â fikseeritud punkt elliptilisel kĂ”veral (tĂ€iendav generaator), x â mingisugune suvaline mask, peitev tegur, mis genereeritakse juhuslikult. Mask on siin vajalik, et kolmas osapool ei saaks lihtsa katsega vÀÀrtust commitment vĂ€lja selgitada.
Uue vĂ€ljundi genereerimisel arvutab rahakott selle jaoks commitment'i, ning kulutamise korral vĂ”tab kas genereerimise ajal arvutatud vÀÀrtuse vĂ”i arvutab selle uuesti â sĂ”ltuvalt tehingu tĂŒĂŒbist.
RingCT simple
Simple RingCT tehingute puhul, et tagada, et tehing on loonud vÀljundid, mille summa on vÔrdne sissetulekute summaga (ei ole mingit raha Ôhust tekkinud), peab esimeste ja teise commitments'e summa olema sama, see tÀhendab:

Komisjonitasusid arvutatakse veidi teisiti â ilma maskita:
, kus a â komisjonitasu summa, see on avalikult kergesti kĂ€ttesaadav.
Selline lÀhenemine vÔimaldab tÔestada kontrollijale, et me kasutame samu summasid, neid avaldamata.
Et kÔik oleks selgem, vaatame nÀidet. Oletame, et tehing kasutab kahte vÀljundit (st need muutuvad sissetulekuteks) summas 10 ja 5 XMR ning genereerib kolm vÀljundit kogusummas 12 XMR: 3, 4 ja 5 XMR. Selle eest tasub ta komisjonitasu 3 XMR. Seega kulutatud raha summa pluss genereeritud summa ja komisjonitasu kokku on 15 XMR. Proovime arvutada commitments'e ja vaatame nende summade erinevust (korrake matemaatikat):

Siin me nĂ€eme, et tasakaalu saavutamiseks peavad sisse- ja vĂ€ljundite maskide summad olema ĂŒhesugused. Selleks genereerib rahakott juhuslikult x1, y1, y2 ja y3, ning ĂŒlejÀÀnud x2 arvutab nii:
![]()
Kasutades neid maske, saame tÔestada igale kontrollijale, et me ei generi rohkem vahendeid, kui me kulutame, summasid avaldamata. Algne, eks?
RingCT full
Full RingCT tehingute puhul toimub summade kontrollimise protsess veidi keerukamalt. Nendes tehingutes ei arvuta rahakott sissetulekute jaoks commitments'e uuesti, vaid kasutab neid, mis on genereerimise ajal arvutatud. Arvestama peab, et summa erinevus ei ole enam null, vaid selle asemel:

Siin z â sissetulekute ja vĂ€ljundite maskide erinevus. Kui vaadata zG nagu avaliku vĂ”tme (millega ta de jure on), siis z â see on privaatvĂ”ti. Nii teame me avalikku ja sellele vastavat privaatvĂ”tit. Olles need andmed, saame neid kasutada MLSAG ringallkirjas koos segatud vĂ€ljundite avalike vĂ”tmetega:

Seega garanteerib kehtiv ringallkiri, et me teame kĂ”iki privaatvĂ”tmeid ĂŒhe veeru kohta, samas kui viimane rida privaatvĂ”tme saame teada ainult juhul, kui tehing ei genereeri vahendeid rohkem, kui kulutab. Ăhest kĂŒljest, siin on ka vastus kĂŒsimusele âmiks summeerimise erinevused ei vii nulliniâ â kui zG = 0, siis paljastame veeru tegelike vĂ€ljunditega.
Aga kuidas saaja teab, kui palju raha talle saadeti? Siin on kĂ”ik lihtne â tehingu saatja ja saaja vahetavad vĂ”tmeid Diffie-Hellmani protokolli kaudu, kasutades tehinguvĂ”tit ja saaja vaatamisvĂ”tit ning arvutavad ĂŒhise salajase. Saatja kirjutab tehingu spetsiaalsetesse vĂ€ljakutesse summad vĂ€lja, mis on krĂŒpteeritud selle ĂŒhise vĂ”tmega.
Range proofs
Aga mis juhtub, kui kasutame summa tĂ”endustes negatiivset numbrit? See vĂ”ib viia tĂ€iendavate mĂŒntide genereerimiseni! Selline tulemus on vastuvĂ”etamatu, seega on vajalik tagada, et meie kasutatavad summad pole negatiivsed (ilma nende summade avalikustamiseta, loomulikult, vastasel juhul oleks kogu vaev asjata). TeisisĂ”nu, peame tĂ”endama, et summa jÀÀb vahemikku [0, 2n â 1].
Selleks jagatakse iga vÀljundi summa kaheksandiks ja arvutatakse iga bitisumma kohta eraldi tÔendus. Kuidas see toimub, on parem vaadata nÀite abil.
Oletame, et summad on meil vÀikesed ja mahtuvad 4 bitti (praktikas on see 64 bitti), ja loome vÀljundi summas 5 XMR. Arvutame tÔendused igas bitis ja kokku kogu summa jaoks:
SeejĂ€rel segatakse iga tĂ”endus asendusega (Ci-2iH) ja allkirjastatakse paarikaupa Borromeo ringallkirjaga (veel ĂŒks ringallkiri), mille pakkus vĂ€lja Greg Maxwell 2015. aastal (rohkem selle kohta saab lugeda ):
Kokku nimetatakse seda ulatuslikuks tĂ”enduseks ja see garanteerib, et tĂ”endustes kasutatakse summasid vahemikus [0, 2n â 1].
Mis edasi?
Praeguses rakenduses vĂ”tavad vahemikuproofid vĂ€ga palju ruumi â 6176 baiti ĂŒhe vĂ€ljundi kohta. See viib suurte tehinguteni ja seega kĂ”rgemate tasudeni. Tehingu suuruse vĂ€hendamiseks tutvustavad Monero arendajad allkirjade asemel Borromeo bulletproofse â vahemikuproovi mehhanismi ilma bititasemel kohustusteta. , suudavad nad vĂ€hendada vahemikuproovi suurust kuni 94%. Kasutatuna on see tehnoloogia keset juulit lĂ€binud Kudelski Securityilt, kes ei leidnud tehnoloogia ega selle rakenduse osas olulisi puudusi. Tehnoloogiat kasutatakse juba testvĂ”rgus ning uue hard forki korral vĂ”ib see tĂ”enĂ€oliselt minna ka peavĂ”rku.
Esitage oma kĂŒsimused, pakkuda teemasid uute artiklite jaoks krĂŒptovaluutatehnoloogiast ning liituge meie grupiga , et olla kursis meie sĂŒndmuste ja vĂ€ljaannetega.
Allikas: habr.com
