Ne vazhdojmë serinë tonë në lidhje me blockchain Monero dhe artikulli i sotëm do të fokusohet në protokollin RingCT (Ring Confidential Transactions), i cili prezanton transaksione konfidenciale dhe nënshkrime të reja unazore. Fatkeqësisht, ka pak informacion në internet se si funksionon dhe ne u përpoqëm ta plotësojmë këtë boshllëk.
Ne do të flasim për mënyrën se si rrjeti fsheh shumat e transferimit duke përdorur këtë protokoll, pse ata braktisën nënshkrimet klasike të unazave të kriptonotës dhe se si kjo teknologji do të zhvillohet më tej.
Meqenëse ky protokoll është një nga teknologjitë më komplekse në Monero, lexuesit do t'i duhet një njohuri bazë e dizajnit të këtij blockchain dhe një njohuri kalimtare e kriptografisë së kurbës eliptike (për të përmirësuar këtë njohuri, mund të lexoni kapitujt e parë të artikulli i mëparshëm rreth
Protokolli RingCT
Një nga sulmet e mundshme ndaj monedhave kriptonote është analiza e blockchain bazuar në njohuritë për sasinë dhe kohën e transaksionit të dërguar. Kjo lejon
Vlen të theksohet se ideja e fshehjes së shumave nuk është e re. Zhvilluesi i Bitcoin Core Greg Maxwell ishte një nga të parët që e përshkroi atë në të tijën
Ndër të tjera, protokolli ndihmon për të hequr qafe problemet me përzierjen e daljeve të pluhurit - rezultate të një sasie të vogël (zakonisht të marra në formën e ndryshimit nga transaksionet), të cilat krijuan më shumë probleme sesa vlejnë.
Në Janar 2017, u zhvillua një "hard fork" i rrjetit Monero, duke lejuar përdorimin opsional të transaksioneve konfidenciale. Dhe tashmë në shtator të të njëjtit vit, me versionin 6 hard fork, transaksione të tilla u bënë të vetmet të lejuara në rrjet.
RingCT përdor disa mekanizma njëherësh: nënshkrimet spontane anonime të grupeve të lidhura me shumë shtresa (Nënshkrimi i grupit spontan i lidhur me shumë shtresa, i referuar më tej si MLSAG), një skemë angazhimi (Pedersen Commitments) dhe prova të diapazonit (ky term nuk ka një përkthim të vendosur në Rusisht) .
Protokolli RingCT prezanton dy lloje të transaksioneve anonime: të thjeshta dhe të plota. Portofoli gjeneron të parën kur një transaksion përdor më shumë se një hyrje, e dyta - në situatën e kundërt. Ato ndryshojnë në vërtetimin e shumave të transaksionit dhe të dhënat e nënshkruara me një nënshkrim të MLSAG (ne do të flasim më shumë për këtë më poshtë). Për më tepër, transaksionet e tipit full mund të gjenerohen me çdo numër inputesh, nuk ka asnjë ndryshim thelbësor. Në libër
Nënshkrimi i MPPS-së
Le të kujtojmë se cilat janë inputet e transaksioneve të nënshkruara. Çdo transaksion shpenzon dhe gjeneron disa fonde. Gjenerimi i fondeve ndodh duke krijuar rezultate transaksioni (një analogji e drejtpërdrejtë janë faturat), dhe prodhimi që shpenzon transaksioni (në fund të fundit, në jetën reale ne shpenzojmë kartëmonedha) bëhet hyrje (kini kujdes, është shumë e lehtë të ngatërrohesh këtu).
Një hyrje referon rezultate të shumta, por shpenzon vetëm një, duke krijuar kështu një "smokescreen" për ta bërë të vështirë analizimin e historisë së përkthimit. Nëse një transaksion ka më shumë se një hyrje, atëherë një strukturë e tillë mund të përfaqësohet si një matricë, ku rreshtat janë hyrjet dhe kolonat janë daljet e përziera. Për t'i vërtetuar rrjetit se transaksioni shpenzon saktësisht rezultatet e tij (i njeh çelësat e tyre sekretë), hyrjet nënshkruhen me një nënshkrim unazë. Një nënshkrim i tillë garanton që nënshkruesi i dinte çelësat sekretë për të gjithë elementët e cilësdo prej kolonave.
Transaksionet konfidenciale nuk përdorin më ato klasike
Ato quhen shumështresore sepse nënshkruajnë disa hyrje në të njëjtën kohë, secila prej të cilave është e përzier me disa të tjera, d.m.th., nënshkruhet një matricë dhe jo një rresht. Siç do ta shohim më vonë, kjo ndihmon në kursimin e madhësisë së nënshkrimit.
Le të shohim se si formohet një nënshkrim unazor, duke përdorur shembullin e një transaksioni që shpenzon 2 rezultate reale dhe përdor m - 1 të rastësishme nga blockchain për përzierje. Le të shënojmë çelësat publikë të rezultateve që shpenzojmë si
, dhe imazhet kryesore për ta në përputhje me rrethanat: Kështu, marrim një matricë të madhësisë 2 x m. Së pari, ne duhet të llogarisim të ashtuquajturat sfida për secilën palë të rezultateve:
Ne fillojmë llogaritjet me rezultatet, të cilat i shpenzojmë duke përdorur çelësat e tyre publikë:dhe numra të rastitSi rezultat, marrim vlerat e mëposhtme:
, të cilin e përdorim për të llogaritur sfidën
çifti tjetër i rezultateve (për ta bërë më të lehtë të kuptojmë se ku po zëvendësojmë, ne i kemi theksuar këto vlera me ngjyra të ndryshme). Të gjitha vlerat e mëposhtme janë llogaritur në një rreth duke përdorur formulat e dhëna në ilustrimin e parë. Gjëja e fundit për t'u llogaritur është sfida për një palë rezultate reale.
Siç mund ta shohim, të gjitha kolonat përveç asaj që përmban rezultate reale përdorin numra të gjeneruar rastësisht. Për π- kolona do të na duhen gjithashtu. Le të transformoheminë s:
Nënshkrimi në vetvete është një tufë e të gjitha këtyre vlerave:
Këto të dhëna më pas shkruhen në një transaksion.
Siç mund ta shohim, MLSAG përmban vetëm një sfidë c0, e cila ju lejon të kurseni në madhësinë e nënshkrimit (e cila tashmë kërkon shumë hapësirë). Më tej, çdo inspektor, duke përdorur të dhënat, rikthen vlerat c1,…, cm dhe e kontrollon atë. Kështu unaza jonë është mbyllur dhe firma është verifikuar.
Për transaksionet RingCT të tipit të plotë, një linjë më shumë i shtohet matricës me rezultate të përziera, por ne do të flasim për këtë më poshtë.
Angazhimet e Pedersenit
Angazhimet Monero përdoren për të fshehur shumat e transfertave dhe për të përdorur opsionin më të zakonshëm - zotimet Pedersen. Nga rruga, një fakt interesant - në fillim zhvilluesit propozuan fshehjen e shumave me përzierje të zakonshme, domethënë shtimin e rezultateve për shuma arbitrare për të futur pasiguri, por më pas ata kaluan në angazhime (nuk është fakt që ata kursyen madhësia e transaksionit, siç do të shohim më poshtë).
Në përgjithësi, angazhimi duket kështu:
ku C - vetë kuptimi i angazhimit, a - shuma e fshehur, H është një pikë fikse në lakoren eliptike (gjenerator shtesë), dhe x — një lloj maske arbitrare, një faktor fshehës i krijuar rastësisht. Maska është e nevojshme këtu në mënyrë që një palë e tretë të mos mund të hamendësojë thjesht vlerën e angazhimit.
Kur gjenerohet një prodhim i ri, portofoli llogarit angazhimin për të dhe kur shpenzohet, merr ose vlerën e llogaritur gjatë gjenerimit ose e rillogarit atë, në varësi të llojit të transaksionit.
RingCT e thjeshtë
Në rastin e transaksioneve të thjeshta RingCT, për të siguruar që transaksioni të krijojë rezultate në një sasi të barabartë me sasinë e inputeve (nuk ka prodhuar para nga ajri i hollë), është e nevojshme që shuma e angazhimeve të së parës dhe të dytës. ato të jenë të njëjta, domethënë:
Komisionet e angazhimit e konsiderojnë atë pak më ndryshe - pa maskë:
Ku a — shuma e komisionit, është e disponueshme publikisht.
Kjo qasje na lejon t'i dëshmojmë palës mbështetëse se po përdorim të njëjtat shuma pa i zbuluar ato.
Për t'i bërë gjërat më të qarta, le të shohim një shembull. Le të themi se një transaksion shpenzon dy dalje (që do të thotë se ato bëhen hyrje) prej 10 dhe 5 XMR dhe gjeneron tre dalje me vlerë 12 XMR: 3, 4 dhe 5 XMR. Në të njëjtën kohë, ai paguan një komision prej 3 XMR. Kështu, shuma e parave të shpenzuara plus shumën e gjeneruar dhe komisioni është e barabartë me 15 XMR. Le të përpiqemi të llogarisim angazhimet dhe të shohim ndryshimin në shumat e tyre (kujtoni matematikën):
Këtu shohim se që ekuacioni të konvergojë, ne kemi nevojë që shumat e maskave hyrëse dhe dalëse të jenë të njëjta. Për ta bërë këtë, portofoli gjeneron rastësisht x1, y1, y2 dhe y3, dhe pjesa e mbetur x2 llogarit kështu:
Duke përdorur këto maska, ne mund t'i dëshmojmë çdo verifikuesi se nuk gjenerojmë më shumë fonde sesa shpenzojmë, pa bërë të ditur shumën. Origjinale, apo jo?
RingCT plot
Në transaksionet e plota RingCT, kontrollimi i shumave të transferimit është pak më i ndërlikuar. Në këto transaksione, portofoli nuk rillogarit angazhimet për inputet, por përdor ato të llogaritura kur u krijuan. Në këtë rast, duhet të supozojmë se nuk do të marrim më diferencën në shumat e barabarta me zero, por përkundrazi:
Këtu z — ndryshimi midis maskave hyrëse dhe dalëse. Nëse kemi parasysh zG si një çelës publik (që de facto është), atëherë z është çelësi privat. Kështu, ne i njohim çelësat publikë dhe privatë përkatës. Me këto të dhëna në dorë, ne mund t'i përdorim ato në nënshkrimin e ziles së MLSAG së bashku me çelësat publikë të rezultateve që janë të përziera:
Kështu, një nënshkrim i vlefshëm i ziles do të sigurojë që ne i dimë të gjithë çelësat privatë të njërës prej kolonave dhe ne mund ta njohim çelësin privat në rreshtin e fundit nëse transaksioni nuk gjeneron më shumë fonde sesa shpenzon. Nga rruga, këtu është përgjigja e pyetjes "pse diferenca në shumat e angazhimeve nuk çon në zero" - nëse zG = 0, atëherë do ta zgjerojmë kolonën me dalje reale.
Si e di marrësi i fondeve se sa para i janë dërguar? Gjithçka është e thjeshtë këtu - dërguesi i transaksionit dhe marrësi shkëmbejnë çelësat duke përdorur protokollin Diffie-Hellman, duke përdorur çelësin e transaksionit dhe çelësin e pamjes së marrësit dhe llogarisin sekretin e përbashkët. Dërguesi shkruan të dhëna për shumat e daljes, të koduara me këtë çelës të përbashkët, në fusha të veçanta të transaksionit.
Provat e diapazonit
Çfarë ndodh nëse përdorni një numër negativ si shumë në angazhimet? Kjo mund të çojë në gjenerimin e monedhave shtesë! Ky rezultat është i papranueshëm, ndaj duhet të garantojmë që shumat që përdorim nuk janë negative (natyrisht, pa i zbuluar këto shuma, përndryshe ka shumë punë dhe gjithçka kot). Me fjalë të tjera, ne duhet të vërtetojmë se shuma është në interval [0, 2n - 1].
Për ta bërë këtë, shuma e çdo prodhimi ndahet në shifra binare dhe angazhimi llogaritet për secilën shifër veç e veç. Është më mirë të shihet se si ndodh kjo me një shembull.
Le të supozojmë se shumat tona janë të vogla dhe përshtaten në 4 bit (në praktikë kjo është 64 bit), dhe ne krijojmë një dalje me vlerë 5 XMR. Ne llogarisim zotimet për secilën kategori dhe angazhimin total për të gjithë shumën:
Më pas, çdo angazhim përzihet me një zëvendësues (Ci-2iH) dhe është nënshkruar në çift me nënshkrimin e unazës Borromeo (një nënshkrim tjetër i unazës), i propozuar nga Greg Maxwell në 2015 (mund të lexoni më shumë për të
Të marra së bashku, kjo quhet prova e diapazonit dhe ju lejon të siguroheni që angazhimet përdorin shuma në interval [0, 2n - 1].
Çka më tej?
Në zbatimin aktual, provat e diapazonit zënë shumë hapësirë - 6176 bajt për dalje. Kjo çon në transaksione më të mëdha dhe për rrjedhojë tarifa më të larta. Për të reduktuar madhësinë e një transaksioni Monero, zhvilluesit po prezantojnë antiplumb në vend të nënshkrimeve të Borromeo - një mekanizëm provues i rrezes pa angazhime të vogla.
Bëni pyetjet tuaja, sugjeroni tema për artikuj të rinj rreth teknologjive në fushën e kriptomonedhës dhe gjithashtu abonohuni në grupin tonë në
Burimi: www.habr.com