NIP-46: Nostr Connect
NIP-46は、Nostr relay越しのremote signingを定義します。clientは、bunkerと呼ばれる別のsignerに処理を依頼できるため、signing keyをいま使っているappの外に置けます。
仕組み
- clientは、bunker session専用のlocal keypairを生成します。
- 接続は
bunker://またはnostrconnect://URIで開始します。 - clientとsignerは、relay上で暗号化されたkind
24133request/response eventをやり取りします。 - 接続後、clientは
get_public_keyを呼び出して、実際に署名対象となるuser pubkeyを取得します。
接続方法
- bunker:// - signer主導の接続
- nostrconnect:// - QR codeやdeep link経由でclientが始める接続
nostrconnect:// flowにはshared secretが必須です。これによりclientは、最初のresponseが意図したsignerから来たものかを検証でき、単純なconnection spoofingを防げます。
サポートされる操作
sign_event- 任意のeventに署名get_public_key- signerからuserのpubkeyを取得nip04_encrypt/decrypt- NIP-04暗号化操作nip44_encrypt/decrypt- NIP-44暗号化操作switch_relays- signerに更新済みrelay setを要求
多くの実装では、setup時にsign_event:1やnip44_encryptのようなpermission stringも使います。signerは、全面的なaccessではなく、狭いscopeだけを承認できます。
Relayと信頼モデル
NIP-46はprivate keyをclientの外へ移しますが、signerへの信頼そのものは消しません。signerはrequestを承認、拒否、遅延でき、clientが求めたすべての操作を見られます。relay選択も重要で、protocolは両者が到達できるrelay上でrequestとresponseが届くことに依存します。
switch_relays methodは、signerが時間とともにsessionを別のrelay setへ移せるようにするためのものです。これを無視するclientは、signerのrelay設定が変わったときに信頼性が落ちます。
主要ソース:
言及箇所:
- Newsletter #1: Notable Code Changes
- Newsletter #3: December Recap
- Newsletter #7: Primal Android Becomes a Full Signing Hub
- Newsletter #15: NDK Collaborative Events and NIP-46 Timeout
関連項目: