Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas

Tęsiame seriją apie Monero blokų grandinę, o šiandienos straipsnis bus skirtas RingCT (Ring Confidential Transactions) protokolui, kuriame pristatomi konfidencialūs sandoriai ir nauji žiediniai parašai. Deja, internete yra mažai informacijos apie tai, kaip tai veikia, ir mes bandėme užpildyti šią spragą.

Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas

Kalbėsime apie tai, kaip tinklas slepia pervedimo sumas naudodamas šį protokolą, kodėl atsisakė klasikinių kriptonotų žiedų parašų ir kaip ši technologija vystysis toliau.

Kadangi šis protokolas yra viena iš sudėtingiausių Monero technologijų, skaitytojui reikės pagrindinių žinių apie šios blokų grandinės dizainą ir trumpų žinių apie elipsinės kreivės kriptografiją (norėdami pagyvinti šias žinias, galite perskaityti pirmuosius mūsų ankstesnis straipsnis apie kelių parašų).

RingCT protokolas

Viena iš galimų atakų prieš kriptonotų valiutas yra „blockchain“ analizė, pagrįsta žiniomis apie išsiųstos operacijos sumą ir laiką. Tai leidžia žymiai susiaurina užpuoliką dominančių išėjimų paieškos sritį. Siekdama apsisaugoti nuo tokios analizės, Monero įdiegė anoniminį transakcijų protokolą, kuris visiškai paslepia pervedimų sumas tinkle.

Verta paminėti, kad sumų slėpimo idėja nėra nauja. „Bitcoin Core“ kūrėjas Gregas Maxwellas vienas pirmųjų tai aprašė savo knygoje straipsnis Konfidencialūs sandoriai. Dabartinis RingCT diegimas yra jo modifikacija su galimybe naudoti skambučio parašus (nesvarbu, ar be jų), todėl jis gavo pavadinimą - Ring Confidential Transactions.

Be kita ko, protokolas padeda atsikratyti problemų, susijusių su maišymosi dulkių išvestimis - nedidelio kiekio išvesties (dažniausiai gaunamos pakeitimo forma iš operacijų), dėl kurių kilo daugiau problemų, nei buvo verta.

2017 m. sausio mėn. įvyko „Monero“ tinklo „kietoji šakutė“, leidžianti pasirinktinai naudoti konfidencialius sandorius. Ir jau tų pačių metų rugsėjį su 6 versijos hard fork tokios operacijos tapo vienintelėmis leistinomis tinkle.

„RingCT“ vienu metu naudoja kelis mechanizmus: daugiasluoksnius susietus spontaniškus anoniminius grupės parašus (daugiasluoksnius susietus spontaniškus anoniminius grupės parašus, toliau – MLSAG), įsipareigojimų schemą („Pedersen“ įsipareigojimai) ir diapazono įrodymus (šis terminas neturi nustatyto vertimo į rusų kalbą). .

RingCT protokolas pristato dviejų tipų anoniminius sandorius: paprastą ir pilną. Piniginė generuoja pirmąjį, kai operacija naudoja daugiau nei vieną įvestį, antrąją – priešingoje situacijoje. Jie skiriasi operacijų sumų ir MLSAG parašu pasirašytų duomenų patvirtinimu (apie tai plačiau pakalbėsime toliau). Be to, pilno tipo operacijas galima sugeneruoti su bet kokiu įvesties skaičiumi, esminio skirtumo nėra. Knygoje „Nulis iki Monero“ Šiuo atžvilgiu teigiama, kad sprendimas apriboti visas operacijas iki vieno įvesties buvo priimtas skubotai ir ateityje gali pasikeisti.

MLSAG parašas

Prisiminkime, kas yra pasirašytų operacijų įvestis. Kiekviena operacija išleidžia ir generuoja tam tikras lėšas. Lėšos generuojamos sukuriant operacijų rezultatus (tiesioginė analogija yra sąskaitos), o išvestis, kurią operacija išleidžia (juk realiame gyvenime mes išleidžiame banknotus), tampa įvestimi (atsargiai, labai lengva susipainioti čia).

Įvestis nurodo kelis išėjimus, bet išleidžia tik vieną, taip sukuriant „dūmų uždangą“, kad būtų sunku analizuoti vertimo istoriją. Jei sandoris turi daugiau nei vieną įvestį, tada tokią struktūrą galima pavaizduoti kaip matricą, kur eilutės yra įvestis, o stulpeliai - mišrūs išėjimai. Norint įrodyti tinklui, kad operacija tiksliai išleidžia savo išvestis (žino jų slaptus raktus), įvestis pasirašoma žiediniu parašu. Toks parašas garantuoja, kad pasirašantis asmuo žinojo visų bet kurio stulpelio elementų slaptuosius raktus.

Konfidencialiems sandoriams nebenaudojami klasikiniai kriptonotas skambučio parašai, juos pakeitė MLSAG – panašių vieno sluoksnio skambėjimo parašų versija, pritaikyta kelioms įvestims, LSAG.

Jie vadinami daugiasluoksniais, nes vienu metu pasirašo kelis įėjimus, kurių kiekvienas yra sumaišytas su keletu kitų, t. y. pasirašoma matrica, o ne viena eilutė. Kaip matysime vėliau, tai padeda sutaupyti parašo dydžio.

Pažiūrėkime, kaip formuojamas žiedinis parašas, naudodamiesi operacijos pavyzdžiu, kuri išleidžia 2 realius išėjimus ir naudoja m - 1 atsitiktinių iš blokų grandinės maišymui. Pažymėkime viešuosius išvesties raktus, kuriuos išleidžiame kaip
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietasir atitinkamai pagrindinius jų vaizdus: Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas Taigi gauname dydžio matricą 2 x m. Pirmiausia turime apskaičiuoti vadinamuosius iššūkius kiekvienai išėjimų porai:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Skaičiavimus pradedame nuo išvesties, kurias išleidžiame naudodami jų viešuosius raktus:Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietasir atsitiktiniai skaičiaiKonfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietasDėl to gauname šias vertes:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas, kurį naudojame iššūkiui apskaičiuoti
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietaskita išėjimų pora (kad būtų lengviau suprasti, ką kur keičiame, šias reikšmes paryškinome skirtingomis spalvomis). Visos toliau pateiktos reikšmės apskaičiuojamos apskritimu, naudojant formules, pateiktas pirmoje iliustracijoje. Paskutinis dalykas, kurį reikia apskaičiuoti, yra poros realių rezultatų iššūkis.

Kaip matome, visuose stulpeliuose, išskyrus tą, kuriame yra tikri išėjimai, naudojami atsitiktinai sugeneruoti skaičiaiKonfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas. Už π- stulpelis mums irgi jų prireiks. TransformuokimeKonfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietass:Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Pats parašas yra visų šių reikšmių rinkinys:

Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas

Tada šie duomenys įrašomi į operaciją.

Kaip matome, MLSAG yra tik vienas iššūkis c0, kuri leidžia sutaupyti parašo dydžio (tam jau reikia daug vietos). Be to, bet kuris inspektorius, naudojantis duomenisKonfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas, atkuria reikšmes c1,…, cm ir tai patikrinaKonfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas. Taigi mūsų žiedas uždarytas ir parašas patikrintas.

Viso tipo RingCT operacijoms prie matricos su mišriomis išvestimis pridedama dar viena eilutė, tačiau apie tai kalbėsime toliau.

Pederseno įsipareigojimai

Įsipareigojimų schemos (dažniau vartojamas angliškas terminas įsipareigojimai) vartojami tam, kad viena šalis galėtų įrodyti, kad žino tam tikrą paslaptį (skaičius), jos iš tikrųjų neatskleisdama. Pavyzdžiui, metate tam tikrą skaičių ant kauliuko, atsižvelgiate į įsipareigojimą ir perduodate jį tikrinančiai šaliai. Taigi, atskleisdamas slaptą numerį, tikrintojas savarankiškai apskaičiuoja įsipareigojimą, taip įsitikindamas, kad jo neapgavote.

Monero įsipareigojimai naudojami pervedimų sumoms paslėpti ir naudojamas labiausiai paplitęs variantas – Pedersen įsipareigojimai. Beje, įdomus faktas – iš pradžių kūrėjai siūlė sumas slėpti įprastu maišymu, tai yra pridėti išvesties savavališkoms sumoms, kad įneštų neapibrėžtumo, bet vėliau perėjo prie įsipareigojimų (netiesa, kad taupė operacijos dydis, kaip matysime toliau).
Apskritai įsipareigojimas atrodo taip:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietaskur C — paties įsipareigojimo prasmė, a - paslėpta suma, H yra fiksuotas elipsės kreivės taškas (papildomas generatorius) ir x — kažkokia savavališka kaukė, atsitiktinai sugeneruotas slėpimo faktorius. Kaukė čia reikalinga, kad trečioji šalis negalėtų tiesiog atspėti įsipareigojimo vertės.

Sugeneravus naują išvestį, piniginė apskaičiuoja jai įsipareigojimą, o išleidusi paima arba generuojant apskaičiuotą vertę, arba perskaičiuoja ją, priklausomai nuo operacijos tipo.

RingCT paprastas

Paprastų RingCT operacijų atveju, siekiant užtikrinti, kad sandoris sukurtų išvesties, lygias įvesties dydžiui (negamina pinigų iš oro), būtina, kad pirmojo ir antrojo įsipareigojimų suma būtų tas pats, tai yra:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Įsipareigojimų komisijos tai vertina kiek kitaip – ​​be kaukės:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietasKur a — komisinio atlyginimo dydis, jis skelbiamas viešai.

Šis metodas leidžia įrodyti besikliaujančiai šaliai, kad naudojame tas pačias sumas jų neatskleisdami.

Kad viskas būtų aiškiau, pažvelkime į pavyzdį. Tarkime, kad operacija išleidžia du išėjimus (tai reiškia, kad jie tampa įvestimis) 10 ir 5 XMR ir sukuria tris išėjimus, kurių vertė yra 12 XMR: 3, 4 ir 5 XMR. Tuo pačiu metu jis moka 3 XMR komisinius. Taigi išleista pinigų suma plius sugeneruota suma ir komisiniai yra lygi 15 XMR. Pabandykime suskaičiuoti įsipareigojimus ir pažiūrėkime į jų sumų skirtumą (prisiminkime matematiką):

Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Čia matome, kad tam, kad lygtis susilietų, reikia, kad įvesties ir išvesties kaukių sumos būtų vienodos. Norėdami tai padaryti, piniginė generuoja atsitiktinai x1, y1, y2 ir y3, o likusius x2 skaičiuoja taip:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Naudodami šias kaukes galime įrodyti bet kuriam tikrintojui, kad nesugeneruojame daugiau lėšų nei išleidžiame, neatskleisdami sumos. Originalus, tiesa?

RingCT pilnas

Atliekant visas RingCT operacijas, pervedimų sumų tikrinimas yra šiek tiek sudėtingesnis. Atliekant šias operacijas, piniginė neperskaičiuoja įsipareigojimų už įvestis, o naudoja tuos, kurie buvo apskaičiuoti juos sugeneruojant. Šiuo atveju turime daryti prielaidą, kad nebegausime skirtumo tarp sumų, lygių nuliui, o vietoj to:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Čia z — skirtumas tarp įvesties ir išvesties kaukių. Jei svarstysime zG kaip viešasis raktas (koks jis de facto yra), tada z yra privatus raktas. Taigi mes žinome viešuosius ir atitinkamus privačius raktus. Turėdami šiuos duomenis, galime juos naudoti MLSAG skambėjimo paraše kartu su maišomų išėjimų viešaisiais raktais:
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Taigi, galiojantis žiedinis parašas užtikrins, kad žinotume visus vieno iš stulpelių privačius raktus, o paskutinėje eilutėje esantį privatųjį raktą galime žinoti tik tuo atveju, jei operacija nesugeneruos daugiau lėšų nei išleidžiama. Beje, čia yra atsakymas į klausimą „kodėl įsipareigojimų dydžių skirtumas nesudaro nulio“ – jei zG = 0, tada mes išplėsime stulpelį realiais išėjimais.

Kaip lėšų gavėjas žino, kiek pinigų jam buvo išsiųsta? Čia viskas paprasta – operacijos siuntėjas ir gavėjas apsikeičia raktais naudodamas Diffie-Hellman protokolą, naudodamas operacijos raktą ir gavėjo peržiūros raktą ir apskaičiuoja bendrinamą paslaptį. Siuntėjas įrašo duomenis apie išvesties kiekius, užšifruotus šiuo bendrinamu raktu, specialiuose operacijos laukeliuose.

Diapazono įrodymai

Kas atsitiks, jei kaip įsipareigojimų sumą naudosite neigiamą skaičių? Tai gali paskatinti papildomų monetų generavimą! Toks rezultatas yra nepriimtinas, todėl turime garantuoti, kad sumos, kurias naudojame, nėra neigiamos (žinoma, neatskleidžiant šių sumų, kitaip tiek daug darbo ir viskas veltui). Kitaip tariant, turime įrodyti, kad suma yra intervale [0, 2n - 1].

Norėdami tai padaryti, kiekvienos išvesties suma padalijama į dvejetainius skaitmenis ir įsipareigojimas apskaičiuojamas kiekvienam skaitmeniui atskirai. Geriau pamatyti, kaip tai atsitiks su pavyzdžiu.

Tarkime, kad mūsų kiekiai yra maži ir telpa į 4 bitus (praktiškai tai yra 64 bitai), ir sukuriame 5 XMR išvestį. Apskaičiuojame įsipareigojimus kiekvienai kategorijai ir bendrą įsipareigojimą visai sumai:Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietas
Toliau kiekvienas įsipareigojimas sumaišomas su pakaitalu (Ci-2iH) ir yra pasirašytas poromis su Borromeo žiedo parašu (kitu žiedo parašu), kurį 2015 m. pasiūlė Greg Maxwell (daugiau apie tai galite paskaityti čia):
Konfidencialūs sandoriai Monero arba kaip perkelti nežinomus dalykus į nežinomas vietasKartu tai vadinama diapazono įrodymu ir leidžia užtikrinti, kad įsipareigojimams būtų naudojamos diapazono sumos [0, 2n - 1].

Kas toliau?

Dabartiniame diegime diapazono patikrinimai užima daug vietos – 6176 baitai vienai išvestiei. Tai veda prie didesnių sandorių ir dėl to didesnių mokesčių. Siekdami sumažinti „Monero“ sandorio dydį, kūrėjai vietoj „Borromeo“ parašų pristato neperšaunamas priemones – nuotolinio atsparumo mechanizmą be bitų įsipareigojimų. Remiantis kai kuriais skaičiavimais, jie gali sumažinti diapazono įrodymo dydį iki 94%. Beje, liepos viduryje technologija praėjo auditas iš Kudelski Security, kuri neatskleidė jokių reikšmingų trūkumų nei pačioje technologijoje, nei jos įgyvendinime. Technologija jau naudojama bandomajame tinkle, o su nauja kietąja šakute ji tikriausiai gali persikelti į pagrindinį tinklą.

Užduokite klausimus, siūlykite temas naujiems straipsniams apie technologijas kriptovaliutų srityje, taip pat užsiprenumeruokite mūsų grupę Facebookkad gautume naujausią informaciją apie mūsų renginius ir leidinius.

Šaltinis: www.habr.com

Добавить комментарий