Główne wnioski

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

  • Binance udoskonaliła swoje rozwiązanie poprzez implementację zk-SNARKs, czyli formy dowodu zerowej wiedzy.

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

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

Przez ostatnie kilka miesięcy zespół deweloperów Binance ciężko pracował nad tworzeniem zaawansowanych rozwiązań proof-of-solvency. Takie narzędzia stały się krytyczne dla scentralizowanych giełd kryptowalut w obliczu kryzysu zaufania, który ogarnął branżę w następstwie upadku FTX. Środki użytkowników przechowywane na Binance są zabezpieczone w stosunku 1:1, plus rezerwy, a znalezienie sposobu na bezproblemowe udowodnienie tego opinii publicznej stało się ważną częścią planu Binance mającego na celu przywrócenie zaufania branży.

W listopadzie 2022 r. udostępniliśmy nasz system proof-of-reserves wykorzystujący technikę kryptograficzną Merkle tree, aby umożliwić użytkownikom weryfikację ich zasobów na Binance. Chociaż był 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ściowe w dowodzie Merkle’a reprezentowały skrót zasobów użytkowników – w związku z tym korzeń Merkle’a nie mógł odzwierciedlać sumy informacji o saldzie swoich węzłów liściowych.

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

Teraz mamy rozwiązanie, które może zaradzić tym niedociągnięciom i tym samym wzmocnić system dowodu rezerw Binance. Opierając się na protokołach dowodu zerowej wiedzy, zk-SNARKs, możemy udowodnić, że:

  1. Wszystkie węzły liściowe drzewa Merkle’a przyczyniły się do całkowitego salda użytkownika każdego zasobu podanego przez Binance.

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

Słowo o ujemnych saldach i wynikach

Ponieważ Binance oferuje produkty z marżą, kryptopożyczkami i instrumentami futures, saldo każdego kryptoaktywa każdego użytkownika może składać się z aktywów i zobowiązań. Saldo użytkownika konkretnego kryptoaktywa może być ujemne, ale jego całkowite saldo netto we wszystkich kryptoaktywach nie powinno być ujemne (ponieważ wszystkie pożyczki są w pełni zabezpieczone).

W tym hipotetycznym scenariuszu załóżmy, że Alicja wpłaciła 10 000 BUSD do Binance, a następnie wykorzystała 4000 BUSD jako zabezpieczenie, aby pożyczyć 2 BNB (przy stawce 1 BNB = 1000 BUSD, zakładając, że Binance zawsze stosuje nadmierne zabezpieczenie). Poniższa tabela przedstawia bilans Alicji.

BNB (cena: 1000 BUSD)

BUSD (cena: 1 BUSD)

Całkowity bilans netto (BUSD)

Aktywa

Zadłużenie

Aktywa

Zadłużenie

Alicja

2

2

10000

0

10000

Jeśli Alicja wymieni 1 BNB na 1000 BUSD z Bobem (który również wpłacił 10 000 BUSD), ich bilans po dopasowaniu transakcji będzie wyglądał następująco:

BNB (cena: 1000 BUSD)

BUSD (cena: 1 BUSD)

Całkowity bilans netto (BUSD)

Aktywa

Zadłużenie

Aktywa

Zadłużenie

Alicja

1

2

11000

0

10000

Pion

1

0

9000

0

10000

W tym przypadku saldo BNB Alicji wyniesie -1, co nie jest prawidłowym węzłem w drzewie Merkle’a i obejmuje tylko jeden składnik aktywów: BNB. Jednak jeśli spojrzymy na całkowite salda netto, Alicja nadal ma 10 000.

Kolejnym wyzwaniem jest ogromna skala bazy użytkowników Binance. Realne rozwiązanie musi generować dowody użytkownika i dowody zk-SNARK dla dziesiątek milionów użytkowników, z których niektórzy mogą posiadać ponad 300 aktywów kryptograficznych na naszej platformie.

Ogólnie rzecz biorąc, chcemy przedstawić dowód następujących faktów w rozsądnym przedziale czasowym:

  1. Aktywa każdego użytkownika Binance są częścią naszego deklarowanego całkowitego salda użytkownika pokazanego w migawce. Użytkownicy mogą zweryfikować nasze deklarowane całkowite saldo użytkownika w stosunku do aktywów przechowywanych na adresach kontrolowanych przez Binance za pomocą eksploratora blockchain (takiego 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 utworzyło fikcyjnych kont z ujemnym saldem, aby sztucznie zmniejszyć rozmiar naszych zweryfikowanych rezerw.

Czym są zk-SNARKs?

Zanim zagłębimy się w szczegóły naszego rozwiązania, należy krótko omówić mechanizm dowodu zerowej wiedzy. Protokoły zerowej wiedzy, takie jak zk-SNARK, pozwalają jednej stronie, dowodzącemu, zademonstrować drugiej stronie, weryfikatorowi, że dowodzący wykonał pewne obliczenia dokładnie z pewnymi danymi wejściowymi i przy pewnych ograniczeniach, 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.

Prover (Binance) zaczyna od zdefiniowania zestawu ograniczeń obliczeń, które chce udowodnić. Ograniczenia są definiowane w obwodach, które można wyrazić w języku programowania wyższego poziomu (w naszym przypadku w rozwidlonej wersji gnark).

Następnie program dowodzący wykonuje ciężkie obliczenia, hashując identyfikatory i bilanse wszystkich użytkowników, i generuje dowód, że obliczenia spełniają ograniczenia określone wcześniej. W tym celu wykorzystuje ślad obliczeń (świadka) oraz publiczne lub prywatne dane wejściowe.

Weryfikator (użytkownik) otrzymuje dowód i weryfikuje go z publicznym wejściem obwodu, aby upewnić się, że obliczenia zostały wykonane dokładnie, przy spełnieniu wszystkich ograniczeń. Obliczenia weryfikacyjne zajmują niezwykle krótki czas w porównaniu z czasem dowodzenia. Jeśli dowodzący nie wygeneruje dowodu na wstępnie zdefiniowanych obwodach, nie może wytworzyć ważnego dowodu, aby przejść weryfikację.

Aby przyjrzeć się bliżej zk-SNARKs, możesz zapoznać się z tą serią artykułów.

Nasze rozwiązanie

Podstawowym elementem ulepszonego rozwiązania proof-of-reserves jest nadal drzewo Merkle'a. W powyższym przykładzie wyglądałoby to tak:

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

Aby udowodnić nasze rezerwy, wygenerujemy dowód zk-SNARK dla konstrukcji drzewa Merkle’a. Dla każdego zbioru bilansowego użytkownika – węzła liścia drzewa Merkle’a – nasz obwód upewni się, że:

  1. Saldo każdego zasobu tego użytkownika jest zawarte na globalnej liście stanów, o której mowa powyżej.

  2. Całkowity bilans netto użytkownika nie jest ujemny.

  3. Zmiana korzenia drzewa Merkle’a jest ważna po zaktualizowaniu informacji o tym użytkowniku w hashu węzła liścia.

Aby uzyskać szczegółowe informacje na temat implementacji, zapoznaj się z niniejszą specyfikacją techniczną i naszym kodem źródłowym obwodu (ograniczenia).

W każdym przypadku udowodnienia naszych rezerw opublikujemy:

1. Dowód Merkle’a: skróty dla każdego użytkownika (dla Alicji, reprezentowanego przez niebieskie węzły na powyższym obrazku).

2. Dowody zk-SNARK i publiczne dane wejściowe (skrót listy całkowitych sald netto każdego składnika aktywów i pierwiastka Merkle'a) obwodu dla wszystkich użytkowników.

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

Bezpieczeństwo tego rozwiązania w dużym stopniu opiera się na konfiguracji klucza dowodowego i klucza weryfikacyjnego. Pracujemy nad zdecentralizowaną konfiguracją kluczy. Jeśli chodzi o istniejące zdecentralizowane zaufane ceremonie konfiguracji, ceremonia Ethereum oferuje dobry przykład. Jesteśmy bardzo blisko rozwiązania MPC, które sprawi, że konfiguracja będzie bezzaufana.

Wydajność

Biorąc pod uwagę liczbę użytkowników Binance, których salda powinny zostać uwzględnione, nie ma sposobu na uzyskanie pojedynczego dowodu konstrukcji drzewa Merkle’a, który obejmowałby wszystkich użytkowników naraz. Rozwiązaniem tego problemu jest podzielenie użytkowników na partie po 864, aby uzyskać mniejszy obwód i równoległe procedury dowodzenia.

W przypadku partii zawierającej 864 użytkowników, z których każdy posiada 350 różnych aktywów, załóżmy, że saldo każdego aktywa mieści się w zakresie [0, 2^64-1]. W przypadku serwera 32-rdzeniowego 128 GB czas generowania dowodu zk wynosi około 110 sekund, a czas weryfikacji dowodu jest krótszy niż 1 milisekunda.

Binance uruchomi 1000 prooferów jednocześnie, aby wygenerować dowód dla wszystkich kont w ciągu 2 godzin. Koszt tego serwera proofera za 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ę dowodu dla użytkowników wygenerowanych przez to nowe rozwiązanie udostępnimy w kolejnym ogłoszeniu dotyczącym dowodu rezerw. Ponadto udostępniliśmy jako oprogramowanie typu open source nasz procesor danych użytkowników, dowodzący, obwód i weryfikator, tak aby każda scentralizowana giełda polegająca na tym samym modelu co my mogła łatwo generować dowody dla swoich użytkowników i zasobów.

Mamy nadzieję, że będzie to miało zasadnicze znaczenie dla zwiększenia przejrzystości branży aktywów cyfrowych na nowy poziom. Pracujemy również nad wdrożeniem rozwiązania wspomnianego na blogu Vitalika, aby osiągnąć lepszą wydajność, co pozwoli nam częściej dostarczać dowody przy niższych kosztach.

Ponieważ jest to pierwsza wersja naszego zk-SNARK, z niecierpliwością czekamy na opinie społeczności, dzięki którym będziemy mogli dalej udoskonalać system.

Kod i dalsza lektura

  • Nasz kod źródłowy

  • Dowód rezerw Binance: Czym jest drzewo Merkle’a

  • Binance Academy — poprawa przejrzystości kryptowalut dzięki dowodowi zerowej wiedzy

  • Blog Vitalika: Bezpieczne CEX: dowód wypłacalności i nie tylko