NIP-60: Cashu Wallet
NIP-60は、Cashuベースのecash walletがNostr内でどう動作するかを定義します。wallet情報はrelay上に保存され、別アカウントなしで異なるapplication間をまたいで使えるportable walletを実現します。
仕組み
NIP-60は、relay上に保存される3つの中核event typeと、pending quote向けの1つの任意helper eventを使います。
Wallet Event(kind 17375): mint URLと支払い受信用の秘密鍵を含む、暗号化されたwallet configurationを持つreplaceable event。この鍵は、ユーザーのNostr identity keyとは別です。
Token Events(kind 7375): 未使用のCashu proofを暗号化して保存します。proofが使われたら、clientは古いeventを削除し、残っているproofを含む新eventを作ります。
Spending History(kind 7376): 資金移動を示す任意のtransaction recordで、暗号化contentと、作成または消費されたtoken eventへの参照を持ちます。
Quote Events(kind 7374): pending mint quoteのための任意の暗号化state。仕様は、主にローカルstateだけでは足りないケース向けに、expiration tags付きの短命イベントを推奨しています。
状態モデル
NIP-60の焦点は、お金を受け取る行為そのものではなくwallet stateの同期です。wallet eventはclientへどのmintとwallet keyを使うべきかを伝え、token eventsが未使用proofを含むため、実際の残高stateになります。
この違いは相互運用で重要です。2つのclientが同じwalletを表示できるのは、token rolloverを同じように解釈した場合だけです。proofを使い、新しいreplacement proofを公開し、spent token eventをNIP-09経由で削除して、他clientが使用済みproofを残高として数え続けないようにする必要があります。
なぜ重要か
- Ease of use - 新規ユーザーが外部アカウント設定なしで即座にecashを受け取れる
- Interoperability - wallet dataが異なるNostr application間でユーザーに追随する
- Privacy - すべてのwallet dataがユーザーの鍵で暗号化される
- Proof management - wallet state遷移を追跡し、clientが同じ残高へ収束できるようにする
相互運用メモ
clientはまずkind 10019を通じてwallet relay情報を探し、専用のwallet relay listがない場合はユーザーのNIP-65 relay listへfallbackします。このfallbackは有用ですが、wallet portabilityは依然として、それらrelayが暗号化wallet eventを実際に保存し配信することに依存します。
仕様はまた、wallet private keyをユーザーのNostr identity keyと分離することも求めています。これによりwalletのreceipt handlingが主署名鍵から切り離され、1つの鍵が2つの目的に再利用される危険が減ります。
Workflow
- clientはwallet relaysまたはユーザーrelay listからwallet configurationを取得する
- token eventsを読み出して復号し、利用可能資金を得る
- 支払い時は新しいtoken eventを作成し、古いものを削除する
- 任意のhistory eventがtransactionを記録し、ユーザー参照に使われる
Primary sources:
Mentioned in:
- Newsletter #3: December Recap
- Newsletter #11: NIP Deep Dive
- Newsletter #13: Shopstr and Milk Market Open MCP Commerce Surfaces
See also: