TL;DR

Ein Zero-Knowledge-Beweis ermöglicht es einer Partei (einem Prüfer), die Gültigkeit einer Aussage einer anderen Partei (des Beweisers) zu bestimmen, ohne den Inhalt der Aussage zu kennen. Beispielsweise möchte Binance möglicherweise nachweisen, dass es die Gelder seiner Benutzer vollständig durch Reserven gedeckt hat, ohne alle individuellen Benutzerguthaben offenzulegen.

Ein „Proof of Reserves“ könnte mit einem Merkle-Baum erstellt werden, der vor der Verfälschung seiner internen Daten schützt, in diesem Fall vor den gesamten Netto-Kundensalden, die Verbindlichkeiten der Börse gegenüber ihren Benutzern sind. Dies kann dann mit einem zk-SNARK (einem Zero-Knowledge-Proof-Protokoll) kombiniert werden, das sicherstellt, dass Benutzer überprüfen können, ob ihr Saldo Teil des gesamten Netto-Benutzervermögenssaldos ist, ohne die einzelnen Salden zu kennen.

Einführung

Angesichts der Marktereignisse ist die Sicherheit von verwahrten Krypto-Assets zu einem kritischen Thema geworden. Blockchain-Benutzer legen großen Wert auf Transparenz und Offenheit, unterstützen aber auch Privatsphäre und Vertraulichkeit. Dies führt zu einem Dilemma beim Nachweis von Geldreserven, die von Verwahrern gehalten werden. Oft muss zwischen Transparenz, Vertrauen und Datenvertraulichkeit abgewogen werden.

Dies muss jedoch nicht der Fall sein. Durch die Kombination von Zero-Knowledge-Proof-Protokollen wie zk-SNARKs mit Merkle-Bäumen können wir eine effektive Lösung für alle Parteien finden.

Was ist ein Zero-Knowledge-Proof?

Ein Zero-Knowledge-Beweis ermöglicht es einer Partei (einem Prüfer), die Gültigkeit einer Aussage einer anderen Partei (des Beweisers) zu bestimmen, ohne den Inhalt der Aussage zu kennen. Sehen wir uns ein einfaches Beispiel an.

Sie haben einen verschlossenen Safe, für den nur Sie die Lösung kennen. Der Safe kann, um das Beispiel zu nennen, nicht geknackt, aufgebrochen oder auf andere Weise geöffnet werden, als wenn man die Kombination kennt. Diese Tatsache ist auch für Ihren Freund, der am Experiment teilnimmt, festgestellt, verifiziert und bekannt.

Sie sagen Ihrem Freund, dass Sie die Kombination kennen, sie aber nicht preisgeben oder die Schachtel vor ihm öffnen möchten. Oben auf der Schachtel befindet sich ein Loch, durch das Ihr Freund eine Notiz stecken kann. Damit dies ein Zero-Knowledge-Beweis ist, sollte Ihr Freund außer der gegebenen Aussage keine weiteren Informationen über den Vorgang haben.

Du kannst deinem Freund beweisen, dass du die Kombination kennst, indem du die Schachtel öffnest, ihm sagst, was auf dem Zettel steht, und sie wieder schließt. Zu keinem Zeitpunkt hast du die Kombination jedoch preisgegeben.

Ein fortgeschritteneres Beispiel finden Sie in unserem Artikel „Was ist ein Zero-Knowledge-Proof und welche Auswirkungen hat er auf die Blockchain?“.

Warum verwenden wir Zero-Knowledge-Proof?

Zero-Knowledge-Beweise eignen sich dazu, etwas zu beweisen, ohne sensible Informationen oder Details preiszugeben. Dies könnte der Fall sein, wenn Sie Ihre finanziellen oder persönlichen Daten nicht preisgeben möchten, die missbraucht werden könnten.

Im Kryptobereich können Sie nachweisen, dass Sie einen privaten Schlüssel besitzen, ohne ihn preiszugeben oder etwas digital zu signieren. Eine Kryptowährungsbörse möchte möglicherweise auch den Status ihrer Reserven nachweisen, ohne vertrauliche Informationen über ihre Benutzer preiszugeben, einschließlich ihrer individuellen Kontostände.

Für diese Beispiele (und viele andere) würde ein Zero-Knowledge-Beweis Algorithmen verwenden, die eine Dateneingabe annehmen und als Ausgabe „true“ oder „false“ zurückgeben.

Definition von Zero-Knowledge-Beweisen in technischen Begriffen

Ein Zero-Knowledge-Beweis folgt technisch gesehen einer bestimmten Struktur mit bestimmten Kriterien. Wir haben bereits die Rollen des Beweisers und des Prüfers behandelt, aber es gibt auch drei weitere Kriterien, die ein Zero-Knowledge-Beweis erfüllen sollte:

  1. Vollständigkeit. Wenn die Aussage wahr ist, wird ein Prüfer durch den vorgelegten Beweis überzeugt sein, ohne dass weitere Informationen oder Überprüfungen erforderlich sind.

  2. Stichhaltigkeit. Wenn die Aussage falsch ist, wird ein Prüfer durch den vorgelegten Beweis nicht von der Wahrheit der Aussage überzeugt sein.

  3. Null-Wissen. Wenn die Aussage wahr ist, erfährt der Prüfer nichts weiter, als 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 Zero-Knowledge-Prinzipien folgt. Mit einem zk-SNARK könnten Sie beweisen, dass Sie den ursprünglichen Hash-Wert (weiter unten erläutert) kennen, ohne ihn preiszugeben. Sie könnten auch die Gültigkeit einer Transaktion beweisen, ohne Informationen über die spezifischen Beträge, Werte oder Adressen preiszugeben.

zk-SNARKs werden in der Blockchain- und Kryptowährungswelt häufig verwendet und diskutiert. Aber Sie fragen sich vielleicht, warum sich jemand die Mühe machen sollte, einen zk-SNARK zu verwenden, wenn er eine einfache Methode mit einem öffentlichen und privaten Schlüsselpaar zum Sichern der Informationen verwenden könnte. Wir könnten jedoch den mathematischen Beweis nicht implementieren, um sicherzustellen, dass keine negativen Salden enthalten sind und die Summe des Merkle-Baums.

Im Falle der Reserven einer Börse wollen wir eine 1:1-Deckung der Kundenguthaben nachweisen, ohne dass die Kennungen und Guthaben der einzelnen Konten öffentlich werden. Darüber hinaus macht die zk-SNARK-Technologie eine Datenfälschung noch unwahrscheinlicher.

Was ist ein Merkle-Baum?

Um die Gesamtbeträge der Konten von Binance-Benutzern darzustellen, muss man mit einem großen Datensatz arbeiten. Eine Möglichkeit, diese große Datenmenge kryptografisch darzustellen, ist die Verwendung eines Merkle-Baums. Darin können große Mengen an Informationen effizient gespeichert werden und aufgrund seiner kryptografischen Natur ist seine Integrität leicht überprüfbar.

Hash-Funktionen

Um eine Eingabe präzise zu kodieren, 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 mit fester Größe generiert wird. Mit anderen Worten: Wenn eine Eingabe beliebiger Länge durch einen Algorithmus gehasht wird, entsteht eine verschlüsselte Ausgabe mit fester Länge.

Solange die Eingabe gleich bleibt, bleibt auch die Ausgabe gleich. Das bedeutet, dass wir riesige Mengen an Transaktionsdaten in eine handhabbare Ausgabe zerlegen können. Die Ausgabe wird radikal anders sein, wenn Informationen in der Eingabe geändert werden.

Wir könnten zum Beispiel den Inhalt von 100 Büchern nehmen und ihn in die SHA-256-Hashfunktion eingeben. Als Ausgabe würde sie dann etwa Folgendes liefern:

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

Wenn wir dann ein einziges Zeichen der Eingabe (diese 100 Bücher) ändern würden, wäre der Hash völlig anders, etwa so:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

Dies ist eine wichtige Eigenschaft von Hash-Funktionen, da sie eine einfache Überprüfung der Datengenauigkeit ermöglicht. Wenn jemand den Prozess des Hashens derselben 100 Bücher mit dem SHA-256-Algorithmus wiederholt, erhält er genau denselben Hash als Ausgabe. Wenn die Ausgabe anders ist, können wir mit Sicherheit bestätigen, dass die Eingabe geändert wurde. Das bedeutet, dass es nicht notwendig ist, einzeln oder manuell nach Unterschieden zwischen den Eingaben zu suchen, was arbeitsintensiv sein kann.

Merkle-Bäume in der Welt der Kryptowährungen

Beim Speichern von Transaktionsdaten in einer Blockchain wird jede neue Transaktion über eine Hash-Funktion übermittelt, die eindeutige Hash-Werte generiert. Stellen Sie sich vor, wir haben acht Transaktionen (A bis H), die wir einzeln hashen, um ihre gehashten Ausgaben zu erhalten. Dies sind die sogenannten Merkle-Blattknoten. Im Bild unten sehen Sie den eindeutigen Hash-Wert jedes Buchstabens: hA für A, hB für B, hC für C usw.

Wir können dann Paare von gehashten Ausgaben nehmen, sie kombinieren und eine neue gehashte Ausgabe erhalten. Die zusammen gehashten Hashes von hA und hB würden uns beispielsweise eine neue gehashte Ausgabe von hAB geben, die als Merkle-Zweig bezeichnet wird. Beachten Sie, dass jede neue Ausgabe, die generiert wird, eine feste Länge und Größe hat, je nach verwendeter Hash-Funktion.

Jetzt haben wir die Daten zweier Transaktionen (z. B. A und B) in einem Hash (hAB) kombiniert. Beachten Sie, dass unsere gehashte Ausgabe hAB völlig anders wäre, wenn wir Informationen von A oder B ändern und den Vorgang wiederholen.

Der Prozess wird fortgesetzt, indem wir neue Hash-Paare kombinieren, um sie erneut zu hashen (siehe Abbildung unten). Wir hashen hAB mit hCD, um einen eindeutigen Hash hABCD zu erhalten, und machen dasselbe mit hEF und hGH, um hEFGH zu erhalten. Am Ende erhalten wir einen einzelnen Hash, der die gehashten Ausgaben aller Hashes vorheriger Transaktionen darstellt. Mit anderen Worten: Die gehashte Ausgabe hABCDEFGH stellt alle Informationen dar, die davor kamen.

Der oben angezeigte Graph wird als Merkle-Baum bezeichnet und die gehashte Ausgabe hABCDEFGH ist die Merkle-Wurzel. Wir verwenden Merkle-Wurzeln in Blockheadern, da sie alle Transaktionsdaten in einem Block kryptografisch auf prägnante Weise zusammenfassen. Wir können auch schnell überprüfen, ob Daten innerhalb des Blocks manipuliert oder geändert wurden.

Die Grenzen von Merkle-Bäumen

Kehren wir zu unserem Beispiel mit den CEX-Reserven zurück. Eine CEX möchte die 1:1-Deckung aller Vermögenswerte ihrer Kunden nachweisen und erstellt einen Merkle-Baum, der die UIDs ihrer Kunden mit ihren Nettovermögensbeständen (Verrechnung von Vermögenswerten und Verbindlichkeiten) auf Token-Ebene zusammenfasst. Nach der Freigabe (und Unterzeichnung zum Nachweis des Eigentums an der bereitgestellten Merkle-Wurzel) hätte ein einzelner Benutzer keine Möglichkeit mehr zu überprüfen, ob der Merkle-Baum gültig ist, ohne auf alle seine Eingaben zuzugreifen.

Eine Börse hat möglicherweise vergessen, einige Eingaben einzubeziehen. Sie könnte auch Scheinkonten mit negativen Salden erstellen, um die Gesamtverbindlichkeiten zu verändern. Obwohl die Vermögenswerte der Kunden beispielsweise insgesamt 1.000.000 USD betragen, könnte ein Scheinkonto mit einem Saldo von -500.000 USD hinzugefügt werden. Dies würde ein Reserveziel von nur 500.000 USD ergeben.

Der Nachweis von Reserven unterscheidet sich von der Merkle-Wurzel eines Blocks, da Benutzer alle Transaktionen, die ein Block enthält, in einem Blockchain-Explorer sehen können. Ein CEX wird jedoch aus Sicherheits- und Datenschutzgründen nicht jeden Kontostand offenlegen wollen. Auch Kunden wären nicht glücklich darüber, wenn ihre Kontostände öffentlich gemacht würden. In diesem Fall kann der CEX nicht beweisen, dass die Benutzersalden die richtige Summe ergeben, ohne die Salden anderer Benutzer sichtbar zu machen.

Eine Lösung, die Börsen in Betracht ziehen könnten, ist die Beauftragung eines vertrauenswürdigen externen Prüfers. Der Prüfer kann die einzelnen Konten und Reserven prüfen, bevor er die Gültigkeit der bereitgestellten Merkle-Wurzel bestätigt. Für die Benutzer erfordert diese Methode jedoch Vertrauen in den Prüfer und die für die Prüfung verwendeten Daten. Sie müssen sich nicht auf einen Dritten verlassen, wenn Sie den Daten vertrauen können.

Kombination von zk-SNARKs mit Merkle-Bäumen

Das obige Problem ist ein perfektes Beispiel für die Verwendung von zk-SNARKs. Wir möchten beweisen, dass die Reserven die Verbindlichkeiten der Benutzer vollständig decken und nicht gefälscht sind. Aus Datenschutz- und Sicherheitsgründen möchten wir dem Prüfer jedoch nicht die genaue Zusammensetzung der Benutzerguthaben und -reserven zeigen.

Durch die Verwendung eines zk-SNARK kann eine Kryptobörse nachweisen, dass alle Bilanzen (d. h. die Kontostände der Benutzer) der Merkle-Tree-Blattknoten zum von der Börse angegebenen Gesamtvermögenssaldo der Benutzer beitragen. Jeder Benutzer kann problemlos auf seinen Blattknoten zugreifen, da er in den Prozess einbezogen wurde. Das zk-SNARK stellt außerdem sicher, dass ein generierter Merkle-Tree keine Benutzer mit einem negativen Gesamtnettovermögenssaldo enthält (was eine Verfälschung der Daten bedeuten würde, da alle Kredite überbesichert sind). Außerdem wird eine Berechnung des globalen Status von Binance verwendet, d. h. eine Liste des Gesamtnettosaldos jedes Vermögenswerts, den jeder Binance-Kunde besitzt.

Sehen wir uns an, wie Binance mit der Situation umgeht. Zunächst definiert Binance die Beschränkungen der Berechnung, die es beweisen möchte, und definiert sie als programmierbare Schaltung. Unten sehen Sie die drei Beschränkungen, die Binance in seinem Modell verwendet.

Für den Bilanzsatz (Blattknoten des Merkle-Baums) jedes Benutzers stellt unsere Schaltung Folgendes sicher:

  1. Die Vermögenssalden eines Benutzers werden in die Berechnung der Summe der gesamten Netto-Benutzersalden bei Binance einbezogen.

  2. Der Gesamtnettosaldo des Benutzers ist größer oder gleich Null.

  3. Die Änderung der Merkle-Baumwurzel ist gültig (d. h. es werden keine gefälschten Informationen verwendet), nachdem die Informationen eines Benutzers im Blattknoten-Hash aktualisiert wurden.

Binance kann dann gemäß der Schaltung einen zk-SNARK-Beweis für die Konstruktion des Merkle-Baums generieren. Dies beinhaltet, dass die Börse die umfangreiche Berechnung des Hashings der IDs und Guthaben der Benutzer durchführt und gleichzeitig sicherstellt, dass der Beweis die Einschränkungen erfüllt.

Ein Prüfer prüft den Beweis (und seinen öffentlich zugänglichen Open-Source-Code), um sich davon zu überzeugen, dass die Berechnung unter Einhaltung aller Einschränkungen ausgeführt wird. Die Prüfberechnung dauert im Vergleich zur Beweiszeit extrem kurz.

Bei jeder Veröffentlichung eines Proof of Reserves veröffentlicht die Börse:

1. Der Merkle-Beweis für jeden Benutzer.

2. Der zk-SNARK-Nachweis und der öffentliche Input (ein Hash der Liste des gesamten Nettosaldos jedes Vermögenswerts und der Merkle-Wurzel) des Schaltkreises für alle Benutzer.

Interessierte Parteien können den Merkle-Beweis überprüfen und so sicherstellen, dass ihre individuellen Guthaben zur Merkle-Baumwurzel beigetragen haben. Sie können auch den zk-SNARK-Beweis überprüfen, um sicherzustellen, dass die Konstruktion des Merkle-Baums die im Schaltkreis definierten Einschränkungen erfüllt. Eine ausführlichere Erklärung der zk-SNARK-Lösung und ihrer Leistung finden Sie in unserem Blog „Wie zk-SNARKs das Proof-of-Reserves-System von Binance verbessern“.

Abschließende Gedanken

zk-SNARKs bieten die Technologie, die erforderlich ist, um gleichzeitig Datenintegrität und Datenschutz zu gewährleisten. Seine Anwendung zum Nachweis von Reserven und zur Erhöhung der CEX-Transparenz sollte dazu beitragen, Vertrauen in die Blockchain-Branche aufzubauen. Viele haben auf eine solche Entwicklung lange gewartet und sie kommt zu einem entscheidenden Zeitpunkt für CEXs.

Dies ist die erste Version unseres zk-SNARK und wir freuen uns auf das Feedback der Community, damit wir das System weiter verbessern können.

Weitere Informationen

  • (Blog) Wie zk-SNARKs das Proof-of-Reserves-System von Binance verbessern

  • (Akademie) Nachweis von Rücklagen (PoR)

  • (Akademie) Was ist ein Reservenachweis und wie funktioniert er bei Binance?

  • (Bekanntmachung) Binance veröffentlicht Proof of Reserves-System