Nostrプロトコル
これはNostrプロトコルの高レベルな概要であり、イベント・タイプとNostr Implementation Possibilities(NIPs)の仕組みについての詳細です。
§ 最高レベルのNostr
- Nostrネットワークは主に以下の2つで構成されています: クライアントとリレー.
- クライアント(Clients) は、ユーザーがリレーにデータを読み書きするために使用するインターフェースです。ソーシャルメディアを例に挙げると、これはTwitter(現X)のウェブアプリやモバイルアプリだと考えてください。Twitterの集中型データベースからデータを読み取り、Twitterの集中型データベースにデータを書き込むためのクライアントです。
- リレー(Relays) は、データベースのようなものです(ただし、単にデータを保存するだけでなく、もっと多くのことができます)。クライアントにデータを送信してもらい、そのデータをデータベースに保存します。クライアントはリレーからデータを読み取り、ユーザーに見せることができます。
- すべてのユーザーは公開鍵によって識別されます。すべてのイベント・オブジェクト(投稿メッセージ、フォローリストの更新など)は署名されています。クライアントはこれらの署名が正しいかどうかを検証します。
- クライアントはリレーからデータを取得し、リレーにデータを公開します。リレーはほとんどの場合、ユーザーが選択します。リレーは互いに通信する必要はありませんが、将来的には通信する可能性があります。
- 例えば、プロフィールを更新するには、クライアントに指示し、使用したいリレーにkind 0のイベントを送信するだけです。リレーはそのイベントを保存します。
- 起動時に、クライアントはあなたが指定したリレーからデータを照会します。これは、あなたがフォローしているユーザーのイベントのみを表示するようにフィルタリングすることができます。
- イベントには多くのkindがあります。イベントはあらゆる種類の構造化されたデータを含むことができ、最も使用される構造は、すべてのクライアントとリレーがそれらをシームレスに扱うことができるように、Nostr Implementation Possibilities(NIPs - 誰もが従うべき標準化されたプロトコル)として、その方法を明記しています。
- Nostrで見ことができるデータは、完全に接続するリレーに依存します。詳しくは下のネットワーク・ダイアグラムをご覧ください。
ネットワーク・ダイアグラ(図表)
上のダイアグラを見ると、3つのリレーと3人のユーザーがいることがわかります。各ユーザーは異なるクライアントで(異なるプラットフォームで)Nostrに接続しています。
読み取りと書き込みができることがダイアグラからわかります:
- ボブはアリスの投稿をすべて見ることができますが、メアリーの投稿は何も見ることができません(メアリーの存在すら知りません)。
- アリスはボブの投稿をすべて見ることができますが、メアリーの投稿は何も見ることができません(メアリーの存在すら知りません)。
- メアリーはボブとアリスの投稿をすべて見ることができます。これはメアリーがリレー3にのみ投稿を書き込む一方で、ボブとアリスの投稿はリレー2から読み取っているためです。
これは非常に単純化された状況ですが、どのリレーに接続するかによって、Nostr使用時に誰が何を見るかに大きな影響を与えているかが、よく理解できるはずです。
§ イベント(Events)
イベントとは、Nostrネットワークで唯一のオブジェクト・タイプです。各イベント・オブジェクトは kind
を持ち、それがどのような種類のイベント(Event Kind)であるか(ユーザーが起こすかもしれないアクションや受信するかもしれないメッセージ)を示します。
kind 1のイベントは以下のようなものです(kind 1は短いテキストメモ用で、Twitterで言うツイートのようなものです)。
{
"id": "4376c65d2f232afbe9b882a35baa4f6fe8667c4e684749af565f981833ed6a65",
"pubkey": "6e468422dfb74a5738702a8823b9b28168abab8655faacb6853cd0ee15deee93",
"created_at": 1673347337,
"kind": 1,
"tags": [
["e", "3da979448d9ba263864c4d6f14984c423a3838364ec255f03c7904b1ae77f206"],
["p", "bf2376e17ba4ec269d10fcc996a4746b451152be9031fa48e74553dde5526bce"]
],
"content": "Walled gardens became prisons, and nostr is the first step towards tearing down the prison walls.",
"sig": "908a15e46fb4d8675bab026fc230a0e3542bfade63da02d542fb78b2a8513fcd0092619a2c8c1221e581946e0191f2af505dfdf8657a414dbca329186f009262"
}
id
フィールドはイベントIDを示します。pubkey
フィールドはイベントを送信したユーザーの公開鍵を示します。created_at
フィールドはイベントがいつ公開されたかを示します。kind
フィールドはそれがどのような種類のイベントであるかを示します。tags
フィールドはイベント・タグを示します。これらはリンクを作成したり、メディアを追加したり、他のユーザーやイベントに言及するために使用されます。content
フィールドはイベント内容を示します。この場合、短いテキストの投稿です。sig
フィールドは、クライアントがこの公開鍵を持つユーザーが指定された日付に、実際にこのイベントを送信したかを検証するために使用する署名です。
イベントの種類(Event Kinds)
これは現在の Event
kindリストです。最新版のリストは、常にNostr NIPs repositoryにあります。
kind | 説明 | NIP |
---|---|---|
0 | メタデータ(ユーザー・プロフィール) | 1 |
1 | テキスト(いわゆる「投稿」) | 1 |
2 | 推奨リレー | 1 |
3 | フォローリスト(コンタクト) | 2 |
4 | 暗号化ダイレクトメッセージ | 4 |
5 | イベント削除 | 9 |
6 | リポスト | 18 |
7 | リアクション(いわゆる「いいね!」) | 25 |
8 | バッジ授与 | 58 |
40 | チャンネル作成 | 28 |
41 | チャンネル・メタデータ | 28 |
42 | チャンネル・メッセージ | 28 |
43 | チャンネル・非表示メッセージ | 28 |
44 | チャンネル・ミュート・ユーザー | 28 |
1063 | ファイル・メタデータ | 94 |
1984 | 通報(スパム報告など) | 56 |
9734 | Zapリクエスト | 57 |
9735 | Zapレシート | 57 |
10000 | ミュート・リスト | 51 |
10001 | ピン留めリスト | 51 |
10002 | 利用中のリレー・リスト | 65 |
13194 | ウォレット情報 | 47 |
22242 | クライアント認証 | 42 |
23194 | Wallet Connectリクエスト | 47 |
23195 | Wallet Connectリクエスト | 47 |
24133 | Nostr Connect | 46 |
30000 | カテゴライズされたユーザー・リスト | 51 |
30001 | カテゴライズされたブックマーク・リスト | 51 |
30008 | プロフィール・バッジ | 58 |
30009 | バッジの定義 | 58 |
30017 | 商品の作成・更新 | 15 |
30018 | 商品の作成・更新 | 15 |
30023 | 長文投稿 | 23 |
30078 | アプリの固有データ | 78 |
30402 | クラシファイド | 99 |
31989 | ハンドラーの推薦 | 89 |
31990 | ハンドラーの情報 | 89 |
標準化されたタグ
名称 | 値 | その他のパラメータ | NIP |
---|---|---|---|
e | event id (hex) | relay URL, marker | 1, 10 |
p | pubkey (hex) | relay URL | 1 |
a | coordinates to an event | relay URL | 33, 23 |
r | a reference (URL, etc) | 12 | |
t | hashtag | 12 | |
g | geohash | 12 | |
nonce | random | 13 | |
subject | subject | 14 | |
d | identifier | 33 | |
expiration | unix timestamp (string) | 40 |
§ NIPs
Nostr Implementation Possibilty、略してNIPは、Nostr互換のリレーとクライアント・ソフトウェアが実装しなければならないもの(MUST)、実装すべきもの(SHOULD)、実装してもよいもの(MAY)を文書化したものです。NIPsは、Nostrプロトコルの仕組みをアウトラインとして文書化したものです。
なぜNIPsは重要なのか?
Nostrは非中央集権的で、(Twitter / 現Xのような)中央集権的なサービスに依存しません。つまり、プロトコルの方向性は私たち全員に委ねられているのです!私たちは変更を提案し、主張し、他の人が提案したアイデアに対してフィードバックを提供することができます。
コミュニティに積極的に参加することで、ネットワークの方向性について発言することができます。メイン・リポジトリで公開されたNIPはすでに承認されています。新しいアイデアの追加は、そのリポジトリのプル・リクエストで行います。
どこでNIPsを確認できるか?
現在のNIPはすべてNostr NIP repoで見ることができます。