Už dávno nás zaujíma téma anonymity v kryptomenách a snažíme sa sledovať vývoj technológií v tejto oblasti. Vo svojich článkoch sme podrobne preskúmali princípy fungovania v Monero a tiež sme sa zaoberali technológiami, ktoré existujú v tejto oblasti. Avšak všetky anonymné kryptomeny sú v súčasnosti postavené na modely dát, ktoré navrhla Bitcoin — Unspent Transaction Output (ďalej UTXO). Pre blockchaine založené na účtoch, ako je Ethereum, existujúce riešenia na zabezpečenie anonymity a dôvernosti (napríklad alebo ) sa pokúsili zopakovať model UTXO v smart kontraktoch.
V februári 2019 skupina výskumníkov zo Stanfordovej univerzity a Visa Research uvedli preprint "Zether: K súkromiu vo svete smart kontraktov". Autori po prvýkrát navrhli prístup k zabezpečeniu anonymity v blockchaine založenom na účtoch a predstavili dva varianty smart kontraktu: pre dôverné (skrytie zostatkov a súm prevodov) a anonymné (skrytie príjemcu a odosielateľa) transakcie. Považujeme navrhovanú technológiu za zaujímavú a radi by sme sa podelili o jej fungovanie, ako aj o to, prečo je problém anonymity v blockchaine založenom na účtoch považovaný za veľmi zložitý a či sa autorom podarilo túto otázku úplne vyriešiť.
O fungovaní týchto modelov dát
V UTXO modeli transakcia pozostáva zo „vstupov“ a „výstupov“. Priame analógie „výstupom“ sú bankovky vo vašej peňaženke: každý „výstup“ má nejakú hodnotu. Keď platíte niekomu (tvoríte transakciu), míňate jeden alebo viac „výstupov“, pričom sa stávajú „vstupmi“ transakcie a blockchain ich označuje ako vydané. Pri tom príjemca vašej platby (alebo vy sami, ak potrebujete spätnú hotovosť) dostáva znova generované „výstupy“. Schématicky to môžeme znázorniť takto:

Blockchaine založené na účtoch fungujú zhruba ako váš bankový účet. Operujú iba s hodnotou na vašom účte a sumou prevodu. Keď prevádzate nejakú sumu zo svojho účtu, nespálite žiadne „výstupy“, sieť si nemusí pamätať, ktoré mince sú minulé a ktoré nie. V najjednoduchšom prípade sa overenie transakcie zúži na overenie podpisu odosielateľa a sumy na jeho zostatku:

Analýza technológie
Ďalej sa budeme zaoberať tým, ako Zether skrýva sumy transakcií, príjemcov a odosielateľov. Počas popisu princípov jeho fungovania si všimneme rozdiely medzi konfidenciálnym a anonymným variantom. Keďže zabezpečiť dôvernosť v blockchainoch založených na účtoch je oveľa jednoduchšie, niektoré z obmedzení, ktoré anonymizácia prináša, nebudú pre konfidenciálnu verziu technológie relevantné.
Skrývanie zostatkov a súm prevodov
Na šifrovanie zostatkov a súm prevodov v Zether sa používa šifrovací schéma . Funguje to nasledovne. Keď chce Alisa poslať Bobovi b mince na adresu (jeho verejný kľúč) Y, vyberie si náhodné číslo r a zašifruje sumu:

kde C — zašifrovaná suma, D — pomocná hodnota potrebná na dešifrovanie tejto sumy, G — fixný bod na eliptickej krivke, pri násobení ktorého tajným kľúčom vzniká verejný kľúč.
Keď Bob dostane tieto hodnoty, jednoducho ich pripojí k svojmu zašifrovanému zostatku, čím je táto schéma výhodná.
Podobne Alisa odpočítava z svojho zostatku rovnaké hodnoty, ale ako Y používa svoj verejný kľúč.
Skrývanie adresáta a odosielateľa
Zamieňanie „výstupov“ v UTXO sa objavilo už na začiatku kryptomien a pomáha skrývať odosielateľa. Na tento účel sám odosielateľ pri vykonávaní prevodu vyberá náhodné „výstupy“ v blockchain a zamieňa ich so svojimi. Potom podpisuje „výstupy“ kruhovým podpisom — kryptografickým mechanizmom, ktorý umožňuje presvedčiť overovateľa, že medzi zamieňanými „výstupmi“ sú mince odosielateľa. Samotné zamieňané mince sa samozrejme nepoužívajú.
Avšak na skrývanie príjemcu sa nám nepodarí generovať fiktívne „výstupy“. Preto má v UTXO každý „výstup“ svoju jedinečnú adresu, a tá je kryptograficky prepojená s adresou príjemcu týchto mincí. V súčasnosti neexistuje spôsob, ako odhaliť spojenie medzi jedinečnou adresou „výstupu“ a adresou príjemcu, pokiaľ nepoznáte jeho tajné kľúče.
V modely založenej na účtoch nemôžeme používať jednorazové adresy (inak by to už bola model „odchodov“). Preto musíme zamieňať prijímateľa a odosielateľa medzi rôznymi účtami v blokchain. Pri tom sa z zamieňaných účtov strháva zašifrovaných 0 mincí (alebo sa pridá 0 — v prípade zamieňania prijímateľa), pričom sa reálny zostatok účtov v podstate nemení.
Keďže odosielateľ aj prijímateľ majú vždy stálu adresu, vzniká tu potreba pri prevodoch na rovnaké adresy používať na zamieňanie rovnaké skupiny. Je jednoduchšie to vysvetliť na príklade.
Predpokladajme, že Alenka sa rozhodla prispieť do charitatívneho fondu Boba, ale uprednostňuje, aby tento prevod zostal anonymný pre vonkajšieho pozorovateľa. Aby zamaskovala svoju identitu v poli odosielateľa, uvedie aj účty Adama a Adely. A aby skryla Boba — v poli prijímateľa dodatočne účty Bena a Billa. Pri ďalšom príspevku sa Alenka rozhodla vedľa seba uviesť aj Alexe a Amandu, a vedľa Boba — Bruna a Benjamina. V tomto prípade, pri analýze blokchainu, v týchto dvoch transakciách nájde iba jeden prekrývajúci sa pár účastníkov — Alenku a Boba, čo de-anonymizuje tieto transakcie.

Preteky transakcií
Ako sme už spomínali, na skrytie svojho zostatku v systémoch založených na účtoch si používateľ šifruje svoj zostatok a sumu prevodu. Musí pritom preukázať, že zostatok na jeho účte zostáva nezáporný. Problém spočíva v tom, že pri vytváraní transakcie používateľ konštruuje dôkaz o svojom aktuálnom stave účtu. Čo sa však stane, ak Bob pošle Alenke transakciu a tá bude prijatá skôr, ako transakcia, ktorú odoslala Alenka? Potom bude transakcia Alenky považovaná za neplatnú, pretože dôkaz o zostatku bol zostavený pred prijatím Bobovej transakcie.

Prvé riešenie, ktoré napadne v takejto situácii, je zmraziť účet pred uskutočnením transakcie. Ale tento prístup nie je vhodný, pretože okrem zložitosti vyriešenia takejto úlohy v distribuovanej sústave nebude v anonymnej schéme jasné, ktorú účet zablokovať.
Na vyriešenie tohto problému technológia rozdeľuje prichádzajúce a odchádzajúce transakcie: výdavky okamžite ovplyvňujú stav zostatku, zatiaľ čo príjmy majú odložený efekt. Pre tento účel sa zavádza pojem „epochy“ — skupiny blokov pevnej veľkosti. Aktuálna „epocha“ sa určuje delením výšky bloku na veľkosť skupiny. Pri spracovaní transakcie sieť aktualizuje zostatok odosielateľa okamžite, zatiaľ čo prostriedky príjemcu sa ukladajú do úložiska. Nahromadené prostriedky sa dostanú do dispozície príjemcu platby až pri nastúpení novej „epochy“.
V dôsledku toho môže používateľ posielať transakcie bez ohľadu na to, ako často mu prichádzajú prostriedky (samozrejme, pokiaľ mu to umožňuje jeho zostatok). Veľkosť epochy sa určuje na základe toho, ako rýchlo sa bloky šíria sieťou a ako rýchlo sa transakcia dostane do bloku.
Toto riešenie dobre funguje v prípade dôverných prevodov, avšak pri anonymných transakciách, ako uvidíme neskôr, vytvára vážne problémy.
Ochrana pred replay-útokmi
V blockchainoch založených na účtoch je každá transakcia podpísaná súkromným kľúčom odosielateľa, čo presviedča overovateľa, že transakcia nebola zmenená a vytvoril ju majiteľ tohto kľúča. Ale čo ak útočník, ktorý odpočúval prenosový kanál, zachytí túto správu a odošle presne rovnaké druhé? Overovateľ porovná podpis transakcie a bude presvedčený o jej autorstve, a sieť opäť odráta rovnako veľkú sumu z účtu odosielateľa.
Tomuto útoku sa hovorí replay-útok. V modeli UTXO takéto útoky nie sú aktuálne, pretože útočník by sa pokúsil využiť míňané výstupy, čo je samo osebe neplatné a sieť to odmieta.
Aby sa tomu predišlo, do transakcie sa vkladá pole s náhodnými údajmi, ktoré sa nazýva nonce alebo jednoducho „soľ“. Pri opätovnom odoslaní transakcie s „soľou“ overovateľ kontroluje, či bol tento nonce použitý skôr a, ak nie, považuje túto transakciu za platnú. Aby sa v blockchaine neukladala celá história nonce-ov používateľov, zvyčajne sa pri prvej transakcii berie ako nulový a potom sa zvyšuje o jednotku. Siete ostáva len skontrolovať, že nonce novej transakcie sa líši od predchádzajúcej o jednu jednotku.
V anonymnom systéme prevodov sa objavuje problém validácie nonce transakcií. Nemôžeme explicitne viazať nonce na adresu odosielateľa, pretože to očividne deanonimizuje prevod. Taktiež nemôžeme pridať jednotku k nonce všetkých zúčastnených účtov, pretože to môže zasahovať do iných prevodov, ktoré sú v spracovaní.
Autori Zether navrhujú generovať nonce kryptograficky - v závislosti od „épok“. Napríklad:

Tu x — tajný kľúč odosielateľa, a Gepoch — dodatočný generátor pre epochu, získaný hashovaním reťazca typu 'Zether + '. Teraz sa problém zdá byť vyriešený - neodhalíme nonce odosielateľa a zasahujeme do nonce nezúčastnených účastníkov. Ale takýto prístup kladie vážne obmedzenie: jeden účet môže odoslať maximálne jednu transakciu v „époke“. Tento problém, žiaľ, zostáva nevyriešený a v súčasnosti robí anonymnú verziu Zether podľa nášho názoru len ťažko použiteľnou.
Zložitosti dôkazov s nulovým odhalením
V UTXO musí odosielateľ dokázať sieti, že neutratí negatívnu sumu, inak je možné generovanie nových mincí z ničoho (prečo je to možné, sme písali v jednom z predchádzajúcich ). A rovnako aj podpísať „vstupy“ krúžkovým podpisom, aby dokázal, že medzi zamiešanými mincami sú prostriedky, ktoré mu patrí.
V anonymnej verzii blockchainu založeného na účtoch sú výrazy pre dôkaz oveľa zložitejšie. Odosielateľ dokazuje, že:
- Odosielaná suma je kladná;
- Zostatok zostáva nezáporný;
- Odosielateľ správne zašifroval sumy prevodov (vrátane nulových);
- Zostatok na účte sa mení len u odosielateľa a prijímateľa;
- Odosielateľ vlastní tajný kľúč k svojmu účtu a skutočne sa nachádza v zozname odosielateľov (medzi zamiešanými);
- Nonce použitá v transakcii je zostavená správne.
Pre takýto zložitý dôkaz autori používajú zmes (jeden z autorov sa, mimochodom, podieľal na jeho vytvorení) a , ktorú nazývajú Sigma-bullets. Formálny dôkaz takejto afirmácie je veľmi zložitá úloha a značne obmedzuje počet tých, ktorí sa chcú zaoberať implementáciou technológie.
Aký je výsledok?
Podľa nášho názoru časť Zether, ktorá prináša súkromie do blockchainov založených na účtoch, sa už dá použiť. Avšak anonymná verzia technológie momentálne kladie vážne obmedzenia na jej využitie a jej zložitosti na realizáciu. Netreba však zabúdať, že autori ju vydali len pred niekoľkými mesiacmi, a je celkom možné, že niekto iný nájde riešenie existujúcich problémov. Takto predsa prebieha veda.
Zdroj: habr.com
