O anonimowości w blockchainach opartych na kontach

Tematem anonimowości w kryptowalutach interesujemy się już od dawna i staramy się śledzić rozwój technologii w tym zakresie. W naszych artykułach szczegółowo omówiliśmy już zasady działania poufne transakcje w Monero, a także przeprowadzono przegląd porównawczy technologie istniejące w tej dziedzinie. Jednak wszystkie obecnie anonimowe kryptowaluty są zbudowane w oparciu o model danych zaproponowany przez Bitcoin – Unspent Transaction Output (zwany dalej UTXO). W przypadku łańcuchów bloków opartych na kontach, takich jak Ethereum, istniejące rozwiązania zapewniające anonimowość i poufność (na przykład Mobius lub Aztek) próbował replikować model UTXO w inteligentnych kontraktach.

W lutym 2019 r. grupa badaczy z Uniwersytetu Stanforda i Visa Research wydany preprint „Zether: W stronę prywatności w świecie inteligentnych kontraktów”. Autorzy jako pierwsi zaproponowali podejście do zapewnienia anonimowości w blockchainach opartych na kontach i zaprezentowali dwie wersje inteligentnego kontraktu: dla transakcji poufnych (ukrywanie sald i kwot przelewów) oraz anonimowych (ukrywanie odbiorcy i nadawcy). Uważamy proponowaną technologię za interesującą i chcielibyśmy podzielić się jej projektem, a także porozmawiać o tym, dlaczego problem anonimowości w blockchainach opartych na kontach jest uważany za bardzo trudny i czy autorom udało się go w pełni rozwiązać.

O strukturze tych modeli danych

W modelu UTXO transakcja składa się z „wejść” i „wyjść”. Bezpośrednim odpowiednikiem „wyników” są rachunki w portfelu: każdy „wynik” ma jakiś nominał. Kiedy płacisz komuś (tworząc transakcję), wydajesz jeden lub więcej „wyjść”, w którym to przypadku stają się one „wejściami” transakcji, a łańcuch bloków oznacza je jako wydane. W takim przypadku odbiorca Twojej płatności (lub Ty sam, jeśli potrzebujesz zmiany) otrzymuje nowo wygenerowane „wyjścia”. Można to przedstawić schematycznie w następujący sposób:

O anonimowości w blockchainach opartych na kontach

Blockchainy oparte na kontach mają strukturę podobną do konta bankowego. Dotyczą tylko kwoty na Twoim koncie i kwoty przelewu. Przelewając jakąś kwotę ze swojego konta, nie spalasz żadnych „wydatków”, sieć nie musi pamiętać, które monety zostały wydane, a które nie. W najprostszym przypadku weryfikacja transakcji sprowadza się do sprawdzenia podpisu nadawcy oraz stanu jego salda:

O anonimowości w blockchainach opartych na kontach

Analiza technologii

Następnie porozmawiamy o tym, jak Zether ukrywa kwotę transakcji, odbiorcę i nadawcę. Opisując zasady jego działania, zwrócimy uwagę na różnice w wersji poufnej i anonimowej. Ponieważ znacznie łatwiej jest zapewnić poufność w blockchainach opartych na kontach, niektóre ograniczenia nałożone przez anonimizację nie będą miały zastosowania w przypadku poufnej wersji tej technologii.

Ukrywanie sald i kwot przelewów

Schemat szyfrowania służy do szyfrowania sald i kwot przelewów w Zether El Gamal. Działa to w następujący sposób. Kiedy Alicja chce wysłać Boba b monety według adresu (jego klucza publicznego) Y, wybiera losową liczbę r i szyfruje kwotę:

O anonimowości w blockchainach opartych na kontach
gdzie C - zaszyfrowana kwota, D - wartość pomocnicza niezbędna do rozszyfrowania tej kwoty, G - stały punkt na krzywej eliptycznej, pomnożony przez klucz tajny otrzymuje się klucz publiczny.

Kiedy Bob otrzymuje te wartości, po prostu dodaje je w ten sam sposób do swojego zaszyfrowanego salda, dlatego ten schemat jest wygodny.

Podobnie Alicja odejmuje od swojego salda te same wartości, tylko jako Y używa Twojego klucza publicznego.

Ukrywanie odbiorcy i nadawcy

Tasowanie „wyjść” w UTXO sięga początków kryptowalut i pomaga ukryć nadawcę. W tym celu nadawca sam wykonując przelew zbiera losowe „wyjścia” w blockchainie i miesza je z własnymi. Następnie podpisuje „wyjścia” podpisem pierścieniowym – mechanizmem kryptograficznym, który pozwala mu przekonać weryfikatora, że ​​wśród zaangażowanych „wyników” znajdują się monety nadawcy. Same mieszane monety oczywiście nie są wydawane.

Nie będziemy jednak w stanie wygenerować fałszywych wyników, aby ukryć odbiorcę. Dlatego w UTXO każde „wyjście” ma swój własny, unikalny adres i jest kryptograficznie powiązane z adresem odbiorcy tych monet. W tej chwili nie ma możliwości zidentyfikowania związku pomiędzy unikalnym adresem wyjściowym a adresem odbiorcy bez znajomości jego tajnych kluczy.

W modelu kontowym nie możemy korzystać z adresów jednorazowych (w przeciwnym razie będzie to już model „wyjściowy”). Dlatego odbiorca i nadawca muszą być mieszani z innymi kontami w łańcuchu bloków. W tym przypadku z rachunków mieszanych pobierane jest zaszyfrowane 0 monet (lub dodawane jest 0, jeśli odbiorca jest mieszany), bez faktycznej zmiany ich rzeczywistego salda.

Ponieważ zarówno nadawca, jak i odbiorca mają zawsze stały adres, konieczne staje się użycie tych samych grup do mieszania podczas przesyłania na te same adresy. Łatwiej spojrzeć na to na przykładzie.

Załóżmy, że Alicja decyduje się przekazać datki na rzecz fundacji Boba, ale woli, aby przekaz pozostał anonimowy dla zewnętrznego obserwatora. Następnie, aby zamaskować się w polu nadawcy, wchodzi także na konta Adama i Adele. Aby ukryć Boba, dodaj konta Bena i Billa w polu odbiorcy. Dokonując kolejnego wpisu, Alice zdecydowała się napisać Alexa i Amandę obok siebie oraz Bruce’a i Benjena obok Boba. W tym przypadku, analizując blockchain, w tych dwóch transakcjach występuje tylko jedna przecinająca się para uczestników – Alicja i Bob, co deanonimizuje te transakcje.

O anonimowości w blockchainach opartych na kontach

Wyścigi transakcyjne

Jak już wspomnieliśmy, aby ukryć saldo w systemach opartych na koncie, użytkownik szyfruje swoje saldo i kwotę przelewu. Jednocześnie musi udowodnić, że saldo na jego koncie pozostaje nieujemne. Problem w tym, że użytkownik tworząc transakcję buduje dowód dotyczący aktualnego stanu jego konta. Co się stanie, jeśli Bob wyśle ​​transakcję do Alicji i zostanie ona zaakceptowana przed transakcją wysłaną przez Alicję? Wtedy transakcja Alicji zostanie uznana za nieważną, ponieważ dowód salda został zbudowany przed przyjęciem transakcji Boba.

O anonimowości w blockchainach opartych na kontach

Pierwszą decyzją, jaka zapada w takiej sytuacji, jest zamrożenie konta do czasu realizacji transakcji. Ale to podejście nie jest odpowiednie, ponieważ oprócz złożoności rozwiązania takiego problemu w systemie rozproszonym, w anonimowym schemacie nie będzie jasne, czyje konto zablokować.

Aby rozwiązać ten problem, technologia oddziela transakcje przychodzące i wychodzące: wydatki mają natychmiastowy wpływ na bilans, podczas gdy wpływy mają wpływ z opóźnieniem. Aby to zrobić, wprowadzono pojęcie „epoki” - grupy bloków o stałym rozmiarze. Bieżącą „epokę” wyznacza się dzieląc wysokość bloku przez wielkość grupy. Podczas przetwarzania transakcji sieć natychmiast aktualizuje saldo nadawcy i przechowuje środki odbiorcy w zbiorniku magazynującym. Zgromadzone środki zostają udostępnione odbiorcy dopiero w momencie rozpoczęcia nowej „ery”.

Dzięki temu użytkownik może wysyłać transakcje niezależnie od częstotliwości otrzymywania środków (oczywiście na tyle, na ile pozwala mu saldo). Rozmiar epoki jest określany na podstawie szybkości propagacji bloków w sieci i szybkości wprowadzania transakcji do bloku.

Rozwiązanie to sprawdza się w przypadku przelewów poufnych, jednak przy transakcjach anonimowych, jak zobaczymy później, stwarza poważne problemy.

Ochrona przed atakami polegającymi na powtórzeniu

W blockchainach kontowych każda transakcja jest podpisana kluczem prywatnym nadawcy, co utwierdza weryfikatora, że ​​transakcja nie została zmodyfikowana i została utworzona przez właściciela tego klucza. Co jednak, jeśli atakujący nasłuchujący kanału transmisji przechwyci tę wiadomość i wyśle ​​dokładnie tę samą drugą wiadomość? Weryfikator zweryfikuje podpis transakcji i przekona się o jej autorstwie, a sieć ponownie odpisze tę samą kwotę z salda nadawcy.

Atak ten nazywany jest atakiem powtórzeniowym. W modelu UTXO takie ataki nie mają znaczenia, ponieważ osoba atakująca będzie próbowała wykorzystać zużyte dane wyjściowe, co samo w sobie jest nieważne i zostanie odrzucone przez sieć.

Aby temu zapobiec, w transakcję wbudowane jest pole z losowymi danymi, które nazywane jest nonce lub po prostu „solą”. Podczas ponownego przesyłania transakcji z solą weryfikator sprawdza, czy wartość jednorazowa została już wcześniej użyta, a jeśli nie, uznaje transakcję za ważną. Aby nie przechowywać w blockchainie całej historii noncesów użytkowników, zwykle już przy pierwszej transakcji ustawia się ją na zero, a następnie zwiększa o jeden. Sieć może jedynie sprawdzić, czy wartość jednorazowa nowej transakcji różni się pojedynczo od poprzedniej.

W schemacie przelewu anonimowego pojawia się problem walidacji jednorazowych transakcji. Nie możemy jednoznacznie powiązać wartości jednorazowej z adresem nadawcy, ponieważ oczywiście powoduje to deanonimizację przekazu. Nie możemy również dodać jednego do nonces wszystkich uczestniczących kont, ponieważ może to kolidować z przetwarzaniem innych przelewów.

Autorzy Zethera proponują kryptograficzne generowanie nonce w zależności od „epoki”. Na przykład:

O anonimowości w blockchainach opartych na kontach
Tutaj x jest tajnym kluczem nadawcy, oraz Gepoch — dodatkowy generator dla epoki, uzyskany poprzez hashowanie ciągu znaków w postaci „Zether +”. Teraz problem wydaje się rozwiązany – nie ujawniamy nonce nadawcy i nie ingerujemy w nonce niezaangażowanych uczestników. Jednak takie podejście nakłada poważne ograniczenie: jedno konto może wysłać nie więcej niż jedną transakcję na „epokę”. Problem ten niestety pozostaje nierozwiązany i obecnie, naszym zdaniem, anonimowa wersja Zethera raczej nie nadaje się do użytku.

Złożoność dowodów wiedzy zerowej

W UTXO nadawca musi udowodnić sieci, że nie wydaje kwoty ujemnej, w przeciwnym razie możliwe stanie się generowanie nowych monet z powietrza (dlaczego jest to możliwe, pisaliśmy w jednym z poprzednich artykuły). A także podpisz „wejścia” podpisem pierścieniowym, aby udowodnić, że wśród mieszanych monet znajdują się środki należące do niego.

W anonimowej wersji blockchainu opartego na kontach wyrażenia potwierdzające są znacznie bardziej złożone. Nadawca udowadnia, że:

  1. Wysłana kwota jest dodatnia;
  2. Saldo pozostaje nieujemne;
  3. nadawca poprawnie zaszyfrował kwoty przelewu (w tym zero);
  4. Saldo na saldzie zmienia się tylko dla nadawcy i odbiorcy;
  5. Nadawca jest właścicielem klucza prywatnego do swojego konta i faktycznie znajduje się na liście nadawców (wśród zaangażowanych);
  6. Wartość jednorazowa użyta w transakcji jest złożona poprawnie.

Do tak złożonego dowodu autorzy stosują mieszaninę Kuloodporny (nawiasem mówiąc, jeden z autorów brał udział w jego tworzeniu) i Protokół Sigmy, które nazywane są kulami Sigma. Formalne udowodnienie takiego stwierdzenia jest zadaniem dość trudnym i znacznie ogranicza liczbę osób chętnych do wdrożenia technologii.

Wynik?

Naszym zdaniem część Zether, która zapewnia prywatność blockchainom opartym na kontach, może być już teraz używana. Jednak w tej chwili anonimowa wersja tej technologii nakłada poważne ograniczenia na jej wykorzystanie i złożoność na jej wdrożenie. Nie należy jednak pomijać faktu, że autorzy wypuścili go zaledwie kilka miesięcy temu i być może ktoś inny znajdzie rozwiązanie problemów, które istnieją dzisiaj. W końcu tak się robi naukę.

Źródło: www.habr.com

Dodaj komentarz