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ą.
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
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
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
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
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
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
ir atitinkamai pagrindinius jų vaizdus: Taigi gauname dydžio matricą 2 x m. Pirmiausia turime apskaičiuoti vadinamuosius iššūkius kiekvienai išėjimų porai:
Skaičiavimus pradedame nuo išvesties, kurias išleidžiame naudodami jų viešuosius raktus:ir atsitiktiniai skaičiaiDėl to gauname šias vertes:
, kurį naudojame iššūkiui apskaičiuoti
kita 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čiai. Už π- stulpelis mums irgi jų prireiks. Transformuokimes:
Pats parašas yra visų šių reikšmių rinkinys:
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 duomenis, atkuria reikšmes c1,…, cm ir tai patikrina. 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
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:
kur 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:
Įsipareigojimų komisijos tai vertina kiek kitaip – be kaukės:
Kur 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ą):
Č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:
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:
Č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:
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:
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
Kartu 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ų.
Užduokite klausimus, siūlykite temas naujiems straipsniams apie technologijas kriptovaliutų srityje, taip pat užsiprenumeruokite mūsų grupę
Šaltinis: www.habr.com