Der Hauptpunkt

  • Im November 2022 veröffentlichte Binance ein Proof-of-Reserve-System, das Merkle-Baum-Kryptografie verwendet, um Benutzern die Überprüfung ihrer Bestände zu ermöglichen.

  • Binance hat seine Lösung nun durch die Implementierung von zk-SNARK, einer Form des Zero-Knowledge-Proofs, erweitert.

  • Benutzer können jetzt privat und sicher überprüfen, ob der gesamte Nettosaldo jedes Kontos nicht negativ ist und dass alle Benutzervermögenswerte Teil des gesamten Nettosaldos der von Binance beanspruchten Benutzervermögenswerte sind.

Sehen Sie sich an, wie die neue Proof-of-Reserve-Lösung von Binance funktioniert. Durch die Kombination von zk-SNARK- und Merkle-Tree-Informationen haben Benutzer eine neue und verbesserte Möglichkeit, den Status der Binance-Reserven zu überprüfen.

In den letzten Monaten hat das Binance-Entwicklungsteam hart daran gearbeitet, einen hochmodernen Zahlungsfähigkeitsnachweis zu erstellen. Das Tool hat sich inmitten der Vertrauenskrise, die die Branche nach dem Zusammenbruch von FTX traf, zu einem entscheidenden Instrument für den zentralisierten Krypto-Austausch entwickelt. Die auf Binance gehaltenen Benutzergelder sind im Verhältnis 1:1 zuzüglich Reserven abgesichert, und die Suche nach einer Möglichkeit, dies der Öffentlichkeit problemlos nachzuweisen, war ein wesentlicher Teil des Plans von Binance, das Vertrauen der Branche wiederherzustellen.

Im November 2022 haben wir ein Proof-of-Reserve-System veröffentlicht, das die Merkle-Tree-Kryptografietechnik nutzt, um Benutzern die Überprüfung ihrer Bestände auf Binance zu ermöglichen. Obwohl dies ein Fortschritt bei der Förderung der Transparenz der Gelder der Binance-Benutzer ist, wies der ursprüngliche Entwurf dieser Lösung zwei Mängel auf:

  1. Um die Privatsphäre der Benutzer zu schützen, stellen die Blattknoten im Merkle-Beweis den Besitz-Hash des Benutzers dar – daher kann die Merkle-Wurzel nicht die Menge an Kontostandinformationen ihrer Blattknoten widerspiegeln.

  1. Unternehmen, deren Reserven gerade überprüft werden, könnten unter einem gefälschten Konto irgendwo im Baum möglicherweise einen negativen Saldo hinzufügen, um die insgesamt erforderlichen Reserven kleiner erscheinen zu lassen. Das folgende Diagramm aus Vitalik Buterins Blog zeigt ein Beispiel eines böswilligen Merkle-Baums (obwohl in diesem Fall die Wurzeln die Summe der Salden aller Blattknoten widerspiegeln, was zu Datenschutzproblemen führen könnte).

Wir haben jetzt eine Lösung, die diesen Fehler beheben und dadurch das Proof-of-Reserve-System von Binance stärken kann. Indem wir uns auf das Zero-Knowledge-Proof-Protokoll zk-SNARK verlassen, können wir Folgendes beweisen:

  1. Alle Blattknoten des Merkle-Baums haben zum gesamten Benutzerguthaben beigetragen, das Binance für jeden Vermögenswert beansprucht.

  2. Im Merkle-Baum werden keine Benutzer mit einem negativen Gesamtnettosaldo (dem gesamten USD-Wert aller Vermögenswerte im Besitz des Benutzers) berücksichtigt.

Ein Wort zu Negativsalden und Leistung

Da Binance Margin-, Krypto-Kredit- und Futures-Handelsprodukte anbietet, kann der Saldo jedes Benutzers für jedes Krypto-Asset sowohl aus Vermögenswerten als auch aus Verbindlichkeiten bestehen. Der Saldo eines Benutzers für ein bestimmtes Krypto-Asset kann negativ sein, aber sein gesamter Nettosaldo über alle Krypto-Assets hinweg kann nicht negativ sein (da alle Kredite vollständig besichert sind).

Nehmen wir in diesem hypothetischen Szenario an, dass Alice 10.000 BUSD bei Binance eingezahlt hat und dann 4.000 BUSD als Sicherheit verwendet hat, um 2 BNB zu leihen (zu einem Zinssatz von 1 BNB = 1.000 BUSD, unter der Annahme, dass Binance immer überbesichert ist). Die folgende Tabelle zeigt Alices Bilanz.

BNB (Preis: 1000 BUSD)

BUSD (Preis: 1 BUSD)

Gesamtnettosaldo (BUSD)

Vermögenswerte

Verpflichtung

Vermögenswerte

Verpflichtung

ALICE

2

2

10000

0

10000

Wenn Alice dann 1 BNB gegen 1.000 BUSD mit Bob (der ebenfalls 10.000 BUSD eingezahlt hat) handelt, würde ihre Bilanz nach dem Abgleich der Geschäfte wie folgt aussehen:

BNB (Preis: 1000 BUSD)

BUSD (Preis: 1 BUSD)

Gesamtnettosaldo (BUSD)

Vermögenswerte

Verpflichtung

Vermögenswerte

Verpflichtung

ALICE

1

2

11000

0

10000

Bob

1

0

9000

0

10000

In diesem Fall würde Alices BNB-Guthaben insgesamt -1 betragen, was kein gültiger Knoten im Merkle-Baum ist und nur einen Vermögenswert enthält: BNB. Wenn wir uns jedoch den Gesamtnettosaldo ansehen, beträgt Alice immer noch 10.000 BUSD.

Eine weitere Herausforderung ergibt sich aus der Größe der Nutzerbasis von Binance. Eine praktikable Lösung sollte Benutzernachweise und ZK-SNARK-Beweise für zig Millionen Benutzer generieren, von denen einige möglicherweise mehr als 300 Krypto-Assets auf unserer Plattform besitzen.

Insgesamt möchten wir innerhalb angemessener Frist den Nachweis folgender Sachverhalte erbringen:

  1. Das Vermögen jedes Binance-Benutzers ist Teil des Gesamtguthabens unseres beanspruchten Benutzers, das im Snapshot angezeigt wird. Benutzer können unser beanspruchtes Gesamtbenutzerguthaben anhand der Vermögenswerte überprüfen, die an von Binance kontrollierten Adressen gehalten werden, indem sie einen Blockchain-Explorer verwenden (z. B. Etherscan für Ethereum-Wallets oder BscScan für BNB-Chain-Wallets).

  2. Der Gesamtnettosaldo jedes Benutzers ist nicht negativ. Das bedeutet, dass Binance keine Scheinkonten mit negativen Salden erstellt, um die Größe unserer verifizierten Reserven künstlich zu reduzieren.

Was ist zk-SNARK?

Bevor wir uns mit den Details unserer Lösung befassen, ist ein kurzer Überblick über den Zero-Knowledge-Proof-Mechanismus angebracht. Mit Zero-Knowledge-Protokollen wie zk-SNARK kann eine Partei, nämlich der Prüfer, einer anderen Partei, nämlich dem Verifizierer, nachweisen, dass der Prüfer eine bestimmte Berechnung mit bestimmten Eingaben unter bestimmten Einschränkungen korrekt ausgeführt hat, und das alles, ohne die Eingabe offenzulegen. Die Berechnung kann zeitaufwändig sein, aber die zugrunde liegenden mathematischen Mechanismen können Prüfern dabei helfen, Beweise schnell und sicher zu bewerten.

Der Beweiser (Binance) definiert zunächst den Satz von Rechenbeschränkungen, den er beweisen möchte. Einschränkungen werden in Schaltkreisen definiert, die in einer höheren Programmiersprache (in unserem Fall einer gespaltenen Version von Gnark) ausgedrückt werden können.

Der Prüfer führt dann umfangreiche Berechnungen durch, hasht die IDs und Bilanzen aller Benutzer und erstellt einen rechnerischen Beweis, der die vordefinierten Einschränkungen erfüllt. Dazu nutzt es rechnerische Spuren (Zeugen) und öffentliche oder private Eingaben.

Der Verifizierer (Benutzer) erhält einen Beweis und verifiziert ihn mit öffentlichen Eingaben von der Schaltung, um sich zu vergewissern, dass die Berechnung korrekt und unter Einhaltung aller Einschränkungen ausgeführt wurde. Die Überprüfungsberechnung dauert im Vergleich zur Beweiszeit sehr kurz. Wenn der Prüfer auf einem vordefinierten Schaltkreis keinen Beweis erbringt, kann er keinen gültigen Beweis erbringen, um die Verifizierung zu bestehen.

Um einen tieferen Einblick in die Funktionsweise von zk-SNARK zu erhalten, können Sie sich diese Artikelserie ansehen.

Unsere Lösung

Der grundlegende Baustein einer verbesserten Proof-of-Reserve-Lösung ist nach wie vor der Merkle-Baum. Für das obige Beispiel würde es so aussehen:

Zusätzlich zum Merkle-Baum pflegen wir auch einen globalen Status, der eine Liste des Gesamtnettosaldos jedes Vermögenswerts darstellt, der jedem Binance-Kunden gehört.

Um unsere Kontingenz zu beweisen, werden wir einen zk-SNARK-Beweis für die Merkle-Baumkonstruktion erstellen. Für jeden Satz von Benutzersalden – den Blattknoten des Merkle-Baums – stellt unsere Schaltung sicher, dass:

  1. Der Saldo jedes Vermögenswerts dieses Benutzers ist in der oben genannten globalen Statusliste enthalten.

  2. Der gesamte Nettosaldo des Benutzers ist nicht negativ.

  3. Änderungen an der Merkle-Baumwurzel werden wirksam, nachdem diese Benutzerinformationen auf die Blattknoten-Hashes aktualisiert wurden.

Einzelheiten zur Implementierung finden Sie in dieser technischen Spezifikation und unserem Quellcode für die Schaltung (Einschränkungen).

In jedem Proof-of-Suggestion-Beispiel veröffentlichen wir:

1. Merkle Proof: Hash für jeden Benutzer (für Alice, dargestellt durch den blauen Knoten im Bild oben).

2. Nachweis von zk-SNARK und öffentliche Eingabe (Hash der Liste der gesamten Nettosalden jedes Vermögenswerts und Merkle-Wurzel) der Schaltung für alle Benutzer.

Durch die Überprüfung des Merkle-Beweises können Benutzer sicherstellen, dass ihre Bilanz in der Wurzel des Merkle-Baums enthalten ist. Durch die Überprüfung des zk-SNARK-Beweises können Benutzer sicherstellen, dass die Merkle-Baumkonstruktion die in der Schaltung angegebenen Einschränkungen erfüllt.

Die Sicherheit dieser Lösung hängt stark von der Einrichtung von Beweisschlüsseln und Verifizierungsschlüsseln ab. Wir arbeiten an der Einrichtung dezentraler Schlüssel. Wenn es um bestehende dezentralisierte, vertrauensbasierte Einrichtungszeremonien geht, sind die Ethereum-Zeremonien ein gutes Beispiel. Bald werden wir eine MPC-Lösung für die vertrauenswürdige Einrichtung haben.

Leistung

Angesichts der Anzahl der Binance-Benutzer, deren Guthaben einbezogen werden müssen, gibt es keine Möglichkeit, aus der Merkle-Baumkonstruktion einen einzigen Beweis zu erhalten, der alle Benutzer gleichzeitig einbeziehen würde. Die Lösung hierfür besteht darin, die Benutzer in Gruppen zu je 864 Personen aufzuteilen, um kleinere Schaltkreise und parallele Beweisverfahren zu erhalten.

Nehmen wir für eine Gruppe von 864 Benutzern, bei denen jeder Benutzer über 350 verschiedene Assets verfügt, an, dass jeder Asset-Saldo im Bereich [0, 2^64-1] liegt. Bei einem 32-Kern-128-GB-Server beträgt die Zeit für die Generierung des ZK-Proofs etwa 110 Sekunden und die Zeit für die Proof-Verifizierung weniger als 1 Millisekunde.

Binance startet 1000 Proofs gleichzeitig, um innerhalb von 2 Stunden Proofs für alle Konten zu generieren. Die Serverkosten für diesen Beweis für eine Stunde betragen etwa 0,56 USD, sodass die Gesamtkosten für die Erstellung aller ZK-Beweise für alle Benutzer etwa 1000 USD betragen.

Abschluss

Wir werden die ersten von dieser neuen Lösung generierten Benutzer-Proof-Iterationen in unserer nächsten Proof-of-Reserve-Ankündigung bereitstellen. Darüber hinaus haben wir unsere Benutzerdatenprozessoren, Prüfer, Schaltkreise und Verifizierer als Open-Source-Lösungen bereitgestellt, sodass jede zentralisierte Börse, die auf demselben Modell wie wir basiert, problemlos Beweise für ihre Benutzer und Vermögenswerte generieren kann.

Wir hoffen, dass dies eine wichtige Rolle dabei spielen wird, die Transparenz der Digital-Asset-Branche auf ein neues Niveau zu heben. Wir arbeiten auch daran, die in Vitaliks Blog erwähnten Lösungen zu implementieren, um eine bessere Leistung zu erzielen, die es uns ermöglichen wird, häufiger Beweise zu geringeren Kosten bereitzustellen.

Da dies die erste Version unseres zk-SNARK ist, hoffen wir, Feedback von der Community zu erhalten, damit wir das System weiter verbessern können.

Code und weiterführende Literatur

  • Unser Quellcode

  • Binance Proof-of-Reserves: Was ist ein Merkle-Baum?

  • Binance Academy – Verbesserung der Kryptotransparenz mit Zero-Knowledge Proof

  • Vitaliks Blog: Ein sicheres CEX: Nachweis der Zahlungsfähigkeit und darüber hinaus