Wir setzen unsere Serie über die Monero-Blockchain fort und der heutige Artikel konzentriert sich auf das RingCT-Protokoll (Ring Confidential Transactions), das vertrauliche Transaktionen und neue Ringsignaturen einführt. Leider gibt es im Internet kaum Informationen darüber, wie es funktioniert, und wir haben versucht, diese Lücke zu schließen.
Wir werden darüber sprechen, wie das Netzwerk mithilfe dieses Protokolls Überweisungsbeträge verbirgt, warum es die klassischen Kryptonoten-Ringsignaturen aufgegeben hat und wie sich diese Technologie weiterentwickeln wird.
Da es sich bei diesem Protokoll um eine der komplexesten Technologien in Monero handelt, benötigt der Leser Grundkenntnisse über das Design dieser Blockchain und vorübergehende Kenntnisse der Elliptischen-Kurven-Kryptographie (um diese Kenntnisse aufzufrischen, können Sie die ersten Kapitel unseres Buches lesen). vorheriger Artikel über
RingCT-Protokoll
Einer der möglichen Angriffe auf Kryptowährungen ist die Blockchain-Analyse, die auf der Kenntnis von Betrag und Zeitpunkt der gesendeten Transaktion basiert. Dies erlaubt
Es ist erwähnenswert, dass die Idee, Beträge zu verbergen, nicht neu ist. Der Bitcoin Core-Entwickler Greg Maxwell war einer der ersten, der es in seinem Beitrag beschrieb
Unter anderem hilft das Protokoll dabei, Probleme mit der Vermischung von Staubausgängen zu beseitigen – Ausgaben kleiner Mengen (normalerweise in Form von Wechselgeld aus Transaktionen erhalten), die mehr Probleme verursachten, als sie wert waren.
Im Januar 2017 erfolgte ein Hard Fork des Monero-Netzwerks, der die optionale Nutzung vertraulicher Transaktionen ermöglichte. Und bereits im September desselben Jahres, mit der Version 6 des Hard Forks, waren solche Transaktionen die einzigen, die im Netzwerk erlaubt waren.
RingCT verwendet mehrere Mechanismen gleichzeitig: mehrschichtige verknüpfte spontane anonyme Gruppensignaturen (Multilayered Linkable Spontaneous Anonymous Group Signature, im Folgenden als MLSAG bezeichnet), ein Commitment-Schema (Pedersen Commitments) und Range Proofs (für diesen Begriff gibt es keine etablierte Übersetzung ins Russische). .
Das RingCT-Protokoll führt zwei Arten anonymer Transaktionen ein: einfache und vollständige. Die erste generiert das Wallet, wenn eine Transaktion mehr als eine Eingabe erfordert, die zweite – im umgekehrten Fall. Sie unterscheiden sich in der Validierung von Transaktionsbeträgen und den mit einer MLSAG-Signatur signierten Daten (wir werden weiter unten mehr darüber sprechen). Darüber hinaus können Transaktionen vom Typ „Full“ mit beliebig vielen Eingaben generiert werden, es gibt keinen grundsätzlichen Unterschied. Im Buch
MLSAG-Signatur
Erinnern wir uns daran, was signierte Transaktionseingaben sind. Jede Transaktion gibt etwas Geld aus und generiert es. Die Generierung von Geldern erfolgt durch die Erstellung von Transaktionsoutputs (eine direkte Analogie sind Rechnungen), und der Output, den die Transaktion ausgibt (schließlich geben wir im wirklichen Leben Banknoten aus), wird zum Input (Vorsicht, es ist sehr leicht, verwirrt zu werden). Hier).
Eine Eingabe verweist auf mehrere Ausgaben, gibt jedoch nur eine aus und erzeugt so eine „Nebelwand“, die die Analyse des Übersetzungsverlaufs erschwert. Wenn eine Transaktion mehr als eine Eingabe hat, kann eine solche Struktur als Matrix dargestellt werden, wobei die Zeilen die Eingaben und die Spalten die gemischten Ausgaben sind. Um dem Netzwerk zu beweisen, dass die Transaktion genau ihre Ausgaben ausgibt (ihre geheimen Schlüssel kennt), werden die Eingaben mit einer Ringsignatur signiert. Eine solche Signatur garantiert, dass der Unterzeichner die geheimen Schlüssel für alle Elemente einer der Spalten kannte.
Vertrauliche Transaktionen nutzen keine klassischen Transaktionen mehr
Sie werden Multilayer genannt, weil sie mehrere Eingaben gleichzeitig signieren, von denen jede mit mehreren anderen gemischt wird, d. h. eine Matrix wird signiert und nicht eine Zeile. Wie wir später sehen werden, hilft dies, die Signaturgröße zu sparen.
Schauen wir uns an, wie eine Ringsignatur entsteht, am Beispiel einer Transaktion, die 2 echte Ausgaben ausgibt und m – 1 zufällige Ausgaben aus der Blockchain zum Mischen verwendet. Bezeichnen wir die öffentlichen Schlüssel der Ausgaben, die wir ausgeben, als
, und Schlüsselbilder für sie entsprechend: Somit erhalten wir eine Größenmatrix 2 x m. Zunächst müssen wir die sogenannten Herausforderungen für jedes Ausgabepaar berechnen:
Wir beginnen die Berechnungen mit den Ausgaben, die wir mit ihren öffentlichen Schlüsseln ausgeben:und ZufallszahlenAls Ergebnis erhalten wir folgende Werte:
, die wir zur Berechnung der Herausforderung verwenden
das nächste Ausgabepaar (um leichter zu verstehen, was wir wo ersetzen, haben wir diese Werte in verschiedenen Farben hervorgehoben). Alle folgenden Werte werden im Kreis anhand der in der ersten Abbildung angegebenen Formeln berechnet. Als letztes muss die Herausforderung für ein Paar realer Ausgaben berechnet werden.
Wie wir sehen können, verwenden alle Spalten außer der Spalte mit den realen Ausgaben zufällig generierte Zahlen. Für π- Kolumne werden wir sie auch brauchen. Lasst uns transformierenin s:
Die Signatur selbst ist ein Tupel all dieser Werte:
Diese Daten werden dann in eine Transaktion geschrieben.
Wie wir sehen können, enthält MLSAG nur eine Herausforderung c0, wodurch Sie die Signaturgröße einsparen können (die bereits viel Platz benötigt). Darüber hinaus kann jeder Inspektor die Daten verwenden, stellt die Werte c1,…, cm wieder her und überprüft das. Damit ist unser Ring geschlossen und die Signatur verifiziert.
Für RingCT-Transaktionen des vollständigen Typs wird der Matrix mit gemischten Ausgaben eine weitere Zeile hinzugefügt, aber darüber werden wir weiter unten sprechen.
Pedersen Verpflichtungen
Monero-Verpflichtungen werden verwendet, um die Beträge der Überweisungen zu verbergen und nutzen die häufigste Option – Pedersen-Verpflichtungen. Übrigens eine interessante Tatsache: Zuerst schlugen die Entwickler vor, die Beträge durch gewöhnliches Mischen zu verbergen, d die Transaktionsgröße, wie wir weiter unten sehen werden).
Im Allgemeinen sieht Engagement so aus:
Wo C — die Bedeutung des Engagements selbst, a - versteckter Betrag, H ist ein fester Punkt auf der elliptischen Kurve (zusätzlicher Generator) und x – eine Art willkürliche Maske, ein zufällig generierter Versteckfaktor. Hier ist die Maske nötig, damit ein Dritter den Wert des Engagements nicht einfach erraten kann.
Wenn eine neue Ausgabe generiert wird, berechnet das Wallet das dafür erforderliche Commitment, und wenn es ausgegeben wird, nimmt es entweder den bei der Generierung berechneten Wert oder berechnet ihn neu, abhängig von der Art der Transaktion.
RingCT einfach
Bei einfachen RingCT-Transaktionen ist es notwendig, dass die Summe der Verpflichtungen der ersten und zweiten Transaktion die Summe der Verpflichtungen der ersten und zweiten Transaktion ist, um sicherzustellen, dass die Transaktion Outputs in einer Höhe erzeugt, die der Menge der Inputs entspricht (kein Geld aus dem Nichts produziert). die gleichen sein, das heißt:
Engagement-Kommissionen sehen das etwas anders – ohne Maske:
Wo a — Die Höhe der Provision ist öffentlich zugänglich.
Mit diesem Ansatz können wir der vertrauenden Partei nachweisen, dass wir die gleichen Beträge verwenden, ohne diese offenzulegen.
Schauen wir uns zur Verdeutlichung ein Beispiel an. Nehmen wir an, eine Transaktion gibt zwei Ausgaben (d. h. sie werden zu Eingaben) von 10 und 5 XMR aus und generiert drei Ausgaben im Wert von 12 XMR: 3, 4 und 5 XMR. Gleichzeitig zahlt er eine Provision von 3 XMR. Somit beträgt der ausgegebene Geldbetrag zuzüglich des generierten Betrags und der Provision 15 XMR. Versuchen wir, die Verpflichtungen zu berechnen und uns die Differenz ihrer Beträge anzusehen (denken Sie an die Mathematik):
Hier sehen wir, dass die Summen der Eingabe- und Ausgabemasken gleich sein müssen, damit die Gleichung konvergiert. Dazu generiert das Wallet zufällig x1, y1, y2 und y3, und der Rest x2 rechnet so:
Mithilfe dieser Masken können wir jedem Gutachter nachweisen, dass wir nicht mehr Mittel erwirtschaften, als wir ausgeben, ohne den Betrag offenzulegen. Original, oder?
RingCT voll
Bei vollständigen RingCT-Transaktionen ist die Überprüfung der Überweisungsbeträge etwas komplizierter. Bei diesen Transaktionen berechnet das Wallet die Verpflichtungen für Eingaben nicht neu, sondern verwendet die bei ihrer Generierung berechneten. In diesem Fall müssen wir davon ausgehen, dass wir nicht mehr die Differenz der Summen gleich Null bekommen, sondern:
Hier z — Unterschied zwischen Eingabe- und Ausgabemasken. Wenn wir darüber nachdenken zG als öffentlicher Schlüssel (was es de facto ist). z ist der private Schlüssel. Somit kennen wir den öffentlichen und den entsprechenden privaten Schlüssel. Mit diesen Daten können wir sie zusammen mit den öffentlichen Schlüsseln der gemischten Ausgaben in der MLSAG-Ringsignatur verwenden:
Somit stellt eine gültige Ringsignatur sicher, dass wir alle privaten Schlüssel einer der Spalten kennen, und wir können den privaten Schlüssel in der letzten Zeile nur kennen, wenn die Transaktion nicht mehr Geld generiert, als sie ausgibt. Hier ist übrigens die Antwort auf die Frage „Warum führt die Differenz in der Höhe der Zusagen nicht zu Null“ – wenn zG = 0, dann erweitern wir die Spalte mit realen Ausgaben.
Woher weiß der Empfänger des Geldes, wie viel Geld ihm überwiesen wurde? Hier ist alles einfach: Der Absender der Transaktion und der Empfänger tauschen Schlüssel mithilfe des Diffie-Hellman-Protokolls aus, verwenden den Transaktionsschlüssel und den Ansichtsschlüssel des Empfängers und berechnen das gemeinsame Geheimnis. Der Absender schreibt die mit diesem gemeinsamen Schlüssel verschlüsselten Daten über die Ausgabebeträge in spezielle Felder der Transaktion.
Reichweitenbeweise
Was passiert, wenn Sie als Betrag in den Verpflichtungen eine negative Zahl verwenden? Dies kann zur Generierung zusätzlicher Coins führen! Dieses Ergebnis ist inakzeptabel, daher müssen wir garantieren, dass die von uns verwendeten Beträge nicht negativ sind (natürlich ohne diese Beträge offenzulegen, sonst ist die Arbeit so viel und alles umsonst). Mit anderen Worten: Wir müssen beweisen, dass die Summe im Intervall liegt [0, 2n - 1].
Dazu wird die Summe jeder Ausgabe in Binärziffern unterteilt und das Commitment für jede Ziffer separat berechnet. Es ist besser, anhand eines Beispiels zu sehen, wie dies geschieht.
Nehmen wir an, dass unsere Mengen klein sind und in 4 Bit passen (in der Praxis sind das 64 Bit), und wir erstellen eine Ausgabe im Wert von 5 XMR. Wir berechnen die Verpflichtungen für jede Kategorie und die Gesamtverpflichtung für den Gesamtbetrag:
Als nächstes wird jede Zusage mit einem Stellvertreter gemischt (Ci-2iH) und ist paarweise mit der Borromeo-Ringsignatur (einer weiteren Ringsignatur) signiert, die 2015 von Greg Maxwell vorgeschlagen wurde (mehr darüber können Sie lesen).
Zusammenfassend wird dies als Bereichsnachweis bezeichnet und ermöglicht es Ihnen, sicherzustellen, dass Verpflichtungen Beträge innerhalb des Bereichs verwenden [0, 2n - 1].
Was kommt als nächstes?
In der aktuellen Implementierung beanspruchen Bereichsnachweise viel Platz – 6176 Byte pro Ausgabe. Dies führt zu größeren Transaktionen und damit höheren Gebühren. Um die Größe einer Monero-Transaktion zu reduzieren, führen Entwickler Bulletproofs anstelle von Borromeo-Signaturen ein – einen Range-Proof-Mechanismus ohne bitweise Verpflichtungen.
Stellen Sie Ihre Fragen, schlagen Sie Themen für neue Artikel über Technologien im Bereich Kryptowährung vor und abonnieren Sie auch unsere Gruppe in
Source: habr.com