NIP-60: Cashu Wallet
NIP-60 definiert, wie Cashu-basierte ecash-Wallets innerhalb von Nostr funktionieren. Wallet-Informationen werden auf Relays gespeichert, wodurch portable Wallets möglich werden, die über verschiedene Anwendungen hinweg ohne separate Accounts funktionieren.
Funktionsweise
NIP-60 verwendet drei zentrale Event-Typen, die auf Relays gespeichert werden, plus ein optionales Hilfs-Event für ausstehende Quotes:
Wallet Event (kind 17375): Ein ersetzbares Event mit verschlüsselter Wallet-Konfiguration, einschließlich Mint-URLs und eines private key für den Zahlungsempfang. Dieser Schlüssel ist vom Nostr-Identitätsschlüssel des Nutzers getrennt.
Token Events (kind 7375): Speichern verschlüsselte, nicht ausgegebene Cashu-Proofs. Wenn Proofs ausgegeben werden, löscht der Client das alte Event und erstellt ein neues mit allen verbleibenden Proofs.
Spending History (kind 7376): Optionale Transaktionsaufzeichnungen, die Geldbewegungen zeigen, mit verschlüsseltem Inhalt und Referenzen auf erzeugte oder zerstörte Token-Events.
Quote Events (kind 7374): Optionaler verschlüsselter Zustand für ausstehende Mint-Quotes. Die Spezifikation empfiehlt kurzlebige Events mit Expiration-Tags, vor allem für Fälle, in denen lokaler Zustand nicht ausreicht.
Zustandsmodell
Bei NIP-60 geht es um die Synchronisierung des Wallet-Zustands, nicht um den eigentlichen Geldempfang. Das Wallet-Event sagt einem Client, welche Mints und welchen Wallet-Key er verwenden soll, während Token-Events den eigentlichen Kontostand darstellen, weil sie die nicht ausgegebenen Proofs enthalten.
Diese Unterscheidung ist wichtig für Interoperabilität. Zwei Clients können dieselbe Wallet nur dann gleich darstellen, wenn sie Token-Rollover gleich interpretieren: Proofs ausgeben, Ersatz-Proofs veröffentlichen und das ausgegebene Token-Event über NIP-09 löschen, damit andere Clients ausgegebene Proofs nicht weiter als Guthaben zählen.
Warum das wichtig ist
- Ease of use - Neue Nutzer können sofort ecash empfangen, ohne erst ein externes Account-Setup zu brauchen
- Interoperability - Wallet-Daten folgen Nutzern über verschiedene Nostr-Anwendungen hinweg
- Privacy - Alle Wallet-Daten sind zu den Schlüsseln des Nutzers verschlüsselt
- Proof management - Wallet-Zustandswechsel werden verfolgt, damit Clients auf denselben Kontostand konvergieren können
Interop-Hinweise
Clients suchen zuerst über kind 10019 nach Wallet-Relay-Informationen und greifen auf die Relay-Liste des Nutzers aus NIP-65 zurück, wenn keine eigene Wallet-Relay-Liste vorhanden ist. Dieser Fallback ist nützlich, aber Wallet-Portabilität hängt trotzdem davon ab, dass Relays die verschlüsselten Wallet-Events tatsächlich speichern und ausliefern.
Die Spezifikation verlangt außerdem, dass der private Wallet-Schlüssel vom Nostr-Identitätsschlüssel des Nutzers getrennt bleibt. Dadurch bleibt die Verarbeitung eingehender Wallet-Zahlungen vom Haupt-Signing-Key isoliert und das Risiko sinkt, einen Schlüssel für zwei verschiedene Zwecke wiederzuverwenden.
Ablauf
- Der Client lädt die Wallet-Konfiguration von Wallet-Relays oder aus der Relay-Liste des Nutzers
- Token-Events werden geladen und entschlüsselt, um verfügbare Mittel zu ermitteln
- Beim Ausgeben entstehen neue Token-Events und alte werden gelöscht
- Optionale History-Events zeichnen Transaktionen zur Referenz des Nutzers auf
Primärquellen:
Erwähnt in:
- Newsletter #3: December Recap
- Newsletter #11: NIP Deep Dive
- Newsletter #13: Shopstr and Milk Market Open MCP Commerce Surfaces
Siehe auch: