Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací

Pokračujeme v naší sérii o blockchainu Monero a dnešní článek se zaměří na protokol RingCT (Ring Confidential Transactions), který zavádí důvěrné transakce a nové kruhové podpisy. Bohužel je na internetu málo informací o tom, jak to funguje, a my jsme se snažili tuto mezeru vyplnit.

Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací

Povíme si o tom, jak síť skrývá přenosové částky pomocí tohoto protokolu, proč upustili od klasických kryptonových prstenových podpisů a jak se bude tato technologie dále vyvíjet.

Vzhledem k tomu, že tento protokol je jednou z nejsložitějších technologií v Monero, bude čtenář potřebovat základní znalosti o návrhu tohoto blockchainu a průběžnou znalost kryptografie eliptických křivek (abyste si tyto znalosti oprášili, můžete si přečíst první kapitoly našeho předchozí článek o více podpisů).

protokol RingCT

Jedním z možných útoků na měny kryptonote je blockchain analýza založená na znalosti množství a času odeslané transakce. To dovoluje výrazně zúží oblast hledání východů, které jsou pro útočníka zajímavé. Na ochranu před takovou analýzou společnost Monero implementovala anonymní transakční protokol, který zcela skrývá množství přenosů v síti.

Stojí za zmínku, že myšlenka skrývat částky není nová. Vývojář Bitcoin Core Greg Maxwell byl jedním z prvních, kdo to ve svém popsal článek Důvěrné transakce. Současnou implementací RingCT je jeho modifikace s možností využití ring signatures (ať už bez nich), a tak dostal svůj název – Ring Confidential Transactions.

Protokol mimo jiné pomáhá zbavit se problémů s směšováním prachových výstupů - výstupů malého množství (obvykle přijatých ve formě změn z transakcí), které nadělaly více problémů, než stály.

V lednu 2017 proběhl hard fork sítě Monero, který umožňuje volitelné použití důvěrných transakcí. A již v září téhož roku se s hard forkem verze 6 staly takové transakce jedinými povolenými v síti.

RingCT používá několik mechanismů najednou: vícevrstvé propojené spontánní anonymní skupinové podpisy (Multilayered Linkable Spontaneous Anonymous Group Signature, dále jen MLSAG), schéma závazků (Pedersen Commitments) a rozsahové důkazy (tento termín nemá zavedený překlad do ruštiny) .

Protokol RingCT zavádí dva typy anonymních transakcí: jednoduché a úplné. Peněženka generuje první, když transakce používá více než jeden vstup, druhý - v opačné situaci. Liší se validací částek transakce a dat podepsaných podpisem MLSAG (o tom si povíme více níže). Navíc transakce typu full lze generovat s libovolným počtem vstupů, není v tom žádný zásadní rozdíl. V knize "Z nuly na Monero" V tomto ohledu prý bylo rozhodnutí omezit plné transakce na jeden vstup učiněno ve spěchu a v budoucnu se může změnit.

Podpis MLSAG

Připomeňme si, co jsou podepsané transakční vstupy. Každá transakce utrácí a vytváří určité prostředky. Ke generování prostředků dochází vytvářením transakčních výstupů (přímá analogie jsou účty) a výstup, který transakce utrácí (koneckonců v reálném životě utrácíme bankovky), se stává vstupem (pozor, je velmi snadné se splést tady).

Vstup odkazuje na více výstupů, ale spotřebovává pouze jeden, čímž vytváří „kouřovou clonu“, která ztěžuje analýzu historie překladů. Pokud má transakce více než jeden vstup, pak lze takovou strukturu reprezentovat jako matici, kde řádky jsou vstupy a sloupce jsou smíšené výstupy. Aby bylo možné síti prokázat, že transakce vynakládá přesně své výstupy (zná jejich tajné klíče), jsou vstupy podepsány kruhovým podpisem. Takový podpis zaručuje, že podepisující znal tajné klíče pro všechny prvky kteréhokoli ze sloupců.

Důvěrné transakce již nepoužívají klasické cryptonote kruhové podpisy, byly nahrazeny MLSAG - verzí podobných jednovrstvých kruhových podpisů přizpůsobených pro více vstupů, LSAG.

Říká se jim vícevrstvé, protože podepisují několik vstupů najednou, z nichž každý je smíchán s několika dalšími, tj. je podepsána matice, nikoli jeden řádek. Jak uvidíme později, pomáhá to ušetřit na velikosti podpisu.

Podívejme se na to, jak se tvoří kruhový podpis, na příkladu transakce, která utratí 2 skutečné výstupy a použije m - 1 náhodných z blockchainu pro smíchání. Označme veřejné klíče výstupů, které utrácíme jako
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacía podle toho klíčové obrázky: Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací Získáme tak matici velikosti 2 x m. Nejprve musíme vypočítat takzvané výzvy pro každou dvojici výstupů:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Výpočty začínáme s výstupy, které vynakládáme pomocí jejich veřejných klíčů:Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacía náhodná číslaDůvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacíV důsledku toho získáme následující hodnoty:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací, který používáme k výpočtu výzvy
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacídalší dvojici výstupů (pro snazší pochopení toho, co kde dosazujeme, jsme tyto hodnoty zvýraznili různými barvami). Všechny následující hodnoty se počítají v kruhu pomocí vzorců uvedených na prvním obrázku. Poslední věcí, kterou je třeba počítat, je výzva pro dvojici reálných výstupů.

Jak vidíme, všechny sloupce kromě toho, který obsahuje reálné výstupy, používají náhodně generovaná číslaDůvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací. Pro π- sloupec budeme je také potřebovat. Pojďme se transformovatDůvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacíza s:Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Samotný podpis je n-ticí všech těchto hodnot:

Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací

Tato data jsou poté zapsána do transakce.

Jak vidíme, MLSAG obsahuje pouze jednu výzvu c0, což umožňuje ušetřit na velikosti podpisu (který již vyžaduje hodně místa). Dále každý inspektor, který data používáDůvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací, obnoví hodnoty c1,…, cm a zkontroluje toDůvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací. Tím je náš kroužek uzavřen a podpis ověřen.

Pro transakce RingCT plného typu se do matice se smíšenými výstupy přidá ještě jeden řádek, ale o tom si povíme níže.

Závazky společnosti Pedersen

Závazková schémata (častěji se používá anglický výraz závazky) se používají proto, aby jedna strana mohla prokázat, že zná určité tajemství (číslo), aniž by ho skutečně prozradila. Například hodíte určitým číslem na kostce, zvážíte závazek a předáte jej ověřující straně. V okamžiku zveřejnění tajného čísla tedy ověřovatel samostatně vypočítá závazek, čímž se ujišťuje, že jste ho nepodvedli.

Závazky Monero slouží ke skrytí částek převodů a využívají nejběžnější možnost – závazky Pedersen. Mimochodem, zajímavý fakt - vývojáři nejprve navrhovali skrýt částky běžným mícháním, tedy přidávat výstupy za libovolné částky, aby vnesli nejistotu, ale pak přešli na závazky (není fakt, že ušetřili na velikost transakce, jak uvidíme níže).
Obecně platí, že závazek vypadá takto:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacíKde C — samotný význam závazku, a - skrytá částka, H je pevný bod na eliptické křivce (přídavný generátor) a x — nějaký druh libovolné masky, náhodně generovaný krycí faktor. Maska je zde potřebná, aby třetí strana nemohla jednoduše odhadnout hodnotu závazku.

Když je vygenerován nový výstup, peněženka pro něj vypočítá závazek, a když utratí, vezme buď hodnotu vypočítanou během generování, nebo ji přepočítá v závislosti na typu transakce.

RingCT jednoduché

V případě jednoduchých transakcí RingCT, aby bylo zajištěno, že transakce vytvořila výstupy rovnající se množství vstupů (neprodukovala peníze ze vzduchu), je nutné, aby součet závazků prvního a druhého byl totéž, tedy:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Závazkové komise to berou trochu jinak – bez masky:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacíKde a — výše provize, je veřejně dostupná.

Tento přístup nám umožňuje dokázat spoléhající se straně, že používáme stejné částky, aniž bychom je sdělovali.

Aby bylo vše jasnější, podívejme se na příklad. Řekněme, že transakce spotřebuje dva výstupy (což znamená, že se stanou vstupy) 10 a 5 XMR a generuje tři výstupy v hodnotě 12 XMR: 3, 4 a 5 XMR. Zároveň platí provizi 3 XMR. Množství utracených peněz plus vygenerovaná částka a provize se tedy rovná 15 XMR. Zkusme si spočítat závazky a podívat se na rozdíl v jejich částkách (vzpomeňte si na matematiku):

Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Zde vidíme, že aby rovnice konvergovala, potřebujeme, aby součty vstupní a výstupní masky byly stejné. K tomu peněženka generuje náhodně x1, y1, y2 a y3a zbývající x2 počítá takto:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Pomocí těchto masek můžeme každému ověřovateli dokázat, že negenerujeme více prostředků, než utratíme, aniž bychom sdělili částku. Originál, že?

RingCT plný

U úplných transakcí RingCT je kontrola převodových částek trochu složitější. V těchto transakcích peněženka nepřepočítává závazky pro vstupy, ale používá ty, které byly vypočteny při jejich generování. V tomto případě musíme předpokládat, že rozdíl v součtech již nedostaneme rovný nule, ale místo toho:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Zde z — rozdíl mezi vstupní a výstupní maskou. Pokud vezmeme v úvahu zG jako veřejný klíč (kterým de facto je), pak z je soukromý klíč. Známe tedy veřejné a odpovídající soukromé klíče. S těmito daty v ruce je můžeme použít v kruhovém podpisu MLSAG spolu s veřejnými klíči smíšených výstupů:
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Platný vyzváněcí podpis tedy zajistí, že známe všechny soukromé klíče jednoho ze sloupců a soukromý klíč v posledním řádku můžeme znát pouze v případě, že transakce nevygeneruje více prostředků, než vydá. Mimochodem, zde je odpověď na otázku „proč rozdíl ve výši závazků nevede k nule“ – pokud zG = 0, pak sloupec rozšíříme o reálné výstupy.

Jak příjemce prostředků ví, kolik peněz mu bylo zasláno? Vše je zde jednoduché - odesílatel transakce a příjemce si vymění klíče pomocí protokolu Diffie-Hellman, pomocí transakčního klíče a klíče zobrazení příjemce a vypočítají sdílené tajemství. Odesílatel zapisuje data o výstupních částkách zašifrovaných tímto sdíleným klíčem do speciálních polí transakce.

Důkazy rozsahu

Co se stane, když jako částku v závazcích použijete záporné číslo? To může vést ke generování dalších coinů! Tento výsledek je nepřijatelný, takže musíme zaručit, že částky, které používáme, nejsou záporné (samozřejmě bez zveřejnění těchto částek, jinak je tolik práce a vše je marné). Jinými slovy, musíme dokázat, že součet je v intervalu [0, 2n - 1].

K tomu se součet každého výstupu rozdělí na binární číslice a závazek se vypočítá pro každou číslici zvlášť. Je lepší vidět, jak se to děje na příkladu.

Předpokládejme, že naše částky jsou malé a vejdou se do 4 bitů (v praxi je to 64 bitů), a vytvoříme výstup v hodnotě 5 XMR. Vypočítáme závazky pro každou kategorii a celkový závazek pro celou částku:Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinací
Dále je každý závazek smíchán se surogátem (Ci-2iH) a je podepsána ve dvojicích s boromejským prstenovým podpisem (další prstenový podpis), který navrhl Greg Maxwell v roce 2015 (můžete si o něm přečíst více zde):
Důvěrné transakce v Monero aneb jak převést neznámé věci do neznámých destinacíDohromady se tomu říká range proof a umožňuje vám zajistit, aby závazky využívaly částky v rozsahu [0, 2n - 1].

Co bude dál?

V současné implementaci zabírají důkazy rozsahu hodně místa – 6176 bajtů na výstup. To vede k větším transakcím a tedy vyšším poplatkům. Aby se zmenšila velikost transakce Monero, zavádějí vývojáři neprůstřelné místo podpisů Borromeo – mechanismus pro ověření rozsahu bez bitových závazků. Podle některých odhadů, jsou schopny zmenšit velikost dosahu až o 94 %. Mimochodem, v polovině července technika prošla аудит od Kudelski Security, která neodhalila žádné výrazné nedostatky ani v samotné technologii, ani v její implementaci. Technologie se již používá v testovací síti a s novým hard forkem se pravděpodobně může přesunout do hlavní sítě.

Ptejte se, navrhujte témata pro nové články o technologiích v oblasti kryptoměn a také se přihlaste k odběru naší skupiny v facebookabyste byli v obraze o našich akcích a publikacích.

Zdroj: www.habr.com

Přidat komentář