Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt

Wir setzen unseren Zyklus über die Funktionsweise der Monero-Blockchain fort, und der heutige Artikel befasst sich mit dem RingCT-Protokoll (Ring Confidential Transactions), das vertrauliche Transaktionen und neue Ringunterschriften beinhaltet. Leider gibt es im Internet nur wenige Informationen darüber, wie es funktioniert, und wir haben versucht, diese Lücke zu schließen.

Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt

Wir werden darüber sprechen, wie dieses Protokoll das Netzwerk in der Lage versetzt, die Überweisungsbeträge zu verbergen, warum wir uns von den klassischen Ringunterschriften der Cryptonote-Technologie verabschiedet haben und wie sich diese Technologie weiterentwickeln wird.

Da dieses Protokoll eine der komplexesten Technologien in Monero ist, benötigt der Leser grundlegende Kenntnisse über die Funktionsweise dieser Blockchain und ein oberflächliches Verständnis der Kryptografie elliptischer Kurven (um dieses Wissen aufzufrischen, können die ersten Kapitel unseres vorherigen Artikels über Multisignaturen).

das RingCT-Protokoll

Eine mögliche Angriffsmethode auf Cryptonote-Währungen ist die Analyse der Blockchain, die auf dem Wissen über den Betrag und die Zeit der gesendeten Transaktion basiert. Das ermöglicht Die Angreifer können dadurch den Bereich ihrer Suchanfragen erheblich einschränken. Um solchen Analysen entgegenzuwirken, wurde in Monero ein Protokoll für anonyme Transaktionen implementiert, das die Überweisungssummen im Netzwerk vollständig verbirgt.

Es ist erwähnenswert, dass die Idee, Beträge zu verbergen, nicht neu ist. Einer der ersten, der sie beschrieb, war der Entwickler von Bitcoin Core, Greg Maxwell, in seinem Artikel zu vertraulichen Transaktionen.Die aktuelle Implementation von RingCT stellt eine Modifikation davon dar, die die Verwendung von Ring-Signaturen ermöglicht (was wäre ein Protokoll ohne sie?) und erhielt daher den Namen Ring Confidential Transactions.

Darüber hinaus hilft das Protokoll, Probleme mit der Vermischung von Dust-Ausgängen zu vermeiden – Ausgänge mit kleinen Beträgen (die oft als Rückgabe bei Transaktionen entstehen), die mehr Probleme verursachten, als sie wert waren.

Im Januar 2017 fand ein Hard Fork des Monero-Netzwerks statt, der die optionale Verwendung von vertraulichen Transaktionen ermöglichte. Bereits im September desselben Jahres wurden mit dem Hard Fork der Version 6 solche Transaktionen zu den einzig erlaubten im Netzwerk.

RingCT verwendet mehrere Mechanismen: mehrschichtige verknüpfbare spontane anonyme Gruppenunterschriften (Multilayered Linkable Spontaneous Anonymous Group Signature, im Folgenden – MLSAG), Verpflichtungsschemata (Pedersen Commitments) und Bereichsnachweise (für diesen Begriff gibt es keine fest etablierte Übersetzung ins Deutsche).

Das RingCT-Protokoll führt zwei Arten von anonymen Transaktionen ein: simple und full. Erstere werden von der Wallet generiert, wenn eine Transaktion mehr als einen Eingang verwendet, während letztere in der umgekehrten Situation entstehen. Sie unterscheiden sich durch die Validierung der Transaktionssummen und die mit der MLSAG-Unterschrift signierten Daten (darüber werden wir weiter unten sprechen). Außerdem können full Transaktionen mit jeder Anzahl von Eingängen erzeugt werden, es gibt keinen grundlegenden Unterschied. In dem Buch „Zero to Monero“ wird erwähnt, dass die Entscheidung, full Transaktionen auf einen Eingang zu beschränken, schnell getroffen wurde und sich in Zukunft ändern könnte.

MLSAG-Unterschrift

Lassen Sie uns daran erinnern, was die signierten Eingänge von Transaktionen darstellen. Jede Transaktion verwendet Mittel und generiert. Die Generierung von Mitteln erfolgt durch die Erstellung von Ausgängen der Transaktion (direkte Analogie – Geldscheine), und der Ausgang, den die Transaktion verwendet (denn im wirklichen Leben geben wir tatsächlich Geldscheine aus), wird zum Eingang (Vorsicht, hier kann man leicht verwirrt werden).

Ein Eingang verweist auf mehrere Ausgänge, verwendet jedoch nur einen, wodurch eine "Rauchschicht" entsteht, um die Analyse der Transferhistorie zu erschweren. Wenn eine Transaktion mehr als einen Eingang hat, kann eine solche Struktur als Matrix dargestellt werden, wobei die Zeilen die Eingänge und die Spalten die betroffenen Ausgänge sind. Um dem Netzwerk zu beweisen, dass die Transaktion tatsächlich ihre eigenen Ausgänge verwendet (d.h. die geheimen Schlüssel kennt), signieren die Eingänge mit einer Ringunterschrift. Diese Unterschrift garantiert, dass der Unterzeichner die geheimen Schlüssel aller Elemente einer der Spalten kannte.

Vertrauliche Transaktionen verwenden nicht mehr die klassischen für cryptonote Ring-Signaturen wurden durch MLSAG ersetzt – eine für mehrere Eingänge angepasste Version ähnlicher einstufiger Ring-Signaturen. LSAG.

Sie werden als mehrschichtig bezeichnet, weil sie mehrere Eingänge auf einmal signieren, wobei jeder mit mehreren anderen vermischt wird, d. h. eine Matrix signiert wird und nicht nur eine Zeile. Wie wir später sehen werden, hilft dies, die Größe der Signatur zu reduzieren.

Lassen Sie uns untersuchen, wie eine Ring-Signatur gebildet wird, anhand einer Transaktion, die 2 reale Ausgänge ausgibt und m – 1 zufällige Werte aus der Blockchain zur Vermischung verwendet. Wir bezeichnen die öffentlichen Schlüssel der Ausgänge, die wir ausgeben, als
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt, und die Key Images für diese entsprechend: Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt Auf diese Weise ergibt sich eine Matrix der Größe 2 x m. Zunächst müssen wir die sogenannten Challenges für jedes Ausgangspaar berechnen:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Die Berechnungen beginnen mit den Ausgängen, die wir ausgeben, unter Verwendung ihrer öffentlichen Schlüssel:Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtund zufällige ZahlenVertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtAm Ende erhalten wir Werte:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt, die wir zur Berechnung der Challenge verwenden.
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtder nächsten Paare von Ausgängen (um es einfacher zu machen, was wo eingesetzt wird, haben wir diese Werte in verschiedenen Farben hervorgehoben). Alle folgenden Werte werden kreisförmig anhand der in der ersten Abbildung angegebenen Formeln berechnet. Zuletzt wird der Challenge für das Paar echter Ausgänge berechnet.

Wie wir sehen, werden in allen Spalten, außer in der mit den echten Ausgängen, zufällig generierte Zahlen verwendet.Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt. Für πdes -ten Spalts benötigen wir ebenfalls. Lassen Sie uns umwandelnVertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtin s:Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Die Signatur selbst ist ein Tupel all dieser Werte:

Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt

Diese Daten werden dann in die Transaktion geschrieben.

Wie wir sehen, enthält MLSAG nur einen Challenge c0, was den Durchmesser der Signatur einsparen lässt (der ohnehin schon viel Platz benötigt). Anschließend kann jeder Prüfer, der die Daten verwendet, die Werte c1,…, cm wiederherstellen und überprüfen, dassVertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt. Auf diese Weise ist unser Ring geschlossen und die Signatur hat die Überprüfung bestanden.Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtFür RingCT-Transaktionen des Typs 'full' wird eine zusätzliche Zeile zur Matrix mit den vermischten Ausgängen hinzugefügt, aber darüber werden wir weiter unten sprechen.

Pedersen-Verpflichtungen

Verpflichtungsschemata

Схемы обязательств (häufig wird der englische Begriff — commitments — verwendet) werden verwendet, damit eine Partei beweisen kann, dass sie eine bestimmte Geheimzahl kennt, ohne diese tatsächlich preiszugeben. Zum Beispiel werfen Sie eine Zahl auf den Würfeln, berechnen das Commitment und übergeben es der prüfenden Partei. So kann der Prüfer beim Offenlegen der geheimen Zahl das Commitment selbst berechnen und sich somit vergewissern, dass Sie ihn nicht betrogen haben.

In Monero werden Commitments verwendet, um die Beträge von Transaktionen zu verbergen, und es kommt die am weitesten verbreitete Variante — Pedersen Commitments — zum Einsatz. Übrigens, eine interessante Tatsache — ursprünglich schlugen die Entwickler vor, die Beträge durch normales Mischen zu verbergen, das heißt, Ausgänge mit beliebigen Beträgen hinzuzufügen, um Unsicherheit zu schaffen, aber sie wechselten dann zu Commitments (obwohl es nicht sicher ist, dass sie damit die Größe der Transaktion verringerten, wie wir unten sehen werden).
Im Allgemeinen sieht ein Commitment wie folgt aus:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtDabei ist C — der Wert des Commitments selbst, a — der verborgene Betrag, H — ein fester Punkt auf der elliptischen Kurve (zusätzlicher Generator), und x — eine zufällige Maske, die als versteckender Faktor dient und zufällig generiert wird. Die Maske sorgt dafür, dass eine dritte Partei den Wert des Commitment nicht einfach durch Programmieren erraten kann.

Bei der Generierung eines neuen Outputs berechnet die Wallet das Commitment dafür, und bei der Verwendung stößt sie entweder auf den während der Generierung berechneten Wert oder berechnet es erneut — abhängig von der Art der Transaktion.

RingCT einfach

Bei einfachen RingCT-Transaktionen muss sichergestellt werden, dass die Transaktion Ausgänge in Höhe der Eingaben erstellt (also kein Geld aus dem Nichts erzeugt). Dafür müssen die Summen der Commitments der ersten und zweiten gleich sein, das heißt:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Die Gebührencommitments werden etwas anders berechnet — ohne Maske:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt, wobei a — die Höhe der Gebühr, die öffentlich zugänglich ist.

Dieser Ansatz ermöglicht es, der prüfenden Partei nachzuweisen, dass wir die gleichen Beträge verwenden, ohne diese offenzulegen.

Um es klarer zu machen, lassen Sie uns ein Beispiel betrachten. Angenommen, eine Transaktion verwendet zwei Ausgänge (also werden sie zu Eingängen) in Höhe von 10 und 5 XMR und generiert drei Ausgänge in Höhe von insgesamt 12 XMR: 3, 4 und 5 XMR. Dabei wird eine Gebühr von 3 XMR bezahlt. Somit beträgt die Summe des ausgegebenen Geldes plus die generierte Summe und die Gebühr insgesamt 15 XMR. Lassen Sie uns die Verpflichtungen berechnen und die Differenz ihrer Summen betrachten (denken wir an die Mathematik):

Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Hier sehen wir, dass für die Gleichung, um aufzugehen, die Summen der Masken von Eingängen und Ausgängen gleich sein müssen. Dafür generiert die Brieftasche zufällig x1, y1, y2 und y3, während der verbleibende x2 so berechnet wird:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Mit diesen Masken können wir jedem Prüfer beweisen, dass wir nicht mehr Mittel generieren, als wir ausgeben, ohne die Beträge offenzulegen. Ursprünglich, oder?

RingCT full

Bei Full RingCT-Transaktionen erfolgt die Prüfung der Beträge etwas komplizierter. In diesen Transaktionen berechnet die Brieftasche die Verpflichtungen für die Eingänge nicht neu, sondern verwendet die bei ihrer Generierung berechneten. Es ist anzunehmen, dass die Differenz der Summen nicht mehr gleich null sein wird, sondern stattdessen:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Hier z — die Differenz der Masken von Eingängen und Ausgängen. Betrachtet man zG wie der öffentliche Schlüssel (was er de facto ist), so z — ist der private Schlüssel. Damit kennen wir den öffentlichen und den entsprechenden privaten Schlüssel. Mit diesen Daten können wir sie in der MLSAG-Ringsignatur zusammen mit den öffentlichen Schlüsseln der gemischten Ausgänge verwenden:
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
So garantiert eine gültige Ringsignatur, dass wir alle privaten Schlüssel einer der Spalten kennen, während wir den privaten Schlüssel in der letzten Zeile nur kennen können, wenn die Transaktion nicht mehr Mittel generiert, als sie ausgibt. Übrigens, hier ist die Antwort auf die Frage: 'Warum führen hier die Differenzen der Summen der Commitments nicht zu Null' — wenn zG = 0, dann werden wir die Spalte mit den tatsächlichen Ausgängen offenlegen.

Wie erfährt der Empfänger der Mittel, wie viel Geld ihm gesendet wurde? Das ist ganz einfach — der Absender der Transaktion und der Empfänger tauschen Schlüssel nach dem Diffie-Hellman-Protokoll aus, verwenden den Transaktionsschlüssel und den View-Schlüssel des Empfängers und berechnen ein gemeinsames Geheimnis. Der Absender trägt in spezielle Felder der Transaktion die Daten über die Beträge der Ausgänge ein, verschlüsselt mit diesem gemeinsamen Schlüssel.

Bereichsnachweise

Was passiert, wenn wir eine negative Zahl als Betrag in den commitments verwenden? Dies könnte zur Generierung zusätzlicher Münzen führen! Ein solches Ergebnis ist nicht zulässig, daher ist eine Garantie erforderlich, dass die von uns verwendeten Beträge nicht negativ sind (natürlich ohne diese Beträge offenzulegen, sonst wäre all die Mühe umsonst). Mit anderen Worten, wir müssen nachweisen, dass der Betrag im Intervall liegt [0, 2n — 1].

Um dies zu erreichen, wird der Betrag jedes Outputs in binäre Ziffern zerlegt, und der commitment wird für jede Ziffer separat berechnet. Am besten betrachten wir das anhand eines Beispiels.

Nehmen wir an, die Beträge sind klein und passen in 4 Bits (in der Praxis sind das 64 Bits), und wir erstellen einen Output in Höhe von 5 XMR. Wir berechnen die commitments für jede Ziffer und den Gesamtcommitment für den gesamten Betrag:Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgt
Jeder commitment wird dann mit einem Surrogat vermischt (Ci-2iH) und paarweise mit einer Ringunterschrift von Borromeo signiert (eine weitere Ringunterschrift), die 2015 von Greg Maxwell vorgeschlagen wurde (mehr dazu können Sie lesen hier):
Vertrauliche Transaktionen in Monero: Wie man Unbekanntes ins Unbekannte überträgtDas Ganze wird als Range Proof bezeichnet und ermöglicht es, zu garantieren, dass in den commitments Beträge aus dem Intervall verwendet werden. [0, 2n — 1].

Wie geht es weiter?

In der aktuellen Implementierung nehmen Range-Proofs sehr viel Speicherplatz ein – 6176 Byte pro Ausgabe. Dies führt zu großen Transaktionen und damit zu höheren Gebühren. Um die Transaktionsgröße zu reduzieren, führen die Entwickler von Monero anstelle von Borromeosignaturen Bulletproofs ein – einen Mechanismus für Range-Proofs ohne bitweise Verpflichtungen. Laut einigen Schätzungen, können sie die Größe von Range-Proofs um bis zu 94 % reduzieren. Übrigens wurde die Technologie Mitte Juli einem Audit durch das Unternehmen Kudelski Security unterzogen, das keine wesentlichen Mängel in der Technologie oder deren Implementierung festgestellt hat. Die Technologie wird bereits im Testnetz eingesetzt und könnte mit dem nächsten Hard Fork wahrscheinlich auch in das Hauptnetz übergehen.

Stellen Sie Ihre Fragen, schlagen Sie Themen für neue Artikel über Technologien im Bereich Kryptowährungen vor, und abonnieren Sie unsere Gruppe in Facebook, um über unsere Veranstaltungen und Publikationen informiert zu bleiben.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster