Nostrの仕組みと、サーバーが1つも存在しないソーシャルネットワークがなぜ動作するのか
ほぼすべての分散型ソーシャルネットワークプロトコルは、最終的に怪物的な存在になります。ActivityPubは重いMastodonサーバーを引きずり回し、1つのノードがBANされると観客の半分から切り離されてしまいます。ScuttlebuttのようなP2Pネットワークはモバイルデバイスでの同期問題を抱え、 半日でバッテリーを消耗させてしまいます。
Nostrプロトコル(NIP、Notes and Other Stuff Transmitted by Relaysの略)の作成者は、真逆のアプローチを取りました。ブロックチェーンを捨て、複雑なP2Pプロトコルを捨て、暗号学とシンプルなWebSocketリレーだけを残したのです。

コアアイデア
Nostrは完成されたソーシャルネットワークでも、独立したアプリケーションでもありません。ネットワーク взаимодействияに関する仕様書で、NIP(Nostr Implementation Possibilities)と呼ばれる数十の短いドキュメントに収まります。
ログイン、パスワード、電話番号による紐付けはありません。アカウントは暗号鍵のペアです:秘密鍵(secp256k1)と公開鍵。公開鍵が識別子となり、すべてのアクションに秘密鍵で署名します。
メッセージ、記事、リアクション、アバター変更は、プロトコル用語ではすべてイベントと呼ばれます。本質的には、これは通常のJSONオブジェクトです:
{
"id": "4376c65d2f23493d6050d0c393d01f50252a607d58eab305699c6811ea70017d",
"pubkey": "9fe415e4177d13521649f80e4293097b540e555d34a14f4e2454b62412f93008",
"created_at": 1672531199,
"kind": 1,
"tags": [],
"content": "Привет, это тестовый пост в Nostr!",
"sig": "250e938424f...подпись...4e8f9b"
}
クライアントはこのJSONを形成し、秘密鍵で署名し、WebSocket経由で1つまたは複数のリレーサーバーに送信します。
リレーの仕組み
リレーは単純なサーバーです。あなたが誰かなんて知りませんし、アプリケーションのロジックにも興味がありません。そのタスクは:
- WebSocketでJSONを受け取る。
- 作成者の署名を検証する。
- イベントをデータベース(通常はSQLiteまたはPostgreSQL)に保存する。
- あなたの公開鍵でフィルターをリクエストした購読者全体にイベントを配信する。
特定のリレーの所有者があなたをBANすることになっても、単にクライアントを他の5つのリレーに切り替えるだけです。購読者はその先であなたの投稿を見つけられます。なぜなら作成者の署名がそこにあるからですし、リレーは秘密鍵なしにはメッセージ本文を偽造できません。
同時に、リレーは有料(サブスクリプションやマイクロ決済によるスパム対策)、プライベート(企業の従業員のみ)、またはパブリックにできます。
主なエンジニアリングの問題
理論的には、すべてが素晴らしい見えます:多数のリレー、検閲なし。実践的には疑問が生じます:読者のクライアントは、作成者が投稿をどのリレーに送信しているかをどのように知るのでしょうか?
500人をフォローしている場合、何千もの既存のリレーをポーリングするのはコストがかかります。コミュニティはOutboxモデル(NIP-65)を採用しました。作成者は書き込み先のリレー(write relays)のリストを公開します。購読者はこのリストをリクエストし、そこだけに接続します。最適化のため、クライアントは交差点を 찾아서、10〜15のサーバーへの接続を維持します。
開発者がNostr上に構築するもの
仕様のシンプルさにより、人々は通常のマイクロブログ далеко beyond регулярного микроблогинга:
- Damus(iOS)、Amethyst(Android)、Coracle(Web)などのクライアントで、Twitter形式のコミュニケーション。
- 長いフォーマットの記事用プラットフォーム(NIP-23)。投稿はMarkdownで保存されます。
- 会話相手の公開鍵を使用したメッセージ暗号化を備えたP2Pメッセンジャー。
- ウェブサイト認証システム(NIP-07)。ブラウザ拡張機能がログイン・パスワードの代わりにリクエストに署名します。
практически любомスタック向けのプロトコル用ライブラリが存在します:Go、Rust、TypeScript、Python、Dart。リレーに接続して投稿のストリームを listenするだけの最小限のクライアントは、文字通り30〜40行のコードで書けます。
もっと深く掘り下げる価値はあるか
Nostrは完璧ではありません。サードパーティのインデクサーなしでは検索の organizedが難しく、組み込みのデータ削除機能もなく(削除された投稿は固执なリレーに永遠に残る可能性があります)、複数のクライアント間の同期が失敗することもあります。
しかし、オーバエンジニアリングのない、クリーンでミニマリストなネットワーク設計に興味があるなら、リポジトリは確かに探索する価値があります。NIP-01の基本イベント仕様から始めて、nostrapps.comのカタログから готовыеクライアントを試すことができます。
関連プロジェクト