Carrot: neue Adressen
Das neue Adress- und Schlüsselschema, das zusammen mit FCMP++ kommt
Carrot (Cryptonote Address on Rerandomizable-RingCT-Output Transactions) ist das Schema für Adressen und Einmal-Outputs in der FCMP++-Ära. Es behält das bestehende Adressformat bei, führt aber eine flexiblere Schlüsselhierarchie ein (getrennt: „Eingänge sehen“, „alles sehen“, „Key Images erzeugen“, „Ausgabeberechtigung beweisen“), schließt den Janus-Angriff und beschleunigt das Durchsuchen.
Warum ändern, was funktioniert?
Ein FCMP++-Output hat die Form O = x·G + y·T, und die alten Formeln für Einmal-Adressen berücksichtigen das nicht. Da sich ohnehin etwas ändern muss, behebt Carrot langjährige Ärgernisse von CryptoNote:
- View-only-Wallets sehen keine Ausgaben. Man musste Key Images importieren.
- Der Janus-Angriff auf Subadressen: Ein Sender konnte testen, ob zwei Subadressen zusammengehören.
- Der „Burning Bug“: Man konnte zwei Outputs mit demselben Einmalschlüssel senden, und der Empfänger konnte nur einen davon ausgeben.
- Langsames Durchsuchen – Ed25519-Operationen und ein 1-Byte-View-Tag.
Schlüsselhierarchie
| Schlüssel | Erlaubt |
|---|---|
k_vi – view-incoming | eingehende Zahlungen finden (wie der alte View Key) |
k_gi – generate-image | Key Images berechnen → sehen, welche Outputs ausgegeben sind |
s_vb – view-balance | alle eingehenden und ausgehenden Zahlungen sehen, das genaue Guthaben; eigenes Wechselgeld erkennen |
s_ga – generate-address | Subadressen erzeugen (z. B. auf einem Shop-Server) ohne das Recht, Zahlungen zu sehen |
k_ps – prove-spend | der einzige Schlüssel, der zum Ausgeben wirklich nötig ist; kann auf einer Hardware-Wallet liegen |
Kompatibilität mit alten Wallets
Eine bestehende Wallet wird so auf Carrot abgebildet: k_vi = a, k_gi = b, k_ps = 0. Dann ist K_s = b·G = B, und alte Adressen bleiben gleich – man kann an sie senden und sie durchsuchen. Die neuen Möglichkeiten (ein eigener View-Balance-Schlüssel usw.) bekommen Wallets, die nach dem neuen Schema angelegt werden.
Was sich an Outputs sonst noch ändert
- Schlüsselaustausch über X25519 (eine Montgomery-Kurve statt Edwards) – schnelleres Durchsuchen.
- View Tag – 3 Bytes statt 1: 65.536-mal weniger Fehltreffer.
- Janus-Schutz: Dem Output wird ein „Anker“ hinzugefügt, mit dem der Empfänger prüfen kann, dass der Sender die vollständige Adresse kannte, statt sie aus Teilen verschiedener Subadressen zusammenzukleben.
- Schutz vor dem Burning Bug: Der Einmalschlüssel wird an das erste Key Image der Transaktion gebunden, sodass es keine zwei identischen Outputs geben kann.
- Interne Outputs (an sich selbst): Wechselgeld wird über
s_vbgebaut, und eine Wallet mit dem View-Balance-Schlüssel erkennt es zuverlässig.
Die Carrot-Spezifikation ist im Repository jeffro256/carrot veröffentlicht, die FCMP++-Spezifikation in den Papers von kayabaNerve und im Repository monero-oxide. Diese Seite gibt sie sinngemäß wieder; bei Widersprüchen gilt die Spezifikation.