diff --git a/46.md b/46.md index 53185416..a1663b68 100644 --- a/46.md +++ b/46.md @@ -1,38 +1,38 @@ NIP-46 ====== -Nostr Connect +Nostrコネクト ------------------------ `draft` `optional` -## Rationale +## 動機 -Private keys should be exposed to as few systems - apps, operating systems, devices - as possible as each system adds to the attack surface. +秘密鍵は、アプリ、OS、デバイスなど攻撃表面を増加させるシステムからできる限り隠す必要が有ります。 -Entering private keys can also be annoying and requires exposing them to even more systems such as the operating system's clipboard that might be monitored by malicious apps. +秘密鍵の入力も悩みの種でして、悪意のあるソフトに監視される可能性のあるOSのクリップボードなど多くのシステムに秘密鍵を晒す事になります。 -## Terms +## 用語の説明 -* **App**: Nostr app on any platform that *requires* to act on behalf of a nostr account. -* **Signer**: Nostr app that holds the private key of a nostr account and *can sign* on its behalf. +* **アプリ**: アプリの代わりに行動してもらうことを*要求する*任意のプラットフォームのNostrアプリ +* **署名器**: Nostrアカウントの秘密鍵を持ち、アプリの代わりに*署名する*Nostrアプリ -## `TL;DR` +## 要約 (`TL;DR`) + +**アプリ**と**署名器**は選択したリレーを使用してkind `24133`で一時的な暗号化されたメッセージを送り合います。 -**App** and **Signer** sends ephemeral encrypted messages to each other using kind `24133`, using a relay of choice. +アプリは公開鍵の取得やイベントへの署名などを行うよう署名器に求めます。 -App prompts the Signer to do things such as fetching the public key or signing events. +`content`フィールドは暗号化されたJSONRPC風の**要求**または**応答**でなければなりません。 -The `content` field must be an encrypted JSONRPC-ish **request** or **response**. +## 署名器のプロトコル -## Signer Protocol +### メッセージ -### Messages - -#### Request +#### 要求 ```json { @@ -42,7 +42,7 @@ The `content` field must be an encrypted JSONRPC-ish **request** or **response** } ``` -#### Response +#### 応答 ```json { @@ -52,59 +52,59 @@ The `content` field must be an encrypted JSONRPC-ish **request** or **response** } ``` -### Methods +### メソッド -#### Mandatory +#### 必須 -These are mandatory methods the remote signer app MUST implement: +以下に示すものは、リモート署名器が実装しなければならない必須のメソッドです。 (MUST) - **describe** - - params [] - - result `["describe", "get_public_key", "sign_event", "connect", "disconnect", "delegate", ...]` + - 引数 [] + - 結果 `["describe", "get_public_key", "sign_event", "connect", "disconnect", "delegate", ...]` - **get_public_key** - - params [] - - result `pubkey` + - 引数 [] + - 結果 `pubkey` - **sign_event** - - params [`event`] - - result `event_with_signature` + - 引数 [`event`] + - 結果 `event_with_signature` -#### optional +#### 任意 - **connect** - - params [`pubkey`] + - 引数 [`pubkey`] - **disconnect** - - params [] + - 引数 [] - **delegate** - - params [`delegatee`, `{ kind: number, since: number, until: number }`] - - result `{ from: string, to: string, cond: string, sig: string }` + - 引数 [`delegatee`, `{ kind: number, since: number, until: number }`] + - 結果 `{ from: string, to: string, cond: string, sig: string }` - **get_relays** - - params [] - - result `{ [url: string]: {read: boolean, write: boolean} }` + - 引数 [] + - 結果 `{ [url: string]: {read: boolean, write: boolean} }` - **nip04_encrypt** - - params [`pubkey`, `plaintext`] - - result `nip4 ciphertext` + - 引数 [`pubkey`, `plaintext`] + - 結果 `nip4 ciphertext` - **nip04_decrypt** - - params [`pubkey`, `nip4 ciphertext`] - - result [`plaintext`] + - 引数 [`pubkey`, `nip4 ciphertext`] + - 結果 [`plaintext`] -NOTICE: `pubkey` and `signature` are hex-encoded strings. +注意: `pubkey`と`signature`は16進数エンコードされた文字列です。 -### Nostr Connect URI +### NostrコネクトURI -**Signer** discovers **App** by scanning a QR code, clicking on a deep link or copy-pasting an URI. +**署名器**はQRコードの読み取り、ディープリンクのクリック、URIのコピーアンドペーストによって**アプリ**を発見します。 -The **App** generates a special URI with prefix `nostrconnect://` and base path the hex-encoded `pubkey` with the following querystring parameters **URL encoded** +**アプリ**は`nostrconnect://`で始まり、ベースパスに16進数でエンコードされた`pubkey`を持ち、URLエンコードされた以下のクエリ文字列を含む専用のURIを生成します。 -- `relay` URL of the relay of choice where the **App** is connected and the **Signer** must send and listen for messages. -- `metadata` metadata JSON of the **App** - - `name` human-readable name of the **App** - - `url` (optional) URL of the website requesting the connection - - `description` (optional) description of the **App** - - `icons` (optional) array of URLs for icons of the **App**. +- `relay`**アプリ**が接続され、**署名器**がメッセージを送受信しなければならないリレーのURL。 +- `metadata`**アプリ**のメタデータを持つJSON + - `name`人間が読める形式の**アプリ**の名前。 + - `url`(任意) 接続を要求しているwebサイトのURL。 + - 'description`(任意) **アプリ**の説明。 + - `icons`(任意) **アプリ**のアイコンのURLの配列。 #### JavaScript @@ -112,51 +112,51 @@ The **App** generates a special URI with prefix `nostrconnect://` and base path const uri = `nostrconnect://?relay=${encodeURIComponent("wss://relay.damus.io")}&metadata=${encodeURIComponent(JSON.stringify({"name": "Example"}))}` ``` -#### Example +#### 例 ```sh nostrconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&metadata=%7B%22name%22%3A%22Example%22%7D ``` -## Flows +## Nostrコネクトの流れ -The `content` field contains encrypted message as specified by [NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md). The `kind` chosen is `24133`. +`content`フィールドは`kind``24133`を用い、[NIP04](https://github.com/nostr-protocol/nips/blob/master/04.md)に指定された方法で暗号化されたメッセージです。 -### Connect +### 接続 -1. User clicks on **"Connect"** button on a website or scan it with a QR code -2. It will show an URI to open a "nostr connect" enabled **Signer** -3. In the URI there is a pubkey of the **App** ie. `nostrconnect://&relay=&metadata=` -4. The **Signer** will send a message to ACK the `connect` request, along with his public key +1. ユーザーがwebサイトの**接続**ボタンを押すかQRコードを読み取ります。 +2. 「Nostrコネクト」 に対応した**署名器**を開くURIを表示します。 +3. そのURIにはこのように**アプリ**の公開鍵が含まれています。 `nostrconnect://&relay=&metadata=` +4.**署名器**は自身の公開鍵で`connect`要求に対する確認応答を行います。 -### Disconnect (from App) +### 切断 (アプリから) -1. User clicks on **"Disconnect"** button on the **App** -2. The **App** will send a message to the **Signer** with a `disconnect` request -3. The **Signer** will send a message to ACK the `disconnect` request +1. ユーザーが**アプリ**の**切断**ボタンをクリックします。 +2. **アプリ**は**署名器**に`disconnect`要求を送信します。 +3. **署名器**は`disconnect`要求に対する確認応答を行います。 -### Disconnect (from Signer) +### 切断 (署名器から) -1. User clicks on **"Disconnect"** button on the **Signer** -2. The **Signer** will send a message to the **App** with a `disconnect` request +1. ユーザーが**署名器**の**切断** ボタンをクリックします。 +2. **署名器**は**アプリ**に`diaconnect`要求をします。 -### Get Public Key +### 公開鍵の取得 -1. The **App** will send a message to the **Signer** with a `get_public_key` request -3. The **Signer** will send back a message with the public key as a response to the `get_public_key` request +1. **アプリ**は**署名器に**`get_public_key`リクエストを行います。 +3. **署名器**は`get_public_key`要求への応答として公開鍵を返します。 -### Sign Event +### イベントの署名 -1. The **App** will send a message to the **Signer** with a `sign_event` request along with the **event** to be signed -2. The **Signer** will show a popup to the user to inspect the event and sign it -3. The **Signer** will send back a message with the event including the `id` and the schnorr `signature` as a response to the `sign_event` request +1. **アプリ**は**署名器**に署名したいイベントと共に`sign_event`要求をします。 +2. **署名器** はユーザーにイベントの内容を検査して署名するためのポップアップを表示します。 +3. **署名器**は`sign_event`要求への応答として`id`とシュノア`signature`を含むイベントメッセージを返します。 -### Delegate +### 委譲 -1. The **App** will send a message with metadata to the **Signer** with a `delegate` request along with the **conditions** query string and the **pubkey** of the **App** to be delegated. -2. The **Signer** will show a popup to the user to delegate the **App** to sign on his behalf -3. The **Signer** will send back a message with the signed [NIP-26 delegation token](https://github.com/nostr-protocol/nips/blob/master/26.md) or reject it +1. **アプリ**は**署名器**にクエリ文字列の条件句と共に`delegate`要求をします。 +2. **署名器**はユーザーに対して**アプリ**に署名を委譲して、代わりに署名を行なってもらうためのポップアップを表示します。 +3. **署名器**は署名付きの[NIP-26委譲トークン](https://github.com/nostr-protocol/nips/blob/master/26.md)を送り返すか、以上を却下する。 (訳注: 委譲トークンは委譲文字列のSHA256ハッシュへの署名ですから、原文が誤っていると考えられます。そのうちにPRを送ります。)