NIP-46
Nostr Connect
簡単にいうと、NIP-07と同等の機能をNostrプロトコル上で実現する仕組み 既にこの仕様を実装する署名アプリ(NIP-07拡張機能に相当するアプリ)の開発が進行中。
/icons/hr.icon
NIPの翻訳
/icons/hr.icon
趣旨(Rationale)
秘密鍵はできるだけシステム(アプリ・OS・デバイス)にさらけ出すべきではない。そのたびに攻撃対象領域が広がってしまうため。
秘密鍵の入力もまた面倒な上、OSのクリップボード(悪意あるアプリに監視されているかもしれない)などのよりたくさんのシステムに秘密鍵を曝け出すことになる。
用語
アプリ(App): 「Nostrアカウントの代わりに行動すること」を要求するNostrアプリケーション
署名アプリ(Signer): Nostrアカウントの秘密鍵を保持し、代わりに署名を行うNostrアプリケーション
要約(TL;DR)
アプリ と 署名アプリ はkind 24133のイベントを用い、任意に選んだリレー上で一時的(ephemeral)で暗号化されたメッセージをお互いに送り合う
アプリは署名者に対し、公開鍵の取得やイベントの署名などの処理を要求する
イベントのcontentは、暗号化されたJSONRPC風の リクエスト と レスポンス でなければならない
署名器プロトコル
メッセージ
code:リクエスト.json
{
"id": <random_string>, // ランダム文字列
"method": <one_of_the_methods>, // メソッド名
}
code:レスポンス.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
(引数・結果ともに空)
引数: [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.icon
2. nostr connectがに対応した 署名アプリ を開くURIが表示される
3. そのURIには アプリ の公開鍵が含まれている
アプリへのレスポンスの暗号化に使う(はず)jiftechnify.icon
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.icon 1. アプリは署名アプリに、条件クエリ文字列 (cf. NIP-26) と移譲先となるアプリの公開鍵とともにdelegateリクエストを送信する 2. 署名アプリはユーザに、アプリに署名を委譲する(自分の代わりに署名を行ってもらう)ためのポップアップを表示する
3. 署名アプリは署名つきのNIP-26委譲トークンを送り返すか、委譲を却下する