Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií

Pokračujeme v našej sérii o blockchaine Monero a dnešný článok sa zameria na protokol RingCT (Ring Confidential Transactions), ktorý zavádza dôverné transakcie a nové kruhové podpisy. Bohužiaľ, na internete je málo informácií o tom, ako to funguje a my sme sa snažili túto medzeru vyplniť.

Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií

Povieme si o tom, ako sieť pomocou tohto protokolu ukrýva čiastky prenosu, prečo upustili od klasických kryptonotechnových kruhových podpisov a ako sa bude táto technológia ďalej rozvíjať.

Keďže tento protokol je jednou z najkomplexnejších technológií v Monero, čitateľ bude potrebovať základné znalosti o dizajne tohto blockchainu a prechodné znalosti kryptografie eliptických kriviek (na oprášenie týchto znalostí si môžete prečítať prvé kapitoly nášho predchádzajúci článok o viacnásobné podpisy).

RingCT protokol

Jedným z možných útokov na meny kryptonote je blockchain analýza založená na znalosti množstva a času odoslanej transakcie. Toto povoľuje výrazne zúžiť oblasť hľadania východov, ktoré sú pre útočníka zaujímavé. Na ochranu pred takouto analýzou spoločnosť Monero implementovala anonymný transakčný protokol, ktorý úplne skrýva množstvo prenosov v sieti.

Stojí za zmienku, že myšlienka skrývania súm nie je nová. Vývojár bitcoinového jadra Greg Maxwell bol jedným z prvých, ktorí to opísali vo svojom článok Dôverné transakcie. Súčasnou implementáciou RingCT je jeho modifikácia s možnosťou využitia ring podpisov (či už bez nich) a podľa toho dostal aj svoj názov – Ring Confidential Transactions.

Protokol okrem iného pomáha zbaviť sa problémov s miešaním prachových výstupov – výstupov malého množstva (zvyčajne prijatých vo forme zmeny z transakcií), ktoré narobili viac problémov, ako stáli.

V januári 2017 sa uskutočnil hard fork siete Monero, ktorý umožňuje voliteľné používanie dôverných transakcií. A už v septembri toho istého roku s hard forkom verzie 6 sa takéto transakcie stali jedinými povolenými v sieti.

RingCT využíva niekoľko mechanizmov naraz: viacvrstvové prepojené spontánne anonymné skupinové podpisy (Multilayered Linkable Spontaneous Anonymous Group Signature, ďalej len MLSAG), schému záväzkov (Pedersen Commitments) a rozsahové dôkazy (tento výraz nemá zavedený preklad do ruštiny) .

Protokol RingCT zavádza dva typy anonymných transakcií: jednoduché a úplné. Peňaženka generuje prvý, keď transakcia používa viac ako jeden vstup, druhý - v opačnej situácii. Líšia sa vo validácii súm transakcií a údajov podpísaných podpisom MLSAG (o tom si povieme viac nižšie). Navyše, transakcie typu full môžu byť generované s ľubovoľným počtom vstupov, nie je v tom žiadny zásadný rozdiel. V knihe "Z nuly na Monero" V tejto súvislosti sa hovorí, že rozhodnutie obmedziť plné transakcie na jeden vstup bolo urobené unáhlene a v budúcnosti sa môže zmeniť.

Podpis MLSAG

Pripomeňme si, čo sú podpísané transakčné vstupy. Každá transakcia míňa a vytvára určité prostriedky. K generovaniu prostriedkov dochádza vytváraním transakčných výstupov (priama analógia sú účty) a výstup, ktorý transakcia minie (napokon v reálnom živote míňame bankovky), sa stáva vstupom (pozor, je veľmi ľahké sa zmiasť tu).

Vstup odkazuje na viacero výstupov, no minie iba jeden, čím sa vytvorí „dymová clona“, ktorá sťažuje analýzu histórie prekladov. Ak má transakcia viac ako jeden vstup, potom môže byť takáto štruktúra reprezentovaná ako matica, kde riadky sú vstupy a stĺpce sú zmiešané výstupy. Aby sa sieti dokázalo, že transakcia vynakladá presne svoje výstupy (pozná ich tajné kľúče), sú vstupy podpísané kruhovým podpisom. Takýto podpis zaručuje, že podpisovateľ poznal tajné kľúče pre všetky prvky ktoréhokoľvek zo stĺpcov.

Dôverné transakcie už nepoužívajú klasické kryptonote kruhové podpisy, boli nahradené MLSAG - verziou podobných jednovrstvových kruhových podpisov prispôsobených pre viacero vstupov, LSAG.

Nazývajú sa viacvrstvové, pretože podpisujú niekoľko vstupov naraz, z ktorých každý je zmiešaný s niekoľkými ďalšími, t.j. je podpísaná matica a nie jeden riadok. Ako uvidíme neskôr, pomáha to ušetriť na veľkosti podpisu.

Pozrime sa na to, ako vzniká kruhový podpis, na príklade transakcie, ktorá minie 2 reálne výstupy a na zmiešanie používa m - 1 náhodný z blockchainu. Označme verejné kľúče výstupov, ktoré minieme ako
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciía podľa toho kľúčové obrázky: Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií Tak dostaneme maticu veľkosti 2 x m. Najprv musíme vypočítať takzvané výzvy pre každú dvojicu výstupov:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Výpočty začíname s výstupmi, ktoré minieme pomocou ich verejných kľúčov:Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciía náhodné číslaDôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciíV dôsledku toho dostaneme nasledujúce hodnoty:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií, ktorý používame na výpočet výzvy
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciíďalšia dvojica výstupov (aby sme uľahčili pochopenie toho, čo kde nahrádzame, tieto hodnoty sme zvýraznili rôznymi farbami). Všetky nasledujúce hodnoty sa vypočítajú v kruhu pomocou vzorcov uvedených na prvom obrázku. Posledná vec na výpočet je výzva na dvojicu reálnych výstupov.

Ako vidíme, všetky stĺpce okrem toho, ktorý obsahuje reálne výstupy, používajú náhodne generované číslaDôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií. Pre π- stĺpec budeme ich tiež potrebovať. Poďme sa transformovaťDôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciív s:Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Samotný podpis je n-ticou všetkých týchto hodnôt:

Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií

Tieto údaje sa potom zapíšu do transakcie.

Ako vidíme, MLSAG obsahuje iba jednu výzvu c0, čo vám umožňuje ušetriť na veľkosti podpisu (ktorý už vyžaduje veľa miesta). Ďalej každý inšpektor, ktorý používa údajeDôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií, obnoví hodnoty c1,…, cm a skontroluje toDôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií. Tým je náš krúžok uzavretý a podpis je overený.

Pre transakcie RingCT plného typu sa do matice so zmiešanými výstupmi pridá ešte jeden riadok, ale o tom si povieme nižšie.

Pedersenove záväzky

Povinné schémy (častejšie sa používa anglický výraz záväzky) sa používajú preto, aby jedna strana dokázala, že pozná určité tajomstvo (číslo) bez toho, aby ho skutočne prezradila. Napríklad hodíte na kocke určité číslo, zvážite záväzok a postúpite ho overujúcej strane. Overovateľ teda v momente zverejnenia tajného čísla nezávisle vypočíta záväzok, čím sa uistí, že ste ho neoklamali.

Monero záväzky slúžia na skrytie súm prevodov a využívajú sa najbežnejšia možnosť – záväzky Pedersen. Mimochodom, zaujímavý fakt - najprv vývojári navrhovali skryť sumy obyčajným miešaním, teda pridávať výstupy za ľubovoľné sumy, aby vniesli neistotu, ale potom prešli na záväzky (nie je fakt, že ušetrili na veľkosť transakcie, ako uvidíme nižšie).
Vo všeobecnosti záväzok vyzerá takto:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciíkde C — samotný význam záväzku, a - skryté množstvo, H je pevný bod na eliptickej krivke (prídavný generátor), a x — nejaký druh ľubovoľnej masky, náhodne generovaný krycí faktor. Maska je tu potrebná, aby tretia strana nemohla jednoducho odhadnúť hodnotu záväzku.

Keď sa vygeneruje nový výstup, peňaženka zaň vypočíta záväzok a keď sa minie, vezme buď hodnotu vypočítanú počas generovania, alebo ju prepočíta v závislosti od typu transakcie.

RingCT jednoduché

V prípade jednoduchých transakcií RingCT, aby sa zabezpečilo, že transakcia vytvorila výstupy rovnajúce sa množstvu vstupov (nevyrobila peniaze z ničoho), je potrebné, aby súčet záväzkov prvého a druhého bol to isté, teda:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Záväzkové komisie to berú trochu inak – bez masky:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciíKde a — výška provízie, je verejne dostupná.

Tento prístup nám umožňuje dôveryhodnej strane dokázať, že používame rovnaké sumy bez toho, aby sme ich zverejnili.

Aby to bolo jasnejšie, pozrime sa na príklad. Povedzme, že transakcia minie dva výstupy (čo znamená, že sa stanú vstupmi) 10 a 5 XMR a vygeneruje tri výstupy v hodnote 12 XMR: 3, 4 a 5 XMR. Zároveň zaplatí províziu 3 XMR. Množstvo vynaložených peňazí plus vygenerovaná suma a provízia sa teda rovná 15 XMR. Skúsme si vypočítať záväzky a pozrieť sa na rozdiel v ich sumách (pamätajte na matematiku):

Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Tu vidíme, že na to, aby rovnica konvergovala, potrebujeme, aby súčty vstupnej a výstupnej masky boli rovnaké. Za týmto účelom peňaženka generuje náhodne x1, y1, y2 a y3a zvyšok x2 počíta takto:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Pomocou týchto masiek môžeme každému overovateľovi dokázať, že negenerujeme viac prostriedkov, ako minieme, bez toho, aby sme zverejnili sumu. Originál, však?

RingCT plné

V úplných transakciách RingCT je kontrola súm prevodu trochu zložitejšia. Pri týchto transakciách peňaženka neprepočítava záväzky na vstupy, ale používa tie, ktoré boli vypočítané pri ich vygenerovaní. V tomto prípade musíme predpokladať, že rozdiel v sumách už nedostaneme rovný nule, ale namiesto toho:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Tu z — rozdiel medzi vstupnou a výstupnou maskou. Ak uvažujeme zG ako verejný kľúč (čím de facto je), teda z je súkromný kľúč. Poznáme teda verejné a zodpovedajúce súkromné ​​kľúče. S týmito údajmi ich môžeme použiť v kruhovom podpise MLSAG spolu s verejnými kľúčmi zmiešaných výstupov:
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Platný vyzváňací podpis teda zabezpečí, že poznáme všetky súkromné ​​kľúče jedného zo stĺpcov a súkromný kľúč v poslednom riadku môžeme poznať len vtedy, ak transakcia nevygeneruje viac prostriedkov, ako minie. Mimochodom, tu je odpoveď na otázku „prečo rozdiel vo výške záväzkov nevedie k nule“ – ak zG = 0, potom stĺpec rozšírime o reálne výstupy.

Ako príjemca prostriedkov vie, koľko peňazí mu bolo poslaných? Všetko je tu jednoduché - odosielateľ transakcie a príjemca si vymenia kľúče pomocou protokolu Diffie-Hellman, pomocou transakčného kľúča a kľúča zobrazenia príjemcu a vypočítajú zdieľané tajomstvo. Odosielateľ zapíše údaje o výstupných sumách zašifrované týmto zdieľaným kľúčom do špeciálnych polí transakcie.

Dôkazy rozsahu

Čo sa stane, ak ako sumu v záväzkoch použijete záporné číslo? To môže viesť ku generovaniu ďalších mincí! Tento výsledok je neprijateľný, takže musíme zaručiť, že sumy, ktoré používame, nie sú záporné (samozrejme bez zverejnenia týchto súm, inak je toľko práce a všetko márne). Inými slovami, musíme dokázať, že súčet je v intervale [0, 2n - 1].

Na tento účel sa súčet každého výstupu rozdelí na binárne číslice a záväzok sa vypočíta pre každú číslicu samostatne. Je lepšie vidieť, ako sa to deje na príklade.

Predpokladajme, že naše sumy sú malé a zmestia sa do 4 bitov (v praxi je to 64 bitov) a vytvoríme výstup v hodnote 5 XMR. Vypočítame záväzky pre každú kategóriu a celkový záväzok pre celú sumu:Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destinácií
Ďalej je každý záväzok zmiešaný s náhradou (Ci-2iH) a je podpísaný v pároch s boromejským prsteňovým podpisom (ďalší prsteňový podpis), ktorý navrhol Greg Maxwell v roku 2015 (viac si o ňom môžete prečítať tu):
Dôverné transakcie v Monero, alebo ako preniesť neznáme veci do neznámych destináciíCelkovo sa to nazýva dôkaz o rozsahu a umožňuje vám zabezpečiť, aby záväzky používali sumy v rozsahu [0, 2n - 1].

Čo bude ďalej?

V súčasnej implementácii zaberajú dôkazy rozsahu veľa miesta – 6176 bajtov na výstup. To vedie k väčším transakciám a tým aj vyšším poplatkom. Aby sa zmenšila veľkosť transakcie Monero, vývojári zavádzajú nepriestrelné namiesto podpisov Borromeo – mechanizmus na overenie rozsahu bez bitových záväzkov. Podľa niektorých odhadov, sú schopné zmenšiť veľkosť dôkazu dosahu až o 94%. Mimochodom, v polovici júla technika prešla audit od Kudelski Security, ktorá neodhalila žiadne výrazné nedostatky ani v samotnej technológii, ani v jej implementácii. Technológia sa už používa v testovacej sieti a s novým hard forkom sa pravdepodobne môže presunúť do hlavnej siete.

Pýtajte sa, navrhujte témy pre nové články o technológiách v oblasti kryptomien a tiež sa prihláste na odber našej skupiny v facebookaby ste boli informovaní o našich udalostiach a publikáciách.

Zdroj: hab.com

Pridať komentár