generated at
NIP-46
> Nostr Connect

簡単にいうと、NIP-07と同等の機能をNostrプロトコル上で実現する仕組み

既にこの仕様を実装する署名アプリ(NIP-07拡張機能に相当するアプリ)の開発が進行中。

hr
NIPの翻訳

hr
趣旨(Rationale)
秘密鍵はできるだけシステム(アプリ・OS・デバイス)にさらけ出すべきではない。そのたびに攻撃対象領域が広がってしまうため。
秘密鍵の入力もまた面倒な上、OSのクリップボード(悪意あるアプリに監視されているかもしれない)などのよりたくさんのシステムに秘密鍵を曝け出すことになる。

用語
アプリ(App): 「Nostrアカウントの代わりに行動すること」を要求するNostrアプリケーション
署名アプリ(Signer): Nostrアカウントの秘密鍵を保持し、代わりに署名を行うNostrアプリケーション

要約(TL;DR)
アプリ署名アプリ はkind 24133 のイベントを用い、任意に選んだリレー上で一時的(ephemeral)で暗号化されたメッセージをお互いに送り合う
アプリは署名者に対し、公開鍵の取得やイベントの署名などの処理を要求する
イベントの content は、暗号化されたJSONRPC風の リクエストレスポンス でなければならない

署名器プロトコル
メッセージ
リクエスト.json
{ "id": <random_string>, // ランダム文字列 "method": <one_of_the_methods>, // メソッド名 "params": [<anything>, <else>] // 引数(任意の値) }

レスポンス.json
{ "id": <request_id>, // リクエストのid "result": <anything>, // 結果(任意の値) "error": <reason> // エラーの理由 }

メソッド
(特筆しない場合、引数・結果は空)

必須: 署名アプリ(signer app)が実装しなければならない(MUST)必須のメソッド。
describe
結果: ["describe", "get_public_key", "sign_event", ...] (訳注: 実装しているメソッドの名前の配列)
get_public_key
結果: pubkey
sign_event
引数: [event]
結果: event_with_signature (署名されたイベント)
任意
connect
引数: [ pubkey ]
disconnect
(引数・結果ともに空)
delegate (訳注: NIP-26も参照のこと)
引数: [ delegatee , { kind: number, since: number, until: number} ]
結果: { from: string, to: string, cond: string, sig: string }
get_relays
結果: { [url: string]: {read: boolean, write: boolean} }
nip04_encrypt
引数: [ pubkey , plaintext ] (訳注: 1つめの pubkey は送信先ユーザの公開鍵)
結果: NIP-04 ciphertext (暗号化されたテキスト)
nip04_decrypt
引数: [ pubkey , NIP-04 chphertext ] (訳注: 1つめの pubkey は送信元ユーザの公開鍵)
結果: plaintext (復号されたテキスト)

注: pubkey signature は16進文字列。

Nostr Connect URI
署名アプリ は、QRコードの読み取り・リンクのクリック・URIのコピペによって アプリ を発見する。
アプリは特別なURIを発行する。それは nostrconnect:// から始まり、パス部が16進(hex)形式の pubkey で、URLエンコードされた次のようなクエリパラメータを持つ。
relay : アプリが接続し、署名アプリがメッセージを送受信する先となる任意のリレーのURL
metadata : アプリのメタデータを持つJSON
name : アプリの名前(人間が読める形式)
url (任意): 接続を要求しているWebサイトのURL
description (任意): アプリの説明
icons (任意): アプリのアイコンのURLの配列

フロー
content フィールドはNIP-04で指定された方法で暗号化されたメッセージ。 kind 24133 を用いる。

接続
1. ユーザがWebサイト上の「接続」ボタンをクリックしたり、QRコードを読み取ったりする
明記されていないが、このタイミングで connect リクエストを送信する?jiftechnify
2. nostr connectがに対応した 署名アプリ を開くURIが表示される
3. そのURIには アプリ の公開鍵が含まれている
アプリへのレスポンスの暗号化に使う(はず)jiftechnify
4. 署名アプリは、自分の公開鍵で connect リクエストに対する確認応答を送信する

切断(アプリから)
1. ユーザがアプリ上の「切断」ボタンをクリックする
2. アプリ署名アプリ disconnect リクエストを送信する
3. 署名アプリ disconnect リクエストに対する確認応答を送信する

切断(署名アプリから)
1. ユーザが署名アプリ上の「切断」ボタンをクリックする
2. 署名アプリアプリ disconenct リクエストを送信する

公開鍵の取得
1. アプリ署名アプリ get_public_key リクエストを送信する
2. 署名アプリ get_public_key リクエストへの応答として(アプリの)公開鍵を送り返す

イベントの署名
1. アプリ署名アプリに、署名したいイベントとともに sign_event リクエストを送信する
2. 署名アプリはユーザに、イベントの内容を確認し署名を行うためのポップアップを表示する
3. 署名アプリ sign_event リクエストへの応答としてイベントのシュノア署名( signture )を送り返す

署名の委譲(delegate): NIP-26の用語でいうと 署名アプリがdelegator、アプリがdelegateejiftechnify
1. アプリ署名アプリに、条件クエリ文字列 (cf. NIP-26) と移譲先となるアプリの公開鍵とともに delegate リクエストを送信する
2. 署名アプリはユーザに、アプリに署名を委譲する(自分の代わりに署名を行ってもらう)ためのポップアップを表示する
3. 署名アプリは署名つきのNIP-26委譲トークンを送り返すか、委譲を却下する