Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon

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.

Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon

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 multisignatures).

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 makabuluhang paliitin ang lugar ng paghahanap para sa mga paglabas ng interes sa umaatake. Upang maprotektahan laban sa naturang pagsusuri, nagpatupad si Monero ng isang anonymous na protocol ng transaksyon na ganap na nagtatago ng mga halaga ng paglilipat sa network.

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 artikulong Mga Kumpidensyal na Transaksyon. Ang kasalukuyang pagpapatupad ng RingCT ay ang pagbabago nito na may posibilidad na gumamit ng mga pirma ng singsing (kung wala man ang mga ito), at sa gayon nakuha nito ang pangalan nito - Ring Confidential Transactions.

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 "Zero hanggang Monero" Kaugnay nito, sinasabing ang desisyon na limitahan ang buong transaksyon sa isang input ay ginawa nang madalian at maaaring magbago sa hinaharap.

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 cryptonote mga pirma ng singsing, pinalitan sila ng MLSAG - isang bersyon ng mga katulad na single-layer na mga lagda ng singsing na inangkop para sa maraming input, LSAG.

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
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon, at mga pangunahing larawan para sa kanila nang naaayon: Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon 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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
Sinisimulan namin ang mga kalkulasyon gamit ang mga output, na ginagastos namin gamit ang kanilang mga pampublikong key:Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonat mga random na numeroMga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonBilang resulta, nakukuha namin ang mga sumusunod na halaga:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon, na ginagamit namin upang kalkulahin ang hamon
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonang 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 numeroMga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon. Para sa Ο€- column kakailanganin din natin sila. Magtransform tayoMga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonsa s:Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
Ang pirma mismo ay isang tuple ng lahat ng mga halagang ito:

Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon

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 dataMga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon, nire-restore ang mga value na c1,..., cm at sinusuri iyonMga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon. 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

Mga scheme ng obligasyon (mas madalas na ginagamit ang terminong English na commitments) upang mapatunayan ng isang partido na alam nila ang isang tiyak na lihim (numero) nang hindi ito ibinubunyag. Halimbawa, gumulong ka ng isang tiyak na numero sa dice, isaalang-alang ang pangako at ipapasa ito sa nagve-verify na partido. Kaya, sa sandaling isiwalat ang lihim na numero, independiyenteng kinakalkula ng verifier ang pangako, sa gayon ay tinitiyak na hindi mo siya nilinlang.

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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonsaan 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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
Itinuturing ito ng mga komisyon ng pangako na medyo naiiba - nang walang maskara:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonSaan 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):

Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
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:
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
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:Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyon
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 dito):
Mga kumpidensyal na transaksyon sa Monero, o kung paano ilipat ang mga hindi kilalang bagay sa hindi kilalang mga destinasyonKung 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. Ayon sa ilang mga pagtatantya, nagagawa nilang bawasan ang laki ng range proof ng hanggang 94%. Sa pamamagitan ng paraan, sa kalagitnaan ng Hulyo ang teknolohiya ay lumipas pag-audit mula sa Kudelski Security, na hindi nagpahayag ng anumang makabuluhang pagkukulang alinman sa teknolohiya mismo o sa pagpapatupad nito. Ang teknolohiya ay ginagamit na sa pagsubok na network, at sa bagong hard fork, maaari itong lumipat sa pangunahing network.

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 Facebookupang manatiling napapanahon sa aming mga kaganapan at publikasyon.

Pinagmulan: www.habr.com

Magdagdag ng komento