NIP-17
> Private Direct Messages
昔の
NIP-04は非推奨(unrecommended)になり、本仕様の利用が推奨されている。
翻訳 commit=7dfb11b
プライベートなダイレクトメッセージ
本NIPは、
NIP-44の暗号化と
NIP-59の封印(seal)とギフトラップを使ったあん謳歌されたダイレクトメッセージ方式を定義する。
ダイレクトメッセージのkind
イベントの種類(kind) 14
はチャットメッセージである。 p
タグはメッセージの一人以上の受領者を示す。
_.js{
"id": "<usual-hash>", // 訳注:通常のハッシュ
"pubkey": "<sender-pubkey>", // 訳注:送信者の公開鍵
"created_at": now(), // 訳注:現時刻
"kind": 14,
"tags": [
["p", "<receiver-1-pubkey>", "<relay-url>"], // 訳注:受領者 1 の公開鍵
["p", "<receiver-2-pubkey>", "<relay-url>"], // 訳注:受領者 2 の公開鍵
["e", "<kind-14-id>", "<relay-url>", "reply"] // リプライの場合
["subject", "<conversation-title>"], // 訳注:会話のタイトル
...
],
"content": "<message-in-plain-text>", // 訳注: 平文のメッセージ
}
.content
は平文でなければならない(MUST)。 id
と created_at
は必須である。
メンション、引用、スレッド構造の構築のタグは
NIP-10に従わなければならない(MUST)。
kind 14のイベントは一切署名してはならない(MUST)。署名されたなら、メッセージがリレーに漏洩し、完全に公開状態になるかもしれない。
チャットルーム
pubkey
+ p
タグの組はチャットルームを定義する。新しい p
タグが追加された場合あるいは既存のものが削除された場合、クリーンなメッセージ履歴を持つ新しいルームが作られる。
クライアントは同じルームのメッセージを継続するスレッドで描画すべきである(SHOULD)。
暗号化
NIP-59に従い、
未署名の
kind:14
チャットメッセージは、それぞれの受領者と送信者に対し、封印(
kind:13
)され、ギフトラップ(
kind:1059
)されなければならない(MUST)。
_.js{
"id": "<usual hash>",
"pubkey": randomPublicKey, // 訳注: ランダムな公開鍵
"created_at": randomTimeUpTo2DaysInThePast(), // 訳注: 過去2日以内のランダムな時刻
"kind": 1059, // ギフトラップ
"tags": [
["p", receiverPublicKey, "<relay-url>"] // 訳注: 受領者の公開鍵
],
"content": nip44Encrypt(
{
"id": "<usual hash>",
"pubkey": senderPublicKey, // 訳注: 送信者の公開鍵
"created_at": randomTimeUpTo2DaysInThePast(), // 訳注: 過去2日以内のランダムな時刻
"kind": 13, // 封印
"tags": [], // タグはなし
"content": nip44Encrypt(unsignedKind14, senderPrivateKey, receiverPublicKey),
"sig": "<signed by senderPrivateKey>" // 訳注: 送信者の公開鍵(senderPrivateKey)で署名される
},
randomPrivateKey, receiverPublicKey
),
"sig": "<signed by randomPrivateKey>"
}
暗号化アルゴリズムは
NIP-44の最新バージョンを使用しなければならない(MUST)。
クライアントは kind:13
の公開鍵が kind:14
の公開鍵と同じであることを検証しなければならない(MUST)。さもなければ、単純に kind:14
の公開鍵を変更することによって、どんな送信者でも他者になりすますことができてしまう。
クライアントは created_at
の分類によってメタデータが漏洩しないようにするため、封印とギフトラップの両方に対して過去二日以内で created_at
をランダム化すべきである(SHOULD)。
ギフトラップの p
タグには、受領者のメインの公開鍵、または受領者の身元を暴露することなくDMを受信するために作られたエイリアス鍵を使用できる。
クライアントは、それぞれの受領者のギフトラップにおいて
expiration
タグ(
NIP-40)を設定するか、送信者の公開鍵に対してギフトラップを生成しないことによって、消えるメッセージを提供できる(CAN)。
公開
kind 10050
はユーザがDMを受けとるための好ましいリレーを示す。このイベントはリレーのURLを含む relay
タグのリストを含まなければならない(MUST)。
_.js{
"kind": 10050,
"tags": [
["relay", "wss://inbox.nostr.wine"],
["relay", "wss://myrelay.nostr1.com"],
],
"content": "",
//...その他のフィールド
}
クライアントはkind 14
イベントを 10050
で挙げられたリレーに対して公開すべきである(SHOULD)。もしも見つからない場合はユーザがこのNIPに基づいてメッセージを受け取る準備ができないことを示しており、クライアントは送信を試みるべきでない。
リレー
// TODO 未完了のため続きを翻訳する