Nostr Wallet Connect(NWC)は、NIP-47という文書にまとめられた共通ルールです。アプリからLightningウォレットへNostr経由で要求を送るために使います。relay(リレー)という中継サーバーが運ぶのは、暗号化された指示と応答であり、ビットコインそのものではありません。権限の管理と支払いの実行はウォレットサービスが担います。
アンナはポッドキャストを聴き、作者にLightning Networkで少額を送りたいと考えます。NWCを使うと、プレーヤーから直接ウォレットに支払いを依頼できます。ウォレットサービスはまず接続の権限を確かめ、許可された要求だけを実行します。NWC自体は、誰がビットコインの鍵を持つかを決めません。接続先はアンナ自身のノードの場合も、資金を預かるサービスの場合もあります。同じ「ウォレットを接続」ボタンでも、お金を管理する主体は大きく違い得ます。また、与えた権限によっては、支払いのたびに新たな確認を求めずアプリが動作することもあります。 [1] [2]
通常、ウォレットはQRコードや文字列の接続情報を表示します。技術的にはURIと呼ばれ、サービスの公開鍵、リレーのアドレス、そしてクライアント接続の秘密鍵であるsecretが入っています。これはウォレットのシード、つまり元になる秘密の値でも、復元用の単語であるSeed Phraseでもありません。それでも、無害な公開リンクではありません。有効なコピーを得た人は、同じ権限を行使できます。被害の範囲は許可した機能と制限次第です。アプリごとに接続を分ければ、識別して個別に取り消しやすくなり、接続同士の関連付けも減らせます。 [1]
残高を見るだけのアプリと、お金を送るアプリでは必要な権限が違います。公開のinfoイベントはサービスの対応機能を知らせ、get_infoは特定の接続で使えるメソッドを返します。メソッドとは名前の付いた命令です。pay_invoiceは支払いを依頼し、make_invoiceは支払い要求を作り、lookup_invoiceはその状態を調べ、get_balanceは残高を読みます。get_info自体も基本機能です。履歴、事前の請求書を必要としない支払いであるkeysend、通知は任意の拡張です。サーバーが命令に対応していても、すべての接続アプリに実行権限があるとは限りません。 [1] [3] [5]
アンナはプレーヤーに限られた予算だけを渡したいかもしれません。サービスが金額、メソッド、有効期間の制限を提供するなら、そのサービス自身が制限を守らせる必要があります。プレーヤーの画面に数字が表示されるだけでは、別の要求を送るアプリを防げません。予算が使い切りなのか補充されるのか、手数料をどう数えるのかも確認します。アプリを使わなくなったら、ウォレットサービス側で権限を取り消します。アプリの削除やローカルの接続削除だけでは、アクセスが失効した証拠になりません。取り消しは将来の要求を止めますが、完了済みの支払いは戻しません。 [1]
Lightningの請求書は、例えばBOLT11形式の支払い要求であり、支払い済みの証明ではありません。NIP-47では金額と手数料をsatoshiの千分の一であるmsatで表します。1000 msat = 1 satです。単位を取り違えると金額が千倍違います。make_invoiceは要求を作るだけです。成功したpay_invoiceはpreimageを返します。この値からハッシュという短い照合用の値を計算します。それが請求書の支払いハッシュと一致する必要があり、返されたpreimageが支払い完了の証拠になります。エラー応答にはerrorが使われます。状態はlookup_invoiceで調べられます。アプリはメッセージを送っただけで成功と表示せず、実際の結果を処理しなければなりません。 [1]
アンナが支払うボタンを押しても、応答が来ません。Timeout、つまり待ち時間の終了だけでは、お金がどうなったかは分かりません。NWCの要求と応答は一時的なイベントを使うため、リレーの切断やサービスの停止でメッセージが失われることがあります。しかし、支払いは完了し、応答だけが失われた可能性もあります。まずlookup_invoiceかウォレット自体で状態を確認します。無応答は失敗の証明ではありません。新たな要求を、前の操作の安全な繰り返しと決めつけてはいけません。先に元の結果を確かめる必要があります。 [1]
アプリとウォレットは暗号化メッセージを交換します。現在の方式選択ではnip44_v2を優先し、古いnip04は互換性のために残されています。encryptionタグがなければ旧方式を意味します。ただしNIP-44は、長期鍵が後で漏れても過去の通信を守るforward secrecyを備えていません。リレーはイベントの種類、タグ、接続の公開鍵、時刻も見ることができます。したがってNWCには、Nostrで投稿する際の主要な本人識別用の鍵を使うべきではありません。鍵を分けると支払いと公開プロフィールの関連付けを減らせますが、完全な匿名性は保証しません。 [1] [4]
通常の利用にメッセージ番号の暗記は不要ですが、連携機能を作る際には重要です。Infoはkind 13194、要求は23194、応答は23195を使います。kindはイベントの種類を示します。pタグは通信相手を、応答のeタグは元の要求を示します。クライアントは署名、想定したサービスの鍵、要求との対応、そして結果が属する命令名result_typeを検証します。リレーから来た任意のメッセージを確認として扱ってはいけません。そうしないと、他人の応答や別の操作の応答を、この支払いの結果と誤認しかねません。 [1]
理解を深めるには、この項目とあわせて次もお読みください Nostr, Lightning Network, BOLT 11, ウォレット, Private Key, Satoshi. 次の項目からも参照されています Nostr, BOLT 11.