Jak zk-SNARKs Poprawiają System Binance Proof of Reserves

2023-02-10

Co Warto Wiedzieć

  • W listopadzie 2022 roku, Binance wydało swój system Proof of Reserves wykorzystujący kryptografię drzewa Merkle, aby umożliwić użytkownikom weryfikację swoich zasobów.

  • Binance poprawiło teraz swoje rozwiązanie, wdrażając zk-SNARKs, formę dowodu zerowej wiedzy.

  • Użytkownicy mogą teraz sprawdzić, że całkowite saldo netto każdego konta jest nieujemne i że wszystkie aktywa użytkownika są częścią deklarowanego przez Binance, całkowitego salda netto aktywów użytkownika – w sposób prywatny i bezpieczny.

Zajrzyj pod maskę nowego rozwiązania Binance w zakresie proof-of-reserves. Łącząc informacje zk-SNARKs i drzewa Merkle, daje użytkownikom nowy i ulepszony sposób weryfikacji stanu rezerw Binance.

W ciągu ostatnich kilku miesięcy, zespół dev Binance ciężko pracował nad budową zaawansowanych rozwiązań proof-of-solvency. Takie narzędzia stały się krytyczne dla scentralizowanych giełd krypto w obliczu kryzysu zaufania, który ogarnął branżę w następstwie upadku FTX. Środki użytkowników przechowywane na Binance mają pokrycie w stosunku 1:1 plus rezerwy, a znalezienie sposobu na udowodnienie tego opinii publicznej bezproblemowo, stało się główną częścią planu Binance, aby przywrócić zaufanie do branży. 

W listopadzie 2022, wydaliśmy nasz system proof-of-reserves, wykorzystujący technikę kryptograficzną drzewa Merkle, aby umożliwić użytkownikom weryfikację ich zasobów na Binance. Mimo że jest to postęp w dążeniu Binance do przejrzystości funduszy użytkowników, początkowy projekt tego rozwiązania miał dwie wady:

  1. Aby chronić prywatność użytkowników, węzły liścia w dowodzie Merkle'a reprezentowały hashe zasobów użytkowników – w ten sposób, korzeń Merkle'a nie mógł odzwierciedlać sumy informacji o jego saldzie węzłów liścia.

  1. Podmiot, którego rezerwy były weryfikowane, mógł potencjalnie dodać ujemne saldo pod fałszywym kontem gdzieś w drzewie, aby sprawić, że całkowite wymagane rezerwy wydadzą się mniejsze. Poniższy diagram z bloga Vitalika Buterina pokazuje przykład takiego złośliwego drzewa Merkle'a (choć w tym przypadku, korzeń odzwierciedla sumę sald wszystkich węzłów liści, co może wprowadzać problemy z prywatnością).

Mamy teraz rozwiązanie, które może naprawić te niedociągnięcia, a tym samym wzmocnić system proof-of-reserves Binance. Opierając się na protokołach dowodu zerowej wiedzy, zk-SNARKs, możemy udowodnić, że:

  1. Wszystkie węzły liścia drzewa Merkle przyczyniły się do potwierdzonego przez Binance, całkowitego salda użytkownika każdego z aktywów.

  2. W drzewie Merkle'a nie ma użytkownika z ujemnym łącznym saldem netto (łączna wartość USD wszystkich posiadanych przez użytkownika aktywów).

Słowo o Ujemnym Saldzie i Wydajności

Ponieważ Binance oferuje produkty związane z margin, pożyczkami krypto i handlem futures, saldo każdego użytkownika w każdym z aktywów krypto, może składać się z aktywów i pasywów. Saldo użytkownika w danym aktywie krypto może być ujemne, ale jego całkowite saldo netto we wszystkich aktywach krypto nie powinno być ujemne (ponieważ wszystkie pożyczki są w pełni zabezpieczone).

W tym hipotetycznym scenariuszu, powiedzmy, że Alice zdeponowała 10 000 BUSD w Binance, a następnie użyła 4000 BUSD jako zabezpieczenia, aby pożyczyć 2 BNB (po kursie 1 BNB = 1000 BUSD, zakładając, że Binance zawsze stosuje wyższe zabezpieczenia). Poniższa tabela przedstawia bilans Alice.

BNB (cena: 1000 BUSD)

BUSD (cena: 1 BUSD)

Łączne Saldo Netto (BUSD)

Aktywa

Pasywa

Aktywa

Pasywa

ALICE

2

2

10 000

0

10 000

Jeśli Alice wymieni 1 BNB na 1 000 BUSD z Bobem (który również zdeponował 10 000 BUSD), ich bilans po dopasowaniu transakcji będzie wyglądał tak:

BNB (cena: 1000 BUSD)

BUSD (cena: 1 BUSD)

Łączne Saldo Netto (BUSD)

Aktywa

Pasywa

Aktywa

Pasywa

ALICE

1

2

11 000

0

10 000

Bob

1

0

9000

0

10 000

W tym przypadku, saldo BNB Alice wyniesie -1, co nie jest prawidłowym węzłem w drzewie Merkle'a i co obejmuje tylko jeden składnik majątku: BNB. Jeśli jednak patrzymy na całkowite salda netto, to Alice nadal jest na poziomie 10 000 BUSD.

Kolejne wyzwanie wynika z samej skali bazy użytkowników Binance. Realne rozwiązanie musi generować dowód użytkownika i dowód zk-SNARK dla dziesiątek milionów użytkowników, z których niektórzy mogą posiadać ponad 300 aktywów krypto na naszej platformie. 

W sumie, chcemy w rozsądnym czasie dostarczyć dowód na następujące fakty:

  1. Aktywa każdego użytkownika Binance są częścią naszego deklarowanego całkowitego salda użytkownika pokazanego na snapshocie. Użytkownicy mogą zweryfikować nasze deklarowane całkowite saldo użytkownika z aktywami przechowywanymi na adresach kontrolowanych przez Binance za pomocą eksploratora blockchain (jak Etherscan dla portfeli Ethereum lub BscScan dla portfeli BNB Chain).

  2. Całkowite saldo netto każdego użytkownika jest nieujemne, co oznacza, że Binance nie stworzyło kont atrap z ujemnym saldem, aby sztucznie zmniejszyć wielkość naszych zweryfikowanych rezerw.

Czym Są zk-SNARKs?

Zanim zagłębimy się w szczegóły naszego rozwiązania, warto przedstawić krótki przegląd mechanizmu dowodu zerowej wiedzy. Protokoły zerowej wiedzy, takie jak zk-SNARK, pozwalają jednej stronie, przeprowadzającemu dowód, zademonstrować innej stronie, weryfikatorowi, że przeprowadzający dowód wykonał dokładnie pewne obliczenia, z pewnymi danymi wejściowymi, przy pewnych ograniczeniach, a wszystko to bez ujawniania danych wejściowych. Obliczenia mogą być czasochłonne, ale leżący u ich podstaw mechanizm matematyczny może pomóc weryfikatorowi ocenić dowód szybko i bezpiecznie.

Przeprowadzający dowód (Binance) zaczyna od zdefiniowania zestawu ograniczeń obliczeń, które chce udowodnić. Ograniczenia są zdefiniowane w obwodach, które można wyrazić w języku programowania wyższego poziomu (w naszym przypadku, wersja sforkowana gnark).

Następnie przeprowadzający dowód wykonuje ciężkie obliczenia, hashując wszystkie ID użytkowników i bilanse oraz generuje dowód na to, że obliczenia spełniają określone wcześniej ograniczenia. Aby to zrobić, używa śladu obliczeniowego (świadka) i publicznych lub prywatnych danych wejściowych. 

Weryfikator (użytkownik) otrzymuje dowód i weryfikuje go z publicznymi danymi wejściowymi obwodu, by upewnić się, że obliczenia zostały wykonane dokładnie z zachowaniem wszystkich ograniczeń. Obliczenia weryfikacyjne trwają niezwykle krótko w porównaniu z czasem przeprowadzania dowodu. Jeśli przeprowadzający dowód nie wygeneruje dowodu na predefiniowanych obwodach, nie może wyprodukować ważnego dowodu, aby przejść weryfikację.

Aby zajrzeć głębiej pod maskę zk-SNARKs, można zapoznać się z tą serią artykułów.

Nasze Rozwiązanie

Podstawowym budulcem zmodernizowanego rozwiązania proof-of-reserves jest nadal drzewo Merkle. Dla powyższego przykładu, wyglądałoby to tak:

Oprócz drzewa Merkle, utrzymujemy również globalny stan, który reprezentuje listę całkowitych sald netto każdego aktywa, które posiada każdy klient Binance.

Aby udowodnić nasze rezerwy, wygenerujemy zk-SNARK dowód konstrukcji drzewa Merkle. Dla każdego zestawu sald użytkownika – węzła liścia drzewa Merkle – nasz układ upewniłby się, że:

  1. Każde saldo aktywów tego użytkownika jest uwzględnione w globalnej liście stanów, o której mowa powyżej.

  2. Całkowite saldo netto użytkownika nie jest ujemne. 

  3. Zmiana korzenia drzewa Merkle jest ważna po aktualizacji informacji tego użytkownika do hasha węzła liścia.

Proszę odnieść się do tej specyfikacji technicznej i naszego kodu źródłowego dla obwodu (ograniczenia) szczegółów implementacji. 

W każdym przypadku udowodniania naszych rezerw, będziemy publikować:

1. Dowód Merkle: hashe dla każdego użytkownika (dla Alice, reprezentowanej przez niebieskie węzły na powyższym rysunku).

2. Dowody zk-SNARK i publiczne dane wejściowe (hash z listy całkowitych sald netto każdego z aktywów oraz korzeń Merkle) układu dla wszystkich użytkowników. 

Weryfikując dowód Merkle'a, użytkownicy mogą upewnić się, że ich bilans znajduje się w korzeniu drzewa Merkle'a. Weryfikując dowód zk-SNARK, użytkownicy mogą upewnić się, że konstrukcja drzewa Merkle'a spełnia ograniczenia zdefiniowane w układzie.

Bezpieczeństwo tego rozwiązania w dużej mierze opiera się na ustawieniu klucza udowadniającego i weryfikacyjnego. Pracujemy nad zdecentralizowaną konfiguracją kluczy. Jeśli chodzi o istniejące zdecentralizowane zaufane protokoły ustawień, protokół Ethereum oferuje dobry przykład. Jesteśmy bardzo blisko posiadania rozwiązania MPC, które sprawi, że konfiguracja nie będzie wymagała zaufania.

Wydajność

Biorąc pod uwagę liczbę użytkowników Binance, których salda powinny być uwzględnione, nie ma możliwości uzyskania pojedynczego dowodu konstrukcji drzewa Merkle, który obejmowałby wszystkich użytkowników jednocześnie. Rozwiązaniem tego problemu jest podzielenie użytkowników na partie po 864 osoby, tak aby mieć układ o mniejszej skali i równoległe procedury udowadniania.

Dla partii, która zawiera 864 użytkowników, gdzie każdy użytkownik posiada 350 różnych aktywów, załóżmy, że każde saldo aktywów jest w zakresie [0, 2^64-1]. Przy 32-rdzeniowym serwerze 128GB, czas generowania dowodu zk wynosi około 110 sekund, a czas weryfikacji dowodu jest mniejszy niż 1 milisekunda. 

Binance uruchomi przeprowadzenie 1000 dowodów jednocześnie, tak aby w ciągu 2 godzin wygenerować dowód dla wszystkich kont. Koszt tego serwera przeprowadzającego dowód na jedną godzinę wynosi około 0,56 USD, więc całkowity koszt wygenerowania wszystkich dowodów zk obejmujących wszystkich użytkowników wyniósłby około 1000 USD.

Wniosek

Pierwszą iterację dowodów dla użytkowników wygenerowanych przez to nowe rozwiązanie, przedstawimy w kolejnym ogłoszeniu o proof-of-reserves. Ponadto, udostępniliśmy na zasadach open-sourcingu nasz procesor danych użytkownika, przeprowadzający dowód, układ i weryfikator, dzięki czemu każda scentralizowana giełda opierająca się na tym samym modelu co my, może łatwo wygenerować dowód dla swoich użytkowników i aktywów. 

Mamy nadzieję, że będzie to miało zasadniczy wpływ na przesunięcie przejrzystości branży aktywów cyfrowych na nowy poziom.  Pracujemy również nad wdrożeniem rozwiązania wspomnianego na blogu Vitalika w celu uzyskania lepszej wydajności, co pozwoli nam na częstsze udostępnianie dowodu, przy niższych kosztach.

Ponieważ jest to pierwsza wersja naszego zk-SNARK, z niecierpliwością czekamy na otrzymanie informacji zwrotnej od społeczności, abyśmy mogli kontynuować ulepszanie systemu.

Kod i Dalsze Lektury