Technik › FCMP++

SA+L: Ausgabeberechtigung und Key Image

Das verallgemeinerte Schnorr-Protokoll, das in FCMP++ die "Signatur" ersetzt

Kurz gesagt

SA+L (Spend Authorization + Linkability) ist ein kleiner Beweis auf Ed25519 für jeden Input. Er zeigt: „Ich kenne x und y für den rerandomisierten Schlüssel Õ, und das veröffentlichte Key Image L ist gleich x·I für denselben Output.“ Technisch ist es ein verallgemeinertes Schnorr-Protokoll (GSP) – mehrere Schnorr-Gleichungen, die durch gemeinsame Geheimnisse verbunden sind.

Verallgemeinertes Schnorr in einer Minute

Gewöhnliches Schnorr beweist die Kenntnis eines x in einer Gleichung P = x·G. Die verallgemeinerte Version beweist die Kenntnis eines Vektors von Geheimnissen (w₁, …, wₖ), der mehrere lineare Gleichungen über Punkten erfüllt:

Y_j = Σ_k w_k · X_{j,k}    für jede Gleichung j

Das Protokoll ist dasselbe wie für einen Schlüssel:

  1. wähle zufällige α_k und veröffentliche A_j = Σ α_k·X_{j,k} für jede Gleichung;
  2. Challenge c = Hs(alles Veröffentlichte);
  3. Antworten s_k = α_k + c·w_k;
  4. Prüfung: Σ s_k·X_{j,k} = A_j + c·Y_j für jedes j.

Das entscheidende Detail: Dieselbe Antwort s_k wird in jeder Gleichung verwendet, in der w_k vorkommt. Der Prüfer erfährt also nicht nur „kennt irgendwelche Geheimnisse“, sondern „kennt dieselben Geheimnisse für alle Gleichungen“. So werden Ausgabeberechtigung und Key Image verknüpft.

Welche Gleichungen SA+L beweist

Öffentlich: Õ, Ĩ, R, L und die Generatoren G, T, U, V. Die Geheimnisse des Ausgebenden: x, y (Output-Schlüssel) und r_o, r_i, r_r_i (die „Farbe“ der Rerandomisierung). Vereinfacht beweist SA+L das System:

Õ = x·G + (y + r_o)·T
R = r_i·V + r_r_i·T
L = x·Ĩ − (x·r_i)·U die letzte lautet L = x·(Ĩ − r_i·U) = x·I; das Produkt x·r_i wird als eigenes Geheimnis eingeführt, und die Verbindung zu R verhindert, dass man es fälscht

Die genauen Gleichungen in der Spezifikation weichen etwas ab (sie behandeln sorgfältig, welche Produkte von Geheimnissen nötig sind und wie man Lecks vermeidet), aber die Idee ist genau diese: ein Beweis, in dem x sowohl Õ „öffnet“ als auch L „erzeugt“.

Warum nicht einfach eine Signatur

In RingCT erledigte CLSAG drei Dinge auf einmal: den Input in einem Ring verstecken, die Ausgabeberechtigung beweisen und das Key Image verknüpfen. In FCMP++ übernimmt der Mitgliedschaftsbeweis die erste Aufgabe. Zwei bleiben – gelöst durch ein viel einfacheres Protokoll. Das bringt:

  • geringe Größe – ein paar Punkte und Skalare pro Input;
  • Rollentrennung – das Gerät mit dem Schlüssel (eine Hardware-Wallet) kann SA+L berechnen, während ein Computer ohne den Schlüssel den schweren Mitgliedschaftsbeweis baut;
  • Forward Secrecy – dank y·T im Schlüssel (siehe den Überblick);
  • Grundlage für Multisig – die lineare Struktur von GSP lässt sich gut auf mehrere Unterzeichner aufteilen (FROST-ähnliche Schemata).

Was signiert wird

Die Challenge c enthält einen Hash der gesamten Transaktion (Präfix, Outputs, Commitments), wie bei CLSAG. Deshalb wirkt SA+L auch als Signatur: Ändert man nach dem Signieren auch nur ein Byte der Transaktion, ist der Beweis nicht mehr gültig.

Für Neugierige

Formale Definitionen stehen in Luke Parkers FCMP++-Paper und in der Rust-Implementierung (das Projekt monero-oxide). Protokoll und Implementierung wurden extern auditiert; Links zu den Berichten sind in Diskussionen des Monero Research Lab auf GitHub gesammelt.