Technik › Wie viel?

Range Proofs und Bulletproofs+

Beweisen, dass eine verborgene Zahl zwischen 0 und 2⁶⁴ liegt, ohne sie preiszugeben

Kurz gesagt

Jeder Output beweist, dass sein Betrag v in [0, 2⁶⁴) liegt. Das schließt die Lücke der „negativen Beträge“. Monero verwendet Bulletproofs+ (seit August 2022): ein aggregierter Beweis pro Transaktion, dessen Größe logarithmisch wächst – ~600 Bytes für 2 Outputs.

Die Idee: die Zahl in Bits zerlegen

Eine Zahl in [0, 2⁶⁴) besteht aus 64 Bits: v = b₀·1 + b₁·2 + b₂·4 + … + b₆₃·2⁶³, wobei jedes bᵢ ∈ {0, 1}. Beweist du, dass (1) jedes bᵢ wirklich 0 oder 1 ist und (2) die gewichtete Summe der Bits gleich v ist, dann liegt v sicher im Bereich.

Die Bedingung „ist ein Bit“ ist algebraisch: bᵢ·(bᵢ − 1) = 0. Die Aufgabe wird also: beweisen, dass eine Menge verborgener Zahlen eine Menge von Gleichungen erfüllt, ohne die Zahlen preiszugeben.

Entwicklung in Monero

ZeitraumSchemaGröße (2 Outputs)Funktionsweise
2017–2018Borromean~13 KBJedes Bit ist ein eigenes Commitment + eine Ringsignatur „das ist ein Commitment auf 0 oder 2ⁱ“. Lineare Größe.
Okt. 2018 – Aug. 2022Bulletproofs~700 BytesInner-Product-Argument: logarithmische Größe, mehrere Outputs in einem Beweis aggregiert.
seit Aug. 2022Bulletproofs+~600 BytesVerbesserte Variante (gewichtetes inneres Produkt): noch kleiner und schneller.

Der Umstieg auf Bulletproofs 2018 machte Transaktionen etwa 10× kleiner und senkte die Gebühren im selben Maß. Eines der spürbarsten Upgrades in der Geschichte von Monero.

Wie Bulletproofs funktioniert (Intuition)

  1. Der Beweisende legt sich mit einem einzigen Vektor-Pedersen-Commitment auf den Bitvektor a_L und den Vektor a_R = a_L − 1 fest.
  2. Der Prüfer schickt (über einen Hash, Fiat–Shamir) zufällige Challenges y, z. Alle 64 „ist ein Bit“-Bedingungen und die „Summen“-Bedingung werden zu einer einzigen Gleichung mit innerem Produkt ⟨l, r⟩ = t zusammengeklebt. Die zufälligen Challenges sorgen dafür, dass man die zusammengeklebte Gleichung nicht fälschen kann, ohne alle ursprünglichen zu erfüllen.
  3. Ein inneres Produkt von Vektoren der Länge n wird rekursiv bewiesen: In jedem Schritt werden die Vektoren mit einer neuen Challenge „in der Mitte gefaltet“, und nach log₂ n Schritten bleibt je eine Zahl übrig. Jeder Schritt sendet 2 Punkte – daher die logarithmische Größe.
64 Elemente 32 16 8 … → 1 pro Schritt: +2 Punkte (L, R) Schritte: log₂(64·m) Größe ≈ 2·log₂(64·m) Punkte + Konst. m – Anzahl der Outputs (Aggregation)

Aggregation: Für m Outputs haben die Vektoren die Länge 64·m, und die Größe wächst nur um 2·log₂ m Punkte. Deshalb begrenzt Monero die Outputs pro Transaktion auf 16 und füllt auf eine Zweierpotenz auf.

Vor- und Nachteile

+

  • Kein Trusted Setup (anders als zk-SNARKs in Zcash Sprout/Sapling).
  • Beruht nur auf der Schwierigkeit des diskreten Logarithmus – dieselbe Annahme wie der Rest von Monero.
  • Kompakt und aggregierbar.
  • Viele Beweise lassen sich gemeinsam prüfen (Batch-Verifikation).

−

  • Die Prüfung ist linear in der Anzahl der Bits – ein beträchtlicher Teil der Prüfzeit eines Blocks.
  • Nicht quantenresistent: Ein Quantencomputer würde die Bindung (Binding) von Pedersen brechen (er könnte Geld drucken), das Verbergen (Hiding) bliebe aber erhalten.
Verbindung zu FCMP++

FCMP++ verwendet eine Verallgemeinerung derselben Technik – Generalized Bulletproofs –, um einen Pfad im Baum aller Outputs zu beweisen. Bulletproofs zu verstehen ist eine gute Grundlage für die Beweise in FCMP++.