Dlouho se zajímáme o anonymitu v kryptoměnách a snažíme se sledovat vývoj technologií v této oblasti. V našich článcích jsme již podrobně prozkoumali principy fungování v Monero a také jsme uskutečnili technologií, které v tomto oboru existují. Nicméně všechny anonymní kryptoměny současnosti jsou postaveny na modelu dat navrženém Bitcoinem — Unspent Transaction Output (dále UTXO). Pro blockchainy založené na účtech jako Ethereum existují stávající řešení pro implementaci anonymity a důvěrnosti (například nebo ) se snažila replikovat model UTXO ve smart kontraktech.
V únoru 2019 vyšla skupina výzkumníků ze Stanfordovy univerzity a Visa Research vydal „Zether: Směrem k soukromí ve světě smart kontraktů“. Autoři poprvé navrhli přístup k zajištění anonymity v blockchainu na bázi účtů a představili dva varianty smart kontraktů: pro důvěrné (skrytí zůstatků a částek transakcí) a anonymní (skrytí příjemce a odesílatele) transakce. Považujeme navrženou technologii za zajímavou a rádi bychom se s vámi podělili o její fungování a probrali, proč je problém anonymity v blockchainu na bázi účtů považován za velmi složitý a zda se autorům podařilo jej vyřešit zcela.
O fungování těchto datových modelů
V modelu UTXO se transakce skládá z „vstupů“ a „výstupů“. Přímý analog k „výstupům“ jsou bankovky ve vaší peněžence: každý „výstup“ má určitou hodnotu. Když platíte někomu (tvoříte transakci), utrácíte jeden nebo více „výstupů“, které se stávají „vstupy“ transakce, a blockchain je označí jako utracené. Příjemce vaší platby (nebo vy sami, pokud potřebujete vrátit peníze) pak získává nově vygenerované „výstupy“. Schématicky lze toto znázornit takto:

Blockchainy na bázi účtů fungují přibližně jako váš bankovní účet. Ovládají pouze částku na vašem účtu a částku převodu. Když převádíte nějakou částku ze svého účtu, nespálíte žádné „výstupy“, síť si nemusí pamatovat, které mince byly utraceny, a které ne. V nejjednodušším případě se ověření transakce omezuje na kontrolu podpisu odesílatele a částky na jeho zůstatku:

Analýza technologie
Dále se budeme zabývat tím, jak Zether skrývá částky transakcí, příjemce a odesílatele. Během popisu principů jeho fungování budeme upozorňovat na rozdíly v důvěrném a anonymním variantě. Jelikož je zajištění důvěrnosti v blockchainech založených na účtech mnohem jednodušší, některá z omezení spojených s anonymizací nebudou pro důvěrnou verzi technologie relevantní.
Skrývání zůstatků a částek převodů
Pro šifrování zůstatků a částek převodů v Zether se používá šifrovací schéma . Funguje to následovně. Když chce Alice poslat Bobovi b mince na adresu (jeho veřejný klíč) Y, vybere si náhodné číslo jsou rovny nule. a šifruje částku:

kde C — zašifrovaná částka, DDoS — pomocná hodnota potřebná k dešifrování této částky, G — pevný bod na eliptické křivce, při násobení tajným klíčem, který produkuje veřejný klíč.
Když Bob obdrží tyto hodnoty, jednoduše je přičte k svému zašifrovanému zůstatku stejným způsobem, a to je výhodou tohoto schématu.
Analogicky Alice odečítá ze svého zůstatku stejné hodnoty, pouze jako Y používá svůj veřejný klíč.
Skrývání adresáta a odesílatele
Míchání „výstupů“ v UTXO se objevilo již na počátku kryptoměn a pomáhá skrýt odesílatele. K tomu sám odesílatel při provádění převodu vybírá náhodné „výstupy“ v blockchainu a míchá je se svými. Následně podepíše „výstupy“ kruhovým podpisem — kryptografickým mechanismem, který umožňuje přesvědčit kontrolora, že mezi zamíchanými „výstupy“ jsou mince odesílatele. Samozřejmě, zamíchané mince se neutratí.
Pro skrývání příjemce však nebudeme schopni generovat falešné „výstupy“. Proto má v UTXO každý „výstup“ svou jedinečnou adresu, a ta je kryptograficky spojena s adresou příjemce těchto mincí. V současnosti neexistuje způsob, jak odhalit spojení mezi jedinečnou adresou „výstupu“ a adresou příjemce, aniž bychom znali jeho tajné klíče.
V modelu založeném na účtech nemůžeme použít jednorázové adresy (jinak bychom už mluvili o modelu „výstupů“). Proto je třeba zamíchat příjemce a odesílatele mezi další účty v blockchainu. Přitom se z zamíchaných účtů odečítá zašifrovaný 0 mincí (nebo se přidává 0 — v případě zamíchání příjemce), což vlastně nemění jejich skutečný zůstatek.
Jelikož má odesílatel i příjemce vždy stálou adresu, vzniká potřeba používat pro zamíchání stejné skupiny při převodech na stejné adresy. Snáze se to ukáže na příkladu.
Představme si, že Alice se rozhodla provést příspěvek do charitativního fondu Boba, ale preferuje, aby tento převod zůstal anonymní pro vnějšího pozorovatele. Aby zamaskovala sebe v poli odesílatele, uvede také účty Adama a Adéle. A aby skryla Boba — v poli příjemce uvede navíc účty Bena a Billa. Při dalším příspěvku se Alice rozhodla vedle sebe uvést Alexe a Amandu, a vedle Boba — Bruce a Banjena. V tomto případě se při analýze blockchainu v těchto dvou transakcích najde pouze jedna společná dvojice účastníků — Alice a Bob, což deanonimizuje tyto transakce.

Závody transakcí
Jak jsme již zmínili, pro skrytí svého zůstatku v systémech založených na účtech uživatel šifruje svůj zůstatek a částku převodu. Při tom musí dokázat, že zbytek na jeho účtu zůstává nezáporný. Problém spočívá v tom, že při vytváření transakce uživatel sestavuje důkaz o svém aktuálním stavu účtu. Co se však stane, pokud Bob pošle Alici transakci a ta bude přijata dříve, než je odeslána Alice? Potom bude transakce Alice považována za neplatnou, protože důkaz o zůstatku byl sestaven před přijetím transakce Boba.

První řešení, které v takové situaci napadne, je zmrazit účet do doby provedení transakce. Ale tento přístup není vhodný, protože kromě složitosti vyřešení takového úkolu v distribuovaném systému bude v anonymním schématu nejasné, čí účet zablokovat.
Pro vyřešení tohoto problému technologie odděluje příchozí a odchozí transakce: výdaje mají okamžitý účinek na stav zůstatku, zatímco příjmy mají odložený účinek. Proto se zavádí pojem „epochy“ – skupiny bloků pevné velikosti. Aktuální „epocha“ je určena dělením výšky bloku velikostí skupiny. Při zpracování transakce síť okamžitě aktualizuje zůstatek odesílatele, zatímco prostředky příjemce jsou uloženy do úložiště. Nahromaděné prostředky přijdou do dispozice příjemce platby až s příchodem nové „epochy“.
Výsledkem je, že uživatel může odesílat transakce bez ohledu na to, jak často mu přicházejí prostředky (což samozřejmě závisí na jeho zůstatku). Velikost epochy je určena podle toho, jak rychle se bloky šíří po síti a jak rychle transakce vstoupí do bloku.
Toto řešení dobře funguje v případě důvěrných převodů, avšak s anonymními transakcemi, jak uvidíme dále, vytváří vážné problémy.
Ochrana proti replay útokům
V blockchainových systémech založených na účtech je každá transakce podepsána privátním klíčem odesílatele, což přesvědčuje ověřovatele, že transakce nebyla změněna a že ji vytvořil vlastník tohoto klíče. Co se však stane, když útočník, který odposlouchával přenosové kanály, zachytí tuto zprávu a odešle identickou druhou? Ověřovatel porovná podpis transakce a bude přesvědčen o jejím autorství, a síť znovu odečte stejnou částku ze zůstatku odesílatele.
Tento útok se nazývá replay útok. V modelu UTXO nejsou takové útoky aktuální, protože útočník by se pokusil použít utracené výstupy, což samo o sobě není platné a je odmítnuto sítí.
Aby k tomu nedošlo, do transakce se vkládá pole se náhodnými daty, které se nazývá nonce nebo jednoduše „sůl“. Při opětovném odesílání transakce s „solí“ ověřovatel zkontroluje, zda byl tento nonce použit dříve, a pokud ne, považuje tuto transakci za platnou. Aby nebylo nutné uchovávat v blockchainu celou historii nonce uživatelů, obvykle se v samotné první transakci přijme jako nulový a dále se zvyšuje o jedna. Síť má za úkol jen zkontrolovat, že nonce nové transakce se liší od předchozí o jednu.
V anonymním schématu převodů se objevuje problém validace nonce transakcí. Nelze přímo přiřadit nonce k adrese odesílatele, protože by to zjevně de-anonymizovalo převod. Také nemůžeme přičítat jedničku k nonce všech zúčastněných účtů, protože to může kolidovat s jinými převody, které jsou v procesu zpracování.
Autoři Zether navrhují generovat nonce kryptograficky — v závislosti na „epochě“. Například:

Zde x — tajný klíč odesílatele, a Gepoch — dodatečný generátor pro epochu, získaný hashováním řetězce typu ‘Zether + ‘. Nyní se problém zdá být vyřešen — neodhalujeme nonce odesílatele a nezasahujeme do nonce nezúčastněných účastníků. Tento přístup však klade vážná omezení: jeden účet může odeslat maximálně jednu transakci v „epochě“. Tento problém bohužel zůstává nevyřešen a v současnosti činí anonymní verzi Zether, podle našeho názoru, stěží vhodnou k použití.
Obtížnost důkazů s nulovým odhalováním
V UTXO musí odesílatel dokázat síti, že netratí negativní částku, jinak by bylo možné generovat nové mince z ničeho (proč je to možné, jsme popisovali v jednom z předchozích ). A také podepsat „vstupy“ kruhovým podpisem, aby dokázal, že mezi mísenými mincemi jsou prostředky, které mu patří.
V anonymní verzi blockchainu založeného na účtech jsou výrazy pro důkaz mnohem složitější. Odesílatel dokazuje, že:
- Odesílaná částka je kladná;
- Zůstatek zůstává nezáporný;
- Odesílatel správně zašifroval částky převodů (včetně nulových);
- Zůstatek na účtu se mění pouze u odesílatele a příjemce;
- Odesílatel vlastní tajný klíč k svému účtu a skutečně se nachází v seznamu odesílatelů (mezi mísenými);
- Nonce použitý v transakci je správně složen.
Pro takto složitý důkaz autoři používají směs (jeden z autorů, mimochodem, se podílel na jejím vytvoření) a , kterou nazývají Sigma-bullets. Formální důkaz takového tvrzení je poměrně složitý úkol a silně omezuje počet těch, kteří mají zájem o realizaci technologie.
Jaký je výsledek?
Podle našeho názoru může část Zether, která přináší soukromí do blockchainů založených na účtech, být používána již nyní. Nicméně v současnosti anonymní verze technologie klade vážná omezení na její použití a její složitost na implementaci. Je však důležité nezapomínat, že autoři ji vydali teprve před několika měsíci a možná někdo jiný nalezne řešení pro dnešní problémy. Takto se přece dělá věda.
Zdroj: habr.com
