Range Proofs und Bulletproofs+
Beweisen, dass eine verborgene Zahl zwischen 0 und 2⁶⁴ liegt, ohne sie preiszugeben
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
| Zeitraum | Schema | Größe (2 Outputs) | Funktionsweise |
|---|---|---|---|
| 2017–2018 | Borromean | ~13 KB | Jedes Bit ist ein eigenes Commitment + eine Ringsignatur „das ist ein Commitment auf 0 oder 2ⁱ“. Lineare Größe. |
| Okt. 2018 – Aug. 2022 | Bulletproofs | ~700 Bytes | Inner-Product-Argument: logarithmische Größe, mehrere Outputs in einem Beweis aggregiert. |
| seit Aug. 2022 | Bulletproofs+ | ~600 Bytes | Verbesserte 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)
- Der Beweisende legt sich mit einem einzigen Vektor-Pedersen-Commitment auf den Bitvektor
a_Lund den Vektora_R = a_L − 1fest. - 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⟩ = tzusammengeklebt. Die zufälligen Challenges sorgen dafür, dass man die zusammengeklebte Gleichung nicht fälschen kann, ohne alle ursprünglichen zu erfüllen. - 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₂ nSchritten bleibt je eine Zahl übrig. Jeder Schritt sendet 2 Punkte – daher die logarithmische Größe.
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.
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++.