Kemi prej kohësh jemi të interesuar për temën e anonimitetit në kriptovaluta dhe përpiqemi të ndjekim zhvillimet teknologjike në këtë fushë. Në artikujt tanë, ne kemi shqyrtuar në detaje parimet e funksionimit në Monero, si dhe kemi realizuar të teknologjive që ekzistojnë në këtë fushë. Megjithatë, të gjitha kriptovalutat anonime deri më sot janë ndërtuar mbi modelin e të dhënave të propozuar nga Bitcoin — Unspent Transaction Output (UTXO). Për blockchain-et e bazuara në llogari si Ethereum, zgjidhjet ekzistuese për implementimin e anonimitetit dhe privatësisë (për shembull, ose ) kanë përpiqur të ripërshkruajnë modelin UTXO në kontratat inteligjente.
Në shkurt 2019, një grup kërkuesish nga Universiteti i Stanfordit dhe Visa Research në lëshuan «Zether: Në drejtim të privatësisë në botën e kontratave inteligente». Autorët propozuan për herë të parë një qasje për sigurimin e anonimitetit në blockchain-et e bazuara në llogari dhe paraqitën dy variante të kontratës inteligjente: për transaksione të fshehta (fshehja e bilanceve dhe shuma e transfertave) dhe të anonimizuara (fshehja e marrësit dhe dërguesit). Ne e gjejmë teknologjinë e propozuar interesante dhe do të donim të ndanim ndërtimin e saj, si dhe të flisnim për atë se pse problemi i anonimitetit në blockchain-et e bazuara në llogari konsiderohet shumë i komplikuar dhe nëse autorët arritën ta zgjidhin atë në tërësi.
Rreth ndërtimit të këtyre modeleve të dhënash
Në modelin UTXO, transaksioni përbëhet nga "hyrje" dhe "dalje". Një analog i drejtpërdrejtë i "daljeve" janë banknotat në portofolin tuaj: çdo "dalje" ka një ndihmë të caktuar. Kur paguani dikë (formoni një transaksion), ju shpenzoni një ose disa "dalje", ndërsa ato bëhen "hyrjet" e transaksionit, dhe blockchain-i i shënon si të shpenzuara. Në këtë rast, marrësi i pagesës suaj (ose ju vetë, nëse ju nevojitet kthen) merr "daljet" e gjeneruara përsëri. Këtë mund ta ilustrojmë kështu:

Blockchain-et e bazuara në llogari janë të ngjashme me llogarinë tuaj bankare. Ato operojnë vetëm me shumën në llogarinë tuaj dhe shumën e transfertës. Kur transferoni një shumë nga llogaria juaj, nuk djegni asnjë "dalje", rrjeti nuk ka nevojë të mbajë mend se cilat monedha janë shpenzuar dhe cilat jo. Në rastin më të thjeshtë, kontrolli i transaksionit përqendrohet në verifikimin e nënshkrimit të dërguesit dhe shumës në bilancin e tij:

Analiza teknologjisë
Tani do të flasim për mënyrën se si Zether fsheh shumën e transaksioneve, marrësin dhe dërguesin. Gjatë përshkrimit të parimeve të funksionimit të tij, ne do të shënojmë dallimet në variantin e fshehtë dhe atë anonim. Duke qenë se sigurimi i privatësisë në blockchain-et e bazuara në llogari është shumë më i lehtë, disa nga kufizimet e vendosura nga anonimizimi do të jenë jo të rëndësishme për versionin e fshehtë të teknologjisë.
Fshehja e bilanceve dhe shumave të transfertave
Për të enkriptuar bilancet dhe shumat e transfertave në Zether përdoret një skemë enkriptimi . Ajo funksionon si më poshtë. Kur Alice dëshiron të dërgojë Bob-it b monedha në adresën (çelësi i tij publik) Y, ajo zgjedh një numër të rastësishëm r dhe enkripton shumën:

ku C — shuma e enkriptuar, D — një vlerë ndihmëse, e nevojshme për dekriptime të kësaj shume, G — një pikë fikse në një kurbë eliptike, ku kur shumëzohet çelësi sekret, rezulton çelësi publik.
Kur Bob merr këto vlera, ai thjesht i shton ato në bilancin e tij të enkriptuar në të njëjtën mënyrë, çka e bën këtë skemë të përshtatshme.
Po ashtu, Alice heq këto vlera nga bilanci i saj, duke përdorur çelësin e saj publik. Y Fshehja e marrësit dhe dërguesit
Përzierja e "daljeve" në UTXO nisi që në fillim të kriptovalutave dhe ndihmon në fshehjen e dërguesit. Për këtë, vetë dërguesi, gjatë realizimit të transfertës, zgjedh "dalje" të rastësishme në blockchain dhe i përzien ato me të tijat. Pastaj, ai nënshkruan "daljet" me nënshkrimin rinor — një mekanizëm kriptografik që lejon të bindet kontrolluesi se në mesin e "daljeve" të përziera ka monedha të dërguesit. Monedhat e përziera, sigurisht, nuk harxhohen.
Megjithatë, për të fshehur marrësin, nuk mund të krijojmë "dalje" false. Prandaj, në UTXO çdo "dalje" ka adresën e saj unike, dhe ajo është e lidhur kriptografikisht me adresën e marrësit të këtyre monedhave. Aktualisht, nuk ka mënyrë për të zbuluar lidhjen mes adresës unike të "daljes" dhe adresës së marrësit, pa e ditur çelësin e tij sekret.
Однако для сокрытия получателя нам не удастся генерировать фальшивые «выходы». Поэтому в UTXO у каждого «выхода» свой уникальный адрес, и он криптографически связан с адресом получателя этих монет. На данный момент нет способа выявить связь между уникальным адресом «выхода» и адресом получателя, не зная его секретных ключей.
В account-based модели мы не можем использовать одноразовые адреса (иначе это уже будет модель «выходов»). Поэтому получателя и отправителя приходится замешивать среди других аккаунтов в блокчейне. При этом с замешиваемых аккаунтов списывается зашифрованный 0 монет (или прибавляется 0 — в случае замешивания получателя), фактически не меняя их реальный баланс.
Так как и отправитель, и получатель всегда имеют постоянный адрес, здесь возникает необходимость при переводах на одни и те же адреса использовать для замешивания одни и те же группы. Проще рассмотреть это на примере.
Допустим, Алиса решила сделать взнос в благотворительный фонд Боба, но предпочитает, чтобы этот перевод оставался анонимными для стороннего наблюдателя. Тогда, чтобы замаскировать себя в поле отправителя, она вписывает еще аккаунты Адама и Адель. А чтобы скрыть Боба — в поле получателя дополнительно аккаунты Бена и Билла. Делая следующий взнос, Алиса решила рядом с собой вписать Алекса и Аманду, а рядом с Бобом — Брюса и Бенджена. В этом случае при анализе блокчейна в этих двух транзакциях найдется всего лишь одна пересекающаяся пара участников — Алиса и Боб, что деанонимизирует эти транзакции.

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

Первое решение, которое приходит в такой ситуации — замораживать аккаунт до проведения транзакции. Но этот подход не годится, т. к. помимо сложности решения такой задачи в распределенной системе, в анонимной схеме будет непонятно, чей аккаунт блокировать.
Для решения этой проблемы технология разделяет входящие и исходящие транзакции: расходование средств имеет незамедлительный эффект на состояние баланса, а поступления — отложенный. Для этого вводится понятие «эпохи» — группы блоков фиксированного размера. Текущая «эпоха» определяется делением высоты блока на размер группы. Обрабатывая транзакцию, сеть обновляет баланс отправителя сразу, а средства получателя складывает в накопитель. Накопленные средства поступают в распоряжение получателя платежа только при наступлении новой «эпохи».
В результате пользователь может отправлять транзакции вне зависимости от того, как часто ему поступают средства (насколько позволяет его баланс, разумеется). Размер эпохи определяют исходя из того, насколько быстро распространяются блоки по сети и как быстро транзакция попадает в блок.
Это решение хорошо работает в случае конфиденциальных переводов, однако с анонимными транзакциями, как мы увидим далее, оно создает серьезные проблемы.
Защита от replay-атак
В account-based блокчейнах каждая транзакция подписывается приватным ключом отправителя, что убеждает проверяющего в том, что транзакция не была изменена и ее создал владелец этого ключа. Но что если злоумышленник, который прослушивал канал передачи, перехватит это сообщение и отправит точно такое же второе? Проверяющий сверит подпись транзакции и будет убежден в ее авторстве, и сеть спишет такую же сумму с баланса отправителя повторно.
Эту атаку называют replay-атакой. В UTXO-модели такие атаки не актуальны, т. к. злоумышленник будет пытаться использовать потраченные выходы, что само по себе не валидно и отвергается сетью.
Чтобы подобного не произошло, в транзакцию встраивают поле со случайными данными, которое называют nonce или просто «соль». При повторной отправке транзакции с «солью» проверяющий смотрит, использовался ли этот nonce ранее и, если нет, считает эту транзакцию валидной. Чтобы не хранить в блокчейне всю историю nonce-ов пользователей, обычно в самой первой транзакции его принимают равным нулю, а дальше увеличивают на единицу. Сети остается только проверить, что nonce новой транзакции отличается от прошлой на единицу.
Në një skemë anonime transferimesh, lind problemi i validimit të nonce-ve të transaksioneve. Ne nuk mund të lidhim nonce në mënyrë të qartë me adresën e dërguesit, pasi kjo do të de-anonimizonte transferimin. As nuk mund të shtojmë njësi në nonce-t e të gjitha llogarive që marrin pjesë, pasi kjo mund të krijojë konflikt me transferimet e tjera që janë në proces.
Autori i Zether propozojnë të gjenerojnë nonce në mënyrë kriptografike — në varësi të "epokës". Për shembull:

Këtu x — çelësi sekret i dërguesit, dhe Gepoch — një gjenerator shtesë për epokën, i marrë nga hashimi i një stringu të tipit 'Zether + '. Tani problemi, dukej se, zgjidhej — ne nuk zbulojmë nonce-in e dërguesit dhe nuk ndërhyjmë në nonce-t e pjesëmarrësve të tjerë. Por ky qasje sjell një kufizim të rëndësishëm: një llogari mund të dërgojë jo më shumë se një transaksion në "epokë". Ky problem, fatkeqësisht, mbetet i paadresuar dhe aktualisht e bën versionin anonim të Zether, nga pikëpamja jonë, gati të papërdorshëm.
Vështirësia e dëshmive me zbrazje zero
Në UTXO, dërguesi duhet të dëshmojë rrjetit se nuk po shpenzon një shumën negative, përndryshe bëhet e mundshme gjenerimi i monedhave të reja nga ajri (pse kjo është e mundur, ne kemi shkruar në një nga përmbledhjet tona të mëparshme ). Gjithashtu, ai duhet të nënshkruajë "hyrjet" me një nënshkrim rrethor për të dëshmuar se mes monedhave të përziera ka mjete që i përkasin atij.
Në versionin anonim të blockchain-eve të bazuara në llogari, shprehjet për dëshmimin bëhen shumë më të komplikuara. Dërguesi dëshmon se:
- Shuma e dërguar është pozitive;
- Bashkërendimi mbetet jo negativ;
- Dërguesi i ka koduar saktë shumën e transfertave (përfshirë zero);
- Bilanci ndryshon vetëm për dërguesin dhe marrësin;
- Dërguesi zotëron çelësin sekret të llogarive të tij dhe ai është me të vërtetë prezent në listën e dërguesve (në mes të atyre të përzier);
- Nonce, i përdorur në transaksion, është formuar saktë.
Për një dëshmi kaq të komplikuar, autorët përdorin një përzierje (një nga autorët, për të thënë, ka marrë pjesë në krijimin e saj) dhe , të cilin e quajnë Sigma-bullets. Dëshmia formale e këtij pretendimi — është një detyrë mjaft e komplikuar, dhe ajo kufizon ndjeshëm numrin e atyre që dëshirojnë të angazhohen në implementimin e teknologjisë.
Çfarë doli përfundimisht?
Nga pikëpamja jonë, pjesa e Zether që sjell intimitet në blockchain-et e bazuara në llogari, mund të përdoret tashmë. Por aktualisht versioni anonim i teknologjisë ka vendosur kufizime të rëndësishme mbi përdorimin e saj, dhe kompleksiteti i saj - mbi implementimin. Megjithatë, nuk duhet të injorojmë faktin se autorët e lanë atë vetëm disa muaj më parë, dhe ndoshta dikush tjetër do të gjejë zgjidhjen për problemet ekzistuese sot. Sepse kështu bëhet shkenca.
Burimi: habr.com
