Ipinagpapatuloy namin ang aming serye tungkol sa Monero blockchain, at ang artikulo ngayon ay tututuon sa protocol ng RingCT (Ring Confidential Transactions), na nagpapakilala ng mga kumpidensyal na transaksyon at mga bagong pirma ng singsing. Sa kasamaang palad, may kaunting impormasyon sa Internet tungkol sa kung paano ito gumagana, at sinubukan naming punan ang puwang na ito.
Pag-uusapan natin kung paano itinatago ng network ang mga halaga ng paglilipat gamit ang protocol na ito, kung bakit nila inabandona ang mga klasikong pirma ng singsing na cryptonote, at kung paano uunlad ang teknolohiyang ito.
Dahil ang protocol na ito ay isa sa mga pinaka-kumplikadong teknolohiya sa Monero, ang mambabasa ay mangangailangan ng pangunahing kaalaman sa disenyo ng blockchain na ito at isang dumaan na kaalaman sa elliptic curve cryptography (upang mapahusay ang kaalamang ito, maaari mong basahin ang mga unang kabanata ng aming nakaraang artikulo tungkol sa
RingCT protocol
Isa sa mga posibleng pag-atake sa cryptonote currency ay ang pagsusuri ng blockchain batay sa kaalaman sa halaga at oras ng ipinadalang transaksyon. Ito ay nagpapahintulot
Kapansin-pansin na ang ideya ng pagtatago ng mga halaga ay hindi bago. Ang developer ng Bitcoin Core na si Greg Maxwell ay isa sa mga unang naglarawan nito sa kanyang
Sa iba pang mga bagay, ang protocol ay nakakatulong na mapupuksa ang mga problema sa paghahalo ng mga output ng alikabok - mga output ng isang maliit na halaga (karaniwang natatanggap sa anyo ng pagbabago mula sa mga transaksyon), na lumikha ng higit pang mga problema kaysa sa halaga nito.
Noong Enero 2017, naganap ang isang hard fork ng Monero network, na nagpapahintulot sa opsyonal na paggamit ng mga kumpidensyal na transaksyon. At noong Setyembre ng parehong taon, kasama ang bersyon 6 na hard fork, ang mga naturang transaksyon ay naging tanging pinapayagan sa network.
Gumagamit ang RingCT ng ilang mekanismo nang sabay-sabay: multilayered linked spontaneous anonymous na mga signature ng grupo (Multilayered Linkable Spontaneous Anonymous Group Signature, pagkatapos nito ay tinutukoy bilang MLSAG), isang scheme ng pangako (Pedersen Commitments) at range proof (ang terminong ito ay walang itinatag na pagsasalin sa Russian) .
Ang RingCT protocol ay nagpapakilala ng dalawang uri ng mga hindi kilalang transaksyon: simple at buo. Ang wallet ay bumubuo ng una kapag ang isang transaksyon ay gumagamit ng higit sa isang input, ang pangalawa - sa kabaligtaran na sitwasyon. Magkaiba ang mga ito sa pagpapatunay ng mga halaga ng transaksyon at ang data na nilagdaan gamit ang isang pirma ng MLSAG (pag-uusapan pa natin ito sa ibaba). Bukod dito, ang mga transaksyon ng buong uri ay maaaring mabuo sa anumang bilang ng mga input, walang pangunahing pagkakaiba. Nasa libro
lagda ng MLSAG
Tandaan natin kung ano ang mga naka-sign na input ng transaksyon. Ang bawat transaksyon ay gumagastos at bumubuo ng ilang mga pondo. Ang pagbuo ng mga pondo ay nangyayari sa pamamagitan ng paglikha ng mga output ng transaksyon (isang direktang pagkakatulad ay mga bill), at ang output na ginagastos ng transaksyon (pagkatapos ng lahat, sa totoong buhay ay gumugugol tayo ng mga banknotes) ay nagiging input (mag-ingat, napakadaling malito. dito).
Ang isang input ay nagre-refer ng maraming mga output, ngunit gumagastos lamang ng isa, kaya lumilikha ng isang "smokescreen" upang maging mahirap na suriin ang kasaysayan ng pagsasalin. Kung ang isang transaksyon ay may higit sa isang input, kung gayon ang gayong istraktura ay maaaring katawanin bilang isang matrix, kung saan ang mga hilera ay ang mga input at ang mga haligi ay ang mga halo-halong output. Upang patunayan sa network na ang transaksyon ay gumagastos nang eksakto sa mga output nito (alam ang kanilang mga sikretong key), ang mga input ay nilagdaan gamit ang isang ring signature. Ang gayong lagda ay ginagarantiyahan na alam ng lumagda ang mga lihim na susi para sa lahat ng elemento ng alinman sa mga column.
Ang mga kumpidensyal na transaksyon ay hindi na gumagamit ng mga klasiko
Ang mga ito ay tinatawag na multilayer dahil pumirma sila ng ilang mga input nang sabay-sabay, ang bawat isa ay halo-halong iba pa, ibig sabihin, isang matrix ang nilagdaan, at hindi isang hilera. Gaya ng makikita natin sa ibang pagkakataon, nakakatulong ito na makatipid sa laki ng lagda.
Tingnan natin kung paano nabuo ang isang ring signature, gamit ang halimbawa ng isang transaksyon na gumagastos ng 2 totoong output at gumagamit ng m - 1 random na mga mula sa blockchain para sa paghahalo. Tukuyin natin ang mga pampublikong susi ng mga output na ginagastos natin bilang
, at mga pangunahing larawan para sa kanila nang naaayon: Kaya, nakakakuha kami ng isang matrix ng laki 2 x m. Una, kailangan nating kalkulahin ang tinatawag na mga hamon para sa bawat pares ng mga output:
Sinisimulan namin ang mga kalkulasyon gamit ang mga output, na ginagastos namin gamit ang kanilang mga pampublikong key:at mga random na numeroBilang resulta, nakukuha namin ang mga sumusunod na halaga:
, na ginagamit namin upang kalkulahin ang hamon
ang susunod na pares ng mga output (upang gawing mas madaling maunawaan kung ano ang pinapalitan namin kung saan, na-highlight namin ang mga halagang ito sa iba't ibang kulay). Ang lahat ng mga sumusunod na halaga ay kinakalkula sa isang bilog gamit ang mga formula na ibinigay sa unang paglalarawan. Ang huling bagay na kalkulahin ay ang hamon para sa isang pares ng mga tunay na output.
Tulad ng nakikita natin, ang lahat ng mga column maliban sa isa na naglalaman ng mga tunay na output ay gumagamit ng mga random na nabuong numero. Para sa Ο- column kakailanganin din natin sila. Magtransform tayosa s:
Ang pirma mismo ay isang tuple ng lahat ng mga halagang ito:
Ang data na ito ay isinusulat sa isang transaksyon.
Tulad ng nakikita natin, ang MLSAG ay naglalaman lamang ng isang hamon c0, na nagpapahintulot sa iyo na makatipid sa laki ng lagda (na nangangailangan na ng maraming espasyo). Dagdag pa, sinumang inspektor, gamit ang data, nire-restore ang mga value na c1,..., cm at sinusuri iyon. Kaya, ang aming singsing ay sarado at ang pirma ay na-verify.
Para sa mga transaksyong RingCT ng buong uri, isa pang linya ang idinaragdag sa matrix na may magkakahalong output, ngunit pag-uusapan natin ito sa ibaba.
Mga Pangako ng Pedersen
Ginagamit ang mga pangako ng Monero upang itago ang mga halaga ng paglilipat at gamitin ang pinakakaraniwang opsyon - Mga pangako sa Pedersen. Sa pamamagitan ng paraan, isang kagiliw-giliw na katotohanan - sa una iminungkahi ng mga developer na itago ang mga halaga sa pamamagitan ng ordinaryong paghahalo, iyon ay, pagdaragdag ng mga output para sa mga di-makatwirang halaga upang ipakilala ang kawalan ng katiyakan, ngunit pagkatapos ay lumipat sila sa mga pangako (hindi ito isang katotohanan na sila ay naka-save sa ang laki ng transaksyon, tulad ng makikita natin sa ibaba).
Sa pangkalahatan, ganito ang hitsura ng commitment:
saan C - ang kahulugan ng pangako mismo, a - nakatagong halaga, H ay isang nakapirming punto sa elliptic curve (karagdagang generator), at x β ilang uri ng di-makatwirang maskara, isang salik na nagtatago na nabuo nang random. Kailangan ang maskara dito para hindi basta-basta mahulaan ng third party ang halaga ng commitment.
Kapag nabuo ang isang bagong output, kinakalkula ng wallet ang pangako para dito, at kapag ginastos, kukuha ito ng halaga na nakalkula sa panahon ng pagbuo o muling kinakalkula ito, depende sa uri ng transaksyon.
RingCT simple
Sa kaso ng mga simpleng transaksyon sa RingCT, upang matiyak na ang transaksyon ay lumikha ng mga output sa isang halaga na katumbas ng halaga ng mga input (hindi gumawa ng pera mula sa manipis na hangin), ito ay kinakailangan na ang kabuuan ng mga pangako ng una at pangalawang ang mga ito ay pareho, iyon ay:
Itinuturing ito ng mga komisyon ng pangako na medyo naiiba - nang walang maskara:
Saan a β ang halaga ng komisyon, ito ay magagamit sa publiko.
Ang diskarte na ito ay nagbibigay-daan sa amin upang patunayan sa umaasa na partido na gumagamit kami ng parehong mga halaga nang hindi ibinubunyag ang mga ito.
Upang gawing mas malinaw ang mga bagay, tingnan natin ang isang halimbawa. Sabihin nating ang isang transaksyon ay gumagastos ng dalawang output (ibig sabihin, nagiging input ang mga ito) ng 10 at 5 XMR at bumubuo ng tatlong output na nagkakahalaga ng 12 XMR: 3, 4 at 5 XMR. Kasabay nito, nagbabayad siya ng komisyon na 3 XMR. Kaya, ang halaga ng perang ginastos kasama ang halagang nabuo at ang komisyon ay katumbas ng 15 XMR. Subukan nating kalkulahin ang mga pangako at tingnan ang pagkakaiba sa kanilang mga halaga (tandaan ang matematika):
Dito makikita natin na para magtagpo ang equation, kailangan natin ang mga kabuuan ng input at output mask upang maging pareho. Para magawa ito, random na bumubuo ang wallet x1, y1, y2 at y3, at ang natitira x2 kinakalkula tulad nito:
Gamit ang mga maskara na ito, mapapatunayan namin sa sinumang verifier na hindi kami nakakagawa ng mas maraming pondo kaysa sa ginagastos namin, nang hindi ibinubunyag ang halaga. Orihinal, tama ba?
Puno ang RingCT
Sa buong mga transaksyon sa RingCT, ang pagsuri sa mga halaga ng paglilipat ay medyo mas masalimuot. Sa mga transaksyong ito, hindi muling kinakalkula ng wallet ang mga pangako para sa mga input, ngunit ginagamit ang mga nakalkula noong nabuo ang mga ito. Sa kasong ito, dapat nating ipagpalagay na hindi na natin makukuha ang pagkakaiba sa mga kabuuan na katumbas ng zero, ngunit sa halip:
Dito z β pagkakaiba sa pagitan ng input at output mask. Kung ating isasaalang-alang zG bilang isang pampublikong susi (kung saan ito ay de facto), kung gayon z ay ang pribadong susi. Kaya, alam natin ang pampubliko at kaukulang pribadong mga susi. Gamit ang data na ito, magagamit natin ito sa MLSAG ring signature kasama ang mga pampublikong key ng mga output na pinaghalo:
Kaya, titiyakin ng valid na ring signature na alam natin ang lahat ng pribadong key ng isa sa mga column, at malalaman lang natin ang pribadong key sa huling row kung ang transaksyon ay hindi nakakabuo ng mas maraming pondo kaysa sa ginagastos nito. Sa pamamagitan ng paraan, narito ang sagot sa tanong na "bakit hindi humantong sa zero ang pagkakaiba sa mga halaga ng mga pangako" - kung zG = 0, pagkatapos ay palawakin namin ang column na may mga tunay na output.
Paano malalaman ng tatanggap ng pondo kung magkano ang pera na ipinadala sa kanya? Ang lahat ay simple dito - ang nagpadala ng transaksyon at ang tatanggap ay nagpapalitan ng mga key gamit ang Diffie-Hellman protocol, gamit ang transaction key at ang view key ng tatanggap at kalkulahin ang ibinahaging lihim. Ang nagpadala ay nagsusulat ng data tungkol sa mga halaga ng output, na naka-encrypt gamit ang nakabahaging key na ito, sa mga espesyal na larangan ng transaksyon.
Mga patunay ng saklaw
Ano ang mangyayari kung gumamit ka ng negatibong numero bilang halaga sa mga commitment? Ito ay maaaring humantong sa pagbuo ng karagdagang mga barya! Ang kinalabasan na ito ay hindi katanggap-tanggap, kaya kailangan naming garantiya na ang mga halagang ginagamit namin ay hindi negatibo (nang hindi ibinubunyag ang mga halagang ito, siyempre, kung hindi man ay napakaraming trabaho at lahat ay walang kabuluhan). Sa madaling salita, dapat nating patunayan na ang kabuuan ay nasa pagitan [0, 2n - 1].
Upang gawin ito, ang kabuuan ng bawat output ay nahahati sa binary digit at ang commitment ay kinakalkula para sa bawat digit nang hiwalay. Mas mainam na makita kung paano ito nangyayari sa isang halimbawa.
Ipagpalagay natin na ang ating mga halaga ay maliit at magkasya sa 4 na bits (sa pagsasagawa ito ay 64 bits), at gumawa tayo ng output na nagkakahalaga ng 5 XMR. Kinakalkula namin ang mga commitment para sa bawat kategorya at ang kabuuang commitment para sa buong halaga:
Susunod, ang bawat pangako ay hinaluan ng isang kahalili (Ci-2iH) at nilagdaan nang magkapares sa Borromeo ring signature (isa pang ring signature), na iminungkahi ni Greg Maxwell noong 2015 (maaari kang magbasa nang higit pa tungkol dito
Kung sama-sama, ito ay tinatawag na range proof at nagbibigay-daan sa iyong matiyak na ang mga commitment ay gumagamit ng mga halaga sa range [0, 2n - 1].
Ano ang susunod?
Sa kasalukuyang pagpapatupad, ang mga range proof ay tumatagal ng maraming espasyo - 6176 bytes bawat output. Ito ay humahantong sa mas malalaking transaksyon at samakatuwid ay mas mataas na mga bayarin. Upang bawasan ang laki ng isang transaksyon sa Monero, ang mga developer ay nagpapakilala ng mga bulletproof sa halip na mga pirma ng Borromeo - isang range proof na mekanismo na walang bitwise na mga pangako.
Itanong ang iyong mga katanungan, magmungkahi ng mga paksa para sa mga bagong artikulo tungkol sa mga teknolohiya sa larangan ng cryptocurrency, at mag-subscribe din sa aming grupo sa
Pinagmulan: www.habr.com