Отдавна се интересуваме от темата за анонимността в криптовалутите и се опитваме да следим развитието на технологиите в тази област. В своите статии подробно сме разглеждали принципите на функциониране в Monero, както и провеждали анализ на технологиите, съществуващи в това поле. Въпреки това, всички анонимни криптовалути до днешна дата са изградени на основата на моделите данни, предложени от Bitcoin — Unspent Transaction Output (по-нататък UTXO). За основаните на акаунти блокчейни като Ethereum съществуващите решения за реализиране на анонимност и конфиденциалност (например, или ) се опитват да повторят модела UTXO в смарт контракти.
През февруари 2019 година група изследователи от Станфордския университет и Visa Research пуснаха «Zether: На път към конфиденциалността в света на смарт контрактите». Авторите за първи път предложиха подход за предоставяне на анонимност в блокчейн системите, основани на акаунти, и представиха два варианта на смарт контракта: за конфиденциални (скриване на баланси и суми на преводи) и анонимни (скриване на получателя и изпращача) транзакции. Ние намираме предложената технология за интересна и бихме искали да споделим как тя работи, както и да обсъдим защо проблемът с анонимността в блокчейните, основани на акаунти, се счита за много сложен и дали авторите са успели да го решат напълно.
За устройството на тези модели данни
В UTXO модела транзакцията се състои от «входове» и «изходи». Пряко аналогично на «изходите» — банкноти в вашия портфейл: всеки «изход» има някаква стойност. Когато плащате на някого (създавате транзакция), вие харчите един или повече «изходи», които стават «входове» на транзакцията и блокчейнът ги маркира като похарчени. В същото време получателят на вашето плащане (или вие самият, ако имате нужда от ресто) получава новосъздадени «изходи». Схематично това може да бъде изобразено така:

Блокчейните, основани на акаунти, функционират подобно на вашата банкова сметка. Те оперират само с размера на баланса на вашата сметка и сумата на превода. Когато прехвърляте определена сума от своята сметка, не изгаряте никакви «изходи», мрежата не трябва да помни кои монети са похарчени и кои не. В най-простия случай проверката на транзакцията се свежда до проверка на подписа на изпращача и сумата на неговия баланс:

Анализ на технологията
В следващите редове ще говорим за начина, по който Zether скрива сумите на транзакциите, получателя и изпращача. По време на описанието на принципите на работа ще отбележим разликите между конфиденциалния и анонимния вариант. Тъй като е много по-лесно да се осигури конфиденциалност в блокчейн системи, базирани на сметки, то някои от ограниченията, наложени от анонимизацията, ще бъдат неактуални за конфиденциалната версия на технологията.
Скриване на баланси и суми на преводи
За шифроване на балансите и сумите на преводите в Zether се използва схема на шифроване . Тя работи по следния начин. Когато Алиса иска да изпрати на Боб b монети на адрес (неговия публичен ключ) Y, тя избира случайно число r и шифрова сумата:

където C — шифрованата сума, D — помощна стойност, необходима за дешифриране на тази сума, G — фиктивна точка на елиптичната крива, при умножение на която с тайния ключ се получава публичният ключ.
Когато Боб получи тези стойности, просто ги добавя към своя шифрован по същия начин баланс, което прави схемата удобна.
Аналогично Алиса изважда от своя баланс същите стойности, само че като Y използва своя публичен ключ.
Скриване на адресата и изпращача
Разбъркването на „изходите“ в UTXO се появи още в самото начало на криптовалутите и помага да се скрие изпращачът. За това самият изпращач при извършване на превод избира случайни „изходи“ в блокчейна и ги разбърква със своите. След това подписва „изходите“ с пръстенова подпись — криптографски механизъм, позволяващ да убеди проверяващия, че сред разбърканите „изходи“ присъстват монети на изпращача. Разбира се, самите разбъркани монети не се харчат.
Обаче за скриване на получателя не можем да генерираме фалшиви „изходи“. Затова в UTXO всеки „изход“ има уникален адрес, който е криптографски свързан с адреса на получателя на тези монети. В момента няма начин да се установи връзката между уникалния адрес на „изхода“ и адреса на получателя, без да знаем неговите секретни ключове.
В account-based моделите не можем да използваме еднократни адреси (иначе това вече ще бъде модел „изходи“). Затова получателят и изпращачът трябва да бъдат смесвани сред други акаунти в блокчейна. При това от смесените акаунти се изважда криптиран 0 монети (или се добавя 0 — в случая на смесване на получателя), фактически не променяйки реалния им баланс.
Тъй като и изпращачът, и получателят винаги имат постоянен адрес, тук възниква необходимостта при преводи на едни и същи адреси да се използват за смесване одни и същи групи. По-лесно е да се разгледа на примера.
Да предположим, че Алиса решава да направи вноска в благотворителния фонд на Боб, но предпочита този превод да остане анонимен за външния наблюдател. Тогава, за да се маскира в полето на изпращача, тя вписва още акаунти на Адам и Адел. А за да скрие Боб — в полето на получателя допълнително акаунтите на Бен и Бил. Правейки следващата вноска, Алиса решава до себе си да вписва Алекс и Аманда, а до Боб — Брюс и Бенджен. В този случай, при анализ на блокчейна, в тези две транзакции ще има само една пресичаща се двойка участници — Алиса и Боб, което деанонимизира тези транзакции.

Състезания за транзакции
Както вече споменахме, за да скрие баланса си в account-based системите, потребителят криптира своя баланс и сумата на превода. При това той трябва да докаже, че остатъкът по сметката му остава ненегативен. Проблемът е, че при формирането на транзакция потребителят изгражда доказателство относно текущото си състояние на сметката. А какво ще стане, ако Боб изпрати на Алиса транзакция, и тя бъде приета преди изпратената от Алиса? Тогава транзакцията на Алиса ще се счита за невалидна, тъй като доказателството за баланса е построено преди приемането на транзакцията на Боб.

Първото решение, което идва в такава ситуация — замразяване на акаунта до провеждане на транзакцията. Но този подход не е подходящ, тъй като освен трудността при решаването на тази задача в разпределената система, в анонимната схема няма да е ясно, чий акаунт да се блокира.
За решаване на този проблем технологията разделя входящите и изходящите транзакции: разходването на средства има незабавен ефект върху баланса, а постъпленията — отложен. За това се въвежда понятието „епохи“ — групи от блокове с фиксиран размер. Текущата „епоха“ се определя чрез деление на височината на блока на размера на групата. Обработвайки транзакция, мрежата веднага актуализира баланса на подателя, а средствата на получателя се натрупват. Натръжените средства стават на разположение на получателя на плащането само при настъпването на нова „епоха“.
В резултат на това потребителят може да изпраща транзакции независимо от това колко често получава средства (разбира се, в зависимост от баланса му). Размерът на епохата се определя в зависимост от това колко бързо блоковете се разпространяват в мрежата и колко бързо транзакцията попада в блока.
Това решение работи добре в случая на конфиденциални преводи, но с анонимните транзакции, както ще видим по-нататък, то създава сериозни проблеми.
Защита от replay-атаки
В блокчейновете, базирани на сметки, всяка транзакция се подписва с частния ключ на подателя, което убедително показва на проверяващия, че транзакцията не е била променена и е създадена от собственика на този ключ. Но какво ще стане, ако злонамерен потребител, който е подслушвал канала за предаване, прихване това съобщение и изпрати точно такова второ? Проверяващият ще сравни подписа на транзакцията и ще бъде убеден в нейното авторство, а мрежата ще приспадне същата сума от баланса на подателя повторно.
Тази атака се нарича replay-атака. В UTXO модела такива атаки не са актуални, тъй като злонамереният потребител ще се опита да използва изразходвани изходи, което само по себе си не е валидно и се отхвърля от мрежата.
За да не се случи това, в транзакцията се вгражда поле със случайни данни, което се нарича nonce или просто „сол“. При повторно изпращане на транзакция с „сол“ проверяващият проверява дали този nonce е бил използван преди и, ако не е, счита тази транзакция за валидна. За да не се съхранява в блокчейна цялата история на nonce-овете на потребителите, обикновено в самата първа транзакция той се приема за равен на нула, а след това се увеличава с единица. На мрежата й остава само да провери, че nonce на новата транзакция се различава от предишната с една единица.
В анонимната схема за преводи възниква проблем с валидността на nonce-овете на транзакциите. Не можем да свържем nonce по явен начин с адреса на изпращача, защото, очевидно, това ще деанонимизира трансакцията. Също така не можем да добавяме единица към nonce-овете на всички участващи акаунти, тъй като това може да създаде конфликт с други преводи, които се обработват.
Авторы на Zether предлагат да генерират nonce криптографски — в зависимост от "епохата". Например:

Тук x — таен ключ на изпращача, а Gepoch — допълнителен генератор за епохата, получен чрез хеширане на низ от вида 'Zether + '. Сега проблемът, изглежда, се решава — ние не разкриваме nonce на изпращача и не намесваме в nonce-ите на неподозреваемите участници. Но такъв подход налага сериозно ограничение: един акаунт може да изпрати не повече от една транзакция в "епохата". Този проблем, за съжаление, остава нерешен и към момента прави анонимната версия на Zether, по наше мнение, едва ли пригодна за употреба.
Сложността на доказателствата с нулево разкриване
В UTXO изпращачът трябва да докаже на мрежата, че не харчи отрицателна сума, в противен случай става възможна генерацията на нови монети от нищото (защо това е възможно, пишехме в един от предходните ). И също така да подпише "входовете" с кольцева подписка, за да докаже, че сред замесените монети има средства, принадлежащи му.
В анонимната версия на account-based блокчейна, изразите за доказателство стават много по-сложни. Изпращачът доказва, че:
- Изпратената сума е положителна;
- Балансът остава неотрицателен;
- Изпращачът правилно е криптирала сумите на преводите (включително нулевите);
- Остатъкът на баланса се променя само при изпращача и получателя;
- Изпращачът притежава тайната ключ от своя акаунт и той наистина е в списъка на изпращачите (сред замесените);
- Nonce, използван в транзакцията, е съставен правилно.
За такова сложно доказателство авторите използват смес (един от авторите, между другото, е участвал в създаването му) и , който наричат Sigma-bullets. Формалното доказателство на такова твърдение е доста сложна задача и силно ограничава броя на желаещите да се занимават с реализацията на технологията.
Какво в крайна сметка?
Според нас, частта на Zether, която въвежда конфиденциалност в блокчейни, основани на акаунти, може да се използва и в момента. Но към момента анонимната версия на технологията налага сериозни ограничения за нейното приложение, а сложността ѝ – за реализацията. Въпреки това, не бива да забравяме, че авторите я пуснаха само преди няколко месеца и вероятно някой друг ще намери решение на съществуващите днес проблеми. Все пак, именно така се прави науката.
Източник: habr.com
