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.
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
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
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
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
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é
Ří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
a podle toho klíčové obrázky: Získáme tak matici velikosti 2 x m. Nejprve musíme vypočítat takzvané výzvy pro každou dvojici výstupů:
Výpočty začínáme s výstupy, které vynakládáme pomocí jejich veřejných klíčů:a náhodná číslaV důsledku toho získáme následující hodnoty:
, který používáme k výpočtu výzvy
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á čísla. Pro π- sloupec budeme je také potřebovat. Pojďme se transformovatza s:
Samotný podpis je n-ticí všech těchto hodnot:
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á, obnoví hodnoty c1,…, cm a zkontroluje to. 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á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:
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:
Závazkové komise to berou trochu jinak – bez masky:
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):
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:
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:
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ů:
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á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
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ů.
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
Zdroj: www.habr.com