TL;DR
Ein Zero-Knowledge-Beweis ermöglicht es einer Partei (dem Prüfer), die Gültigkeit einer von einer anderen Partei (dem Beweiserbringer) gemachten Aussage zu überprüfen, ohne dass sie den Inhalt der Aussage kennen muss. Binance könnte zum Beispiel beweisen wollen, dass die Mittel der Nutzer vollständig durch Reserven gedeckt sind, ohne die einzelnen Nutzerguthaben offenzulegen.
Der Nachweis der Reserven kann mithilfe eines Merkle-Baums erbracht werden, der die Fälschung interner Daten, in diesem Fall des Gesamtnettoguthabens aller Kunden (d. h. der gesamten Verbindlichkeiten der Börse gegenüber ihren Nutzern), verhindert. In Kombination mit einem zk-SNARK-Beweis (einem Zero-Knowledge-Protokoll) kann sichergestellt werden, dass die Nutzer überprüfen können, ob ihre Guthaben im Gesamtnettoguthaben enthalten sind. Dabei werden zu keinem Zeitpunkt ihre persönlichen Guthaben bei der Börse offengelegt.
Einführung
Aufgrund der jüngsten Marktereignisse ist die Sicherheit von verwahrten Kryptowährungen zu einem zentralen Anliegen der Anleger geworden. Blockchain-Nutzer legen großen Wert auf Transparenz und Offenheit, wünschen gleichzeitig aber auch Datenschutz und Vertraulichkeit. Dies schafft ein Dilemma für Krypto-Verwahrer im Hinblick auf den Nachweis ihrer Reserven, dessen Erbringung häufig einen Kompromiss zwischen Transparenz und Datenvertraulichkeit erfordert.
Eine Lösung für dieses Problem bietet die Kombination von Zero-Knowledge-Protokollen wie zk-SNARKs mit Merkle-Bäumen.
Was ist ein Zero-Knowledge-Beweis?
Ein Zero-Knowledge-Beweis ermöglicht es einer Partei (dem Prüfer), die Gültigkeit einer von einer anderen Partei (dem Beweiserbringer) gemachten Aussage zu überprüfen, ohne dass sie den Inhalt der Aussage kennen muss. Schauen wir uns ein einfaches Beispiel an.
Angenommen, du hast einen Tresor, dessen Code nur du kennst. Der Tresor kann nicht geknackt, aufgebrochen oder auf andere Weise geöffnet werden, es sei denn, man kennt die Zahlenkombination. Diese Tatsache ist auch deinem Freund bekannt.
Du sagst deinem Freund, dass du die Kombination kennst, aber du sie niemandem verraten und den Tresor auch nicht im Beisein anderer öffnen willst. Oben auf dem Tresor ist eine kleine Öffnung, durch die dein Freund einen Zettel stecken kann. Damit es sich um einen Zero-Knowledge-Beweis handelt, darf dein Freund außer der übermittelten Aussage keine weiteren Informationen über den Vorgang haben.
Du kannst nun deinem Freund beweisen, dass du die Kombination kennst, indem du den Tresor öffnest, ihm sagst, was auf dem Zettel steht, und den Tresor wieder schließt. Dabei hast du ihm zu keinem Zeitpunkt den Code verraten.
Ein praxisnahes Beispiel für einen Zero-Knowledge-Beweis findest du in unserem Artikel „Was ist ein Zero-Knowledge-Beweis und welche Auswirkungen hat er auf Blockchain?“.
Warum werden Zero-Knowledge-Beweise verwendet?
Zero-Knowledge-Beweise sind geeignet, um etwas zu beweisen, ohne dabei sensible Informationen oder Details offenzulegen, z. B. wenn man kein finanziellen oder personenbezogenen Informationen preisgeben will.
In der Welt der Kryptowährungen könnte ein Nutzer beweisen, dass er einen privaten Schlüssel besitzt, ohne ihn zu verraten oder irgendetwas digital zu signieren. Eine Kryptobörse könnte den Status ihrer Reserven nachweisen wollen, ohne vertrauliche Informationen über die Nutzer, insbesondere ihrer persönlichen Kontostände, preiszugeben.
Bei diesen Beispielen (wie auch bei vielen anderen) würde ein Zero-Knowledge-Beweis Algorithmen einsetzen, die bei einer Dateneingabe die Ausgabe „wahr“ oder „falsch“ erzeugen.
Zero-Knowledge-Beweis in technischer Hinsicht
Technisch gesehen folgt ein Zero-Knowledge-Beweis einer bestimmten Struktur mit bestimmten Kriterien. Ein Zero-Knowledge-Beweis muss drei Kriterien erfüllen:
Kriterium der Vollständigkeit. Die Ausgabe „wahr“ überzeugt den Prüfer vollkommen, sodass keine weitere Informationen oder Prüfungen erforderlich sind.
Kriterium der Zuverlässigkeit. Wenn die Ausgabe „falsch“ ist, kann der Prüfer unmöglich davon überzeugt werden, dass die Aussage wahr ist.
Kriterium des Nullwissens. Wenn die Aussage „wahr“ ist, erfährt der Prüfer keine anderen Informationen als eben die, dass die Aussage wahr ist.
Was ist ein zk-SNARK?
Ein zk-SNARK (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) ist ein Beweisprotokoll, das den zuvor beschriebenen Prinzipien des Nullwissens folgt. Mit einem zk-SNARK lässt sich beweisen, dass man den ursprünglichen Hash-Wert kennt (siehe unten), ohne dass man ihn offenlegen muss. Man kann auch die Gültigkeit einer Transaktion beweisen, ohne Informationen über den Betrag, Wert oder die Adressen preiszugeben.
zk-SNARKs werden im Bereich der Blockchains und Kryptowährungen häufig eingesetzt und diskutiert. Du fragst dich jetzt vielleicht, warum sich jemand die Mühe machen sollte, einen zk-SNARK zu verwenden, wenn die Informationen über seine Schlüssel abgerufen werden können. Nun, wir wären nicht in der Lage, den mathematischen Beweis zu erbringen, dass die Wallets keine Negativguthaben aufweisen und dass die Summe des Merkle-Baums stimmt.
Darüber hinaus möchte eine Kryptobörse nachweisen, dass sie über die gesamten Kundenguthaben auf einer 1:1-Basis besitzt, ohne die Wallet-Adressen und individuellen Kontostände der Nutzer zu veröffentlichen. Außerdem macht die zk-SNARK-Technologie die Fälschung von Daten noch unwahrscheinlicher.
Was ist ein Merkle-Baum?
Die Darstellung der Guthaben aller Binance-Nutzer erfordert die Verarbeitung enormer Datenmengen. Der Merkle-Baum schafft hier Abhilfe. Er ist in der Lage, eine große Menge an Daten effizient zu speichern, und seine kryptografische Natur macht seine Integrität leicht überprüfbar.
Hash-Funktionen
Zur effizienten Verschlüsselung einer Eingabe ist ein Merkle-Baum auf die Verwendung von Hash-Funktionen angewiesen. Kurz gesagt ist Hashing der Prozess, bei dem aus einer Eingabe variabler Größe eine Ausgabe fester Größe generiert wird. Mit anderen Worten: Wenn eine Eingabe beliebiger Länge durch einen Algorithmus gehasht wird, wird eine verschlüsselte Ausgabe fester Länge erzeugt.
Solange die Eingabe gleich bleibt, bleibt auch die Ausgabe gleich. Das bedeutet, dass wir riesige Mengen von Transaktionsdaten in eine überschaubare Ausgabe hashen können. Die Ausgabe wird sich grundlegend ändern, wenn sich irgendeine Information in der Eingabe ändert.
Wir könnten zum Beispiel den Inhalt von 100 Büchern nehmen und sie in die SHA-256-Hash-Funktion eingeben. Die Ausgabe würde dann etwa so aussehen:
801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea
Wenn wir dann nur ein einziges Zeichen in der Eingabe (also im Inhalt von 100 Büchern) ändern würden, würde der Hash völlig anders aussehen, etwa so:
abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410
Dies ist eine wichtige Eigenschaft von Hash-Funktionen, da sie eine einfache Überprüfung der Richtigkeit von Daten ermöglicht. Wenn jemand den Vorgang des Hashens derselben 100 Bücher mit dem SHA-256-Algorithmus wiederholt, erhält er genau denselben Hash wie die erste Ausgabe oben. Weicht die Ausgabe ab, können wir mit Sicherheit sagen, dass die Eingabe geändert wurde. Dies bedeutet, dass es nicht notwendig ist, die Eingaben selbst (in unserem Beispiel den Inhalt von 100 Büchern) einzeln oder manuell auf Unterschiede hin zu überprüfen, was logischerweise enorm aufwendig wäre.
Merkle-Bäume in der Krypto-Branche
Bei der Speicherung von Transaktionsdaten in einer Blockchain wird jede neue Transaktion über eine Hash-Funktion übermittelt, die eindeutige Hash-Werte erzeugt. Stell dir vor, wir haben acht Transaktionen (A bis H), die wir einzeln hashen, um ihre gehashten Ausgaben zu erhalten. Dies sind die so genannten Merkle-Blattknoten. In der Abbildung unten ist der eindeutige Hash-Wert jedes Buchstabens dargestellt: hA für A, hB für B, hC für C usw.
Wir können nun jeweils zwei Hash-Ausgaben zu einer neuen Hash-Ausgabe kombinieren. Die Hashes von hA und hB würden zum Beispiel eine neue Hash-Ausgabe hAB, einen sogenannten Merkle-Zweig, erzeugen. Beachte, dass jede neu erzeugte Ausgabe eine feste Länge bzw. Größe hat, die von der verwendeten Hash-Funktion abhängt.
Wir haben jetzt also die Daten von zwei Transaktionen (z. B. A und B) in einem Hash (hAB) kombiniert. Unsere Hash-Ausgabe hAB wurde völlig anders ausfallen, wenn wir irgendwelche Informationen von A oder B ändern und den Vorgang wiederholen würden.
Wir setzen den Prozess fort und kombinieren wiederum zwei Hash-Paare, die wir danach erneut hashen (siehe Abbildung unten). Wir kombinieren hAB mit hCD, um einen eindeutigen Hashwert hABCD zu erhalten, und machen dasselbe mit hEF und hGH, um hEFGH zu erhalten. Am Ende bleibt ein einziger Hash übrig, der alle bisher gehashten Ausgaben darstellt. Die Hash-Ausgabe hABCDEFGH repräsentiert also alle Informationen, die gehasht wurden.
Der letzte Hash, der übrig bleibt, wird als Merkle-Wurzel bezeichnet. Die oben dargestellte Grafik zeigt den gesamten Merkle-Baum. Wir verwenden Merkle-Wurzeln in Block-Headern, da sie alle Transaktionsdaten in einem Block kryptografisch knapp zusammenfassen. Darüber hinaus lässt sich schnell feststellen, ob Daten innerhalb des Blocks manipuliert oder verändert wurden.
Die Limitationen von Merkle-Bäumen
Kehren wir zu unserem Beispiel des Nachweises von Reserven durch CEXs zurück. Eine CEX möchte den Nachweis erbringen, dass sie alle Assets ihrer Kunden im Verhältnis 1:1 hält, und erstellt einen Merkle-Baum, der die Nettoguthaben (Guthaben abzüglich Schulen) jeder Nutzer-ID für jeden Token zusammenhasht. Nach der Veröffentlichung (und der Signierung zum Nachweis des Eigentums an der bereitgestellten Merkle-Wurzel) hätte ein einzelner Nutzer keine Möglichkeit zu überprüfen, ob der Merkle-Baum gültig ist, ohne alle seine Eingaben einzusehen.
Eine Kryptobörse könnte einige Eingaben übersehen haben. Sie könnte aber auch gefälschte Nutzerkonten mit Negativguthaben erstellen, um die Gesamtverschuldung künstlich aufzublähen. Zum Beispiel könnte sie ein gefälschtes Konto mit einem Guthaben von -500.000 EUR für einen Kunden anlegen, der über Assets im Wert von 1.000.000 EUR verfügt. Infolgedessen müsste die Börse 500.000 EUR weniger Mittel als Reserve halten.
Der Nachweis von Reserven unterscheidet sich von der Merkle-Wurzel eines Blocks. Während die Nutzer alle Transaktionen, die ein Block enthält, in einem Blockchain-Explorer einsehen können, wird eine CEX aus Gründen der Sicherheit und des Datenschutzes nicht jedes Kontoguthaben veröffentlichen wollen. Die Nutzer wären nicht glücklich darüber, wenn ihre Kontostände preisgegeben würden. Es stellt sich also die Frage, wie eine CEX ohne die Offenlegung der Kundenguthaben nachweisen kann, dass die von ihr gehaltenen Mittel der Summe aller Nutzerguthaben entsprechen.
Eine Lösung, die Börsen in Erwägung ziehen können, ist der Beizug eines vertrauenswürdigen unabhängigen Prüfers. Dieser kann die einzelnen Konten und Reserven verifizieren und die Gültigkeit der Merkle-Wurzel bescheinigen. Diese Methode setzt jedoch Vertrauen in den Prüfer und die für die Prüfung verwendeten Daten voraus.
Kombination von zk-SNARKs und Merkle-Bäumen
Im beschriebenen Fall stellten zk-SNARKs eine ideale Lösung dar. Eine Kryptobörse möchte nachweisen, dass sie über ausreichend Mittel verfügt und sie die Kontostände nicht gefälscht hat. Aus Gründen des Datenschutzes und der Sicherheit will sie dem Prüfer jedoch keine genaue Aufschlüsselung der Nutzerguthaben sowie ihrer Reserven vorlegen.
Durch die Verwendung eines zk-SNARKs kann eine Kryptobörse beweisen, dass alle Blattknoten des Merkle-Baums (d. h. die Guthaben der Nutzerkonten) bei dem von der Börse ausgewiesenen Gesamtguthaben berücksichtigt wurden. Jeder Nutzer kann leicht überprüfen, ob sein Blattknoten in die Berechnung einbezogen wurde. Der zk-SNARK garantiert auch, dass der generierte Merkle-Baum keine Konten mit negativem Gesamtguthaben enthält (was bedeuten würde, dass Daten gefälscht wurden, da alle Kredite überbesichert sind). Außerdem wird eine Berechnung des Gesamtvermögens von Binance durchgeführt, indem die Gesamtnettoguthaben jedes Assets, das jeder Binance-Kunde besitzt, aufgelistet werden.
Schauen wir uns an, wie Binance diese Herausforderung angeht. Zunächst definiert Binance die Bedingungen für die erforderliche Berechnung in Form einer programmierbaren logischen Schaltung. Im Folgenden sind die drei Bedingungen aufgeführt, die Binance im eingesetzten Modell verwendet.
Für jedes Guthaben eines Nutzers (d.h. für jeden Merkle-Blattknoten) stellt die Schaltung von Binance sicher, dass:
die Guthaben eines Nutzers bei der Berechnung der Gesamtnettoguthaben aller Nutzer bei Binance berücksichtigt werden
das Gesamtnettoguthaben des Nutzers größer oder gleich Null ist
die Änderung der Merkle-Baumwurzel gültig ist (d. h. keine gefälschten Informationen zugrundeliegen), nachdem die Informationen eines Nutzers im Blattknoten-Hash aktualisiert wurden
Binance kann dann einen zk-SNARK-Beweis für die Struktur des Merkle-Baums entsprechend der Schaltung erzeugen. Dies bedeutet, dass die Kryptobörse die umfangreichen Berechnungen zum Hashing der IDs und Guthaben der Nutzer durchführen muss, während sie gleichzeitig sicherstellt, dass der Beweis die Bedingungen erfüllt.
Ein Prüfer prüft den Beweis (und seinen veröffentlichten Open-Source-Code), um sicherzustellen, dass die Berechnung unter Einhaltung aller Bedingungen durchgeführt wurde. Die Verifizierungsberechnung nimmt im Vergleich zur Beweisberechnung extrem wenig Zeit in Anspruch.
Bei jeder Veröffentlichung eines Nachweises von Reserven wird die Kryptobörse folgende Informationen offenlegen:
1. den Merkle-Beweis für jeden Nutzer.
2. den zk-SNARK-Beweis und die öffentliche Eingabe (ein Hash der Aufzeichnung der Gesamtnettoguthaben für jedes einzelne Asset und der Merkle-Wurzel) der Schaltung für alle Nutzer
Alle Interessenten können den Merkle-Beweis verifizieren, um sicher sein zu können, dass ihre persönlichen Guthaben in der Wurzel des Merkle-Baums berücksichtigt sind. Sie können auch den zk-SNARK-Beweis verifizieren, um sicherzustellen, dass die Struktur des Merkle-Baums den in der Schaltung definierten Bedingungen entspricht. Weiterführende Informationen über die zk-SNARK-Lösung von Binance und ihre Leistungsfähigkeit findest du in unserem Blogbeitrag Wie zk-SNARKs die Erbringung des Reservennachweises von Binance verbessern.
Fazit
zk-SNARKs bieten die Technologie, die benötigt wird, um gleichzeitig Datenintegrität und Datenschutz zu gewährleisten. Ihre Anwendung beim Nachweis von Reserven dürfte die Transparenz von CEXs erhöhen und das Vertrauen in die Blockchain-Branche insgesamt stärken. Viele Nutzer haben schon lange auf diese Lösung gewartet, und sie kommt für CEXs genau zum richtigen Zeitpunkt.
Dies ist die erste Version von zk-SNARKs, und wir freuen uns auf das Feedback der Community , damit wir unser System weiter verbessern können.