Slide 1

Slide 1 text

分散型SNS nostr 仕組み解説

Slide 2

Slide 2 text

目次 ■ nostrって何? ■ nostrっておすすめのSNSですか? ■ 興味があるなら触ってみよう ■ nostrの理念 ■ nostrの実現方法 ■ nostrの問題点 ■ nostrのおもしろさ ■ 代表的なクライアント 📱 📱 リレー ▼ ! $ $ 課金 リレー 特殊 リレー 集約 リレー 📱

Slide 3

Slide 3 text

nostrって何? ■ Notes and Other Stuff Transmitted by Relays (短文とその他をリレーでやり取りする) ■ 分散型SNSを実現するためのプロトコル 公開鍵署名を利用した面白い構造をしている ■ 複数の個人などが運営するリレーサーバーの集合 により構成される分散したネットワークに見えるもの ■ 誰かが管理している単一のサービスではなく、 総体としてサービスに見える。 ■ 基本的にマイクロブログ(Xなど)風に使えるが、 クライアントを変えることで様々な使い方ができる。 (掲示板、ブログ等) 実際の例 ▶ このあと各項目について説明します ノスター ノストル ノーストリング ノースター ノシュトル ノシュトラ エヌオーエスティーアール

Slide 4

Slide 4 text

Q. nostrっておすすめのSNSですか? A. 「nostrはおすすめか?」と聞いてくるような人には、 現時点でお薦めはできません。 機能的には十分揃っていて、使い物にはなります。 一方で、他のSNSにあるような親切さは薄く、難解で、自己責任の割合が大きいです。 (プロトコルを利用するという側面が強く、サービスとして完成していない) ・技術的な面白さを感じられる人 ・発展途上の秘境感を味わいたい人 ・管理者不在で凍結と無縁という点に魅力を感じる人 には向いているかもしれません。 YOU IS 🔑 Secret Key

Slide 5

Slide 5 text

興味があるなら触ってみよう nostter入門 ■ nostterを開き、Try demoをクリック。 https://nostter.vercel.app/ ■ 日本語TL閲覧専用モードになります。 アカウントを作りたくなったら、設定→Logout後、Create accountから作成。

Slide 6

Slide 6 text

興味があるなら触ってみよう のぞき窓 ■ "のぞき窓"という、日本リレー(relay-jp.nostr.wirednet.jp)が 提供するビューアサイトもあります。 https://relay-jp.nostr.wirednet.jp/

Slide 7

Slide 7 text

nostrの理念

Slide 8

Slide 8 text

nostrの理念 ■ censorship-resistant(検閲耐性)を持ち ■ サーバーに依存せず・信頼する必要なく ■ 回復力があり ■ 公開鍵暗号と電子署名に基づいた ■ 改ざん不能で ■ P2P技術に依存しない ■ オープンなプロトコル https://github.com/nostr-protocol/nostr BANや凍結を無意味化し、発言・発信を止めるのを原理的に困難にする 具体的な実現方法については 後ほど説明するヨ

Slide 9

Slide 9 text

nostrの理念 censorship-resistant(検閲耐性) ■ アカウントが凍結(BAN)された~ ■ 投稿を削除しないと復活させないと言われた~ ■ 永久凍結で二度とアカウントが作れなくなった~ ■ サーバーから接続ごと遮断された~ ■ サイレンスされた~ これらを無意味化するということ ※nostrでも個別のサーバーからのBANが無いわけではありません そもそも課金しないと接続できないところとかもあります。 ネットワーク全体として、実質的に無意味化するという意味です。 https://github.com/nostr-protocol/nostr なんでもやっていわけじゃないヨ 悪いことすると、各リレーから追い出されたり 場合によってはIPアドレス開示請求されるヨ

Slide 10

Slide 10 text

nostrの理念 サーバーに非依存・信頼する必要なし 従来の中央集権であったり、連合分散系では ■ 所属サーバーを気にしないといけない ■ 所属サーバーから追い出されるとフォロー関係が切れる ■ 所属サーバーに投稿が閉じ込められている ■ 所属サーバーが突如閉鎖されると縁も投稿も消え去る ■ 所属サーバーの機能によって使える機能が変わる ■ 所属サーバーによって使えるクライアントが違う という問題があった。 これらを起こさないということ https://github.com/nostr-protocol/nostr 実際には、いくつかの理由で やっぱり気にする必要はあるヨ かなりマシではあるけどネ

Slide 11

Slide 11 text

nostrの理念 回復力があり nostrでは ■ いくつかのサーバーがダウン・通信遮断・放棄・データ削除に至っても ユーザーはほとんど気にならない ■ 接続サーバーを追加・削除をしても見た目上ほとんど影響ない ■ 並大抵のことではフォロー関係が失われない といったことを実現している。 これにより、ユーザー目線では頑強に見えますし、 サーバー運営者側も、従来のサービスのサーバー運営と異なり、 非常に気楽に立てたり落としたりしやすいです。 https://github.com/nostr-protocol/nostr 実際には、個々人の 使い方によって変わるヨ

Slide 12

Slide 12 text

nostrの理念 公開鍵暗号と電子署名に基づいた 中央サーバーに依存しない構造を実現する要素。 詳しくは実現方法の方で説明します。 https://github.com/nostr-protocol/nostr おもしろいけど、nostrの 理解がハードな理由がこれ

Slide 13

Slide 13 text

nostrの理念 改ざん不能 ■ 発言してないことを発言したことにされる ■ 広告を差し込まれる ■ 発言の中身を書き換えられる ■ なりすまされる これらができるのは、主にリレーサーバーですが、電子署名によって すぐにバレる・破棄できるようになっています。 これにより、接続しているサーバー運営者を信頼する必要がない (=気軽に接続できる)ことになります。 https://github.com/nostr-protocol/nostr あとで説明するけど、 秘密鍵を他人に渡すと これ全部ダメになるから 注意ヨ

Slide 14

Slide 14 text

nostrの理念 P2P技術に依存しない nostrはP2Pではありません。ブロックチェーンでもありません。 従来のクライアント-サーバーモデルを拡張した構造です。 これにより、利用者は ■ ポートの開放やグローバルIPアドレスを用意する必要がありません。 ■ 継続的な起動が必要ありません。 ■ モバイル機器から簡単に使用することができます。 ■ 不安定なノードに振り回されることがありません。 ■ 他人の情報を不意に中継する心配がありません。 https://github.com/nostr-protocol/nostr 故にリレーサーバーが 必要になるのである 📱 📱 リレー 📱 📱

Slide 15

Slide 15 text

nostrの理念 オープンなプロトコル nostrはオープンなプロトコルです。 NIP (Nostr Implementation Possibilities) という仕様定義があり、 ここで誰でも提案・論議することができます。 クライアントやサーバーをこの仕様に基づいて 自由に作成することができます。 APIの利用許可を誰かに求める必要もありません。 拡張性の高い仕様になっており、形式に沿ってさえいれば 独自のデータや付加情報を送信・受信することも許容されます。 https://github.com/nostr-protocol/nips リレーごとに受け入れ基準と 対応範囲があるから、例えば 巨大データが拒否されたり、対応 してない仕様があったりするヨ

Slide 16

Slide 16 text

nostrの実現方法

Slide 17

Slide 17 text

nostrの実現方法 ■ 中継だけのシンプルなリレーと、検証能力を持ったリッチなクライアント ■ ネットワーク・トポロジー (経路の冗長化) ■ 公開鍵署名・公開鍵暗号 ■ NIP-05 ■ NIP-07 ■ 基本的な流れのまとめ ■ 具体的なクライアントの動作 とてもシンプル

Slide 18

Slide 18 text

nostrの実現方法 中継だけのシンプルなリレーと、 検証能力を持ったリッチなクライアント ■ リレーの仕事は、指定条件に沿ったリアルタイムな中継と、過去のデータの保管・配信 これ以上のこと(スパムの防止やWebクライアントの提供、課金など)は、やってもいいし、やらなくてもいい。 ■ クライアントの仕事は、署名と検証、条件の指定、各種ユーザー操作の処理 nostrの機能を実現するための主要な機能は(中継と記録・配信以外は)クライアントがすべて持つ。 リレー 投稿 イベント中継 フィルタ 保持 & 過去投稿の再配信 Websocket API フィルタ登録 配信 Nostr (Websocket) フィルタ登録 配信 鍵ペア生成 署名 テキスト投稿 メタ情報投稿 フィルタ登録 配信要求 フォローリスト投稿 表示(重複排除) クライアント クライアント クライアント 色々やってくれるリレーに依存する → 万が一のときに困る なので、選び方は人それぞれ

Slide 19

Slide 19 text

nostrの実現方法 ネットワーク・トポロジー (経路の冗長化) ■ 複数(通常3~20個)のリレーに接続して、基本全部に対してデータを送信・購読する ■ 最低1個のリレーを共有している相手には投稿が届く ■ リレーの変な挙動や悪意、不具合、データ吹っ飛び、ダウンなどは これにより気にする必要がなくなる(全部が吹き飛ばない限り) リレー同士は連携してもいいし、 しなくてもいい Relay Server 投稿 フィルタ登録 配信 Nostr (Websocket) Relay Server Relay Server Relay Server フィルタ登録 配信 Relay Server ❌ リレー間連携

Slide 20

Slide 20 text

nostrの実現方法 公開鍵署名・公開鍵暗号 ■ 中央サーバー無くして、どうやって自分を登録・証明するのか ■ npub1zsmy3hwxxynjtdwr6l3m0clndauyqxsl5jkfmdcnetqs8m9xv50sf0svh0 143648ddc6312725b5c3d7e3b7e3f36f78401a1fa4ac9db713cac103eca6651f ある秘密鍵で署名され、この公開鍵で検証できる正当な情報の発信者 = "私"です。 ■ アカウント管理も、IDもパスワードもなく、電子署名して発信されたデータの集合 それを便宜的にアカウントとして見なすのがnostrの仕組みです。 ■ DMや非公開情報はECDH鍵交換による共通鍵暗号で行われます。 ■ すべての情報は電子署名されるため、改変することはできません。 ■ アカウント(秘密鍵)の作成はクライアントで完結します。 ■ 秘密鍵を漏洩すると、取り返す・無効にすることはできません。 秘密鍵と公開鍵のペアが存在証明であり、この組み合わせは変更できません。 暗号学的に安全な乱数で秘密鍵さえ 生成できればいいので、 手計算でもアカウントを作れる ここで使われているのは、bitcoinで使用されているのと同じ楕円曲線暗号secp256k1です。

Slide 21

Slide 21 text

nostrの実現方法 NIP-05 ■ npub1zsmy3hwxxynjtdwr6l3m0clndauyqxsl5jkfmdcnetqs8m9xv50sf0svh0 これでは誰か分かりません。 ■ [email protected] このような電子メール形式のアドレスで表現するのがNIP-05です。 ■ Webサーバーにファイルを置くことで実現します。 .well-known/nostr.json ■ 逆に公開鍵から、プロフィール情報を取得して Webサーバーに問い合わせ正当なWebサイトの所有者であるかを 検証することもできます。 (有名人へのなりすまし検証) プロフィールに書く名前は 各々が勝手に名乗れるので必要

Slide 22

Slide 22 text

nostrの実現方法 NIP-07 ■ 秘密鍵を漏らすと終わりのため、ブロックチェーン技術のように ブラウザ拡張内やハードウェアウォレットに秘密鍵を格納しておき、 署名や暗号化を任せる仕組みがあります。 ■ これをNIP-07といいます。 ■ 有名な実装はnos2x 他にも色々あります。 信頼できるアプリや拡張以外に 秘密鍵を渡すな

Slide 23

Slide 23 text

nostrの実現方法 基本的な流れのまとめ ■ クライアントは投稿を同時に接続している書込み可能なすべてのリレーに送信します。 その際、電子署名するため途中で書き換えられなくなります。 ■ またクライアントは読み込み可能なすべてのリレーから配信を受けます。 ■ そのため、同じリレーに属してる人が同じものを見れます。 ■ リレー自体はあまり賢くはなく情報の中継に特化しています。 ■ これにより、複数のリレーのうちどれかに属していれば同じ動作が期待できるため、 リレーを変えると何かが失われるといった心配をしなくて済みます。 ■ リレーには多数接続しておくことでより冗長化できます。 ■ リレーが突然死したり、ブロックしてきたりしても他のリレーが生きていれば 特に何をすることもなく使用し続けられます。 ■ すべてのリレーが突然死しても、新しいリレーを登録することで、過去の投稿は消える かもしれませんがアカウント(秘密鍵)はそのまま使い続けられます。

Slide 24

Slide 24 text

nostrの実現方法 具体的なクライアントの動作 1. リレーサーバーに接続します。 最低1つですが、複数接続するのが普通です。Damusの場合は7つあります。 2. 自分自身(ユーザー)の公開鍵から、リレーに自分のプロフィールを取得し、 フォローリスト(公開鍵一覧)を取得します。 ※もちろんクライアントがローカルに保持していてもOKです。 3. 公開鍵リストをフィルタとして設定し、フォローしている人のプロフィールを要求します。 これをキャッシュしておくことで名前やアイコンをUIに表示できます。 ※もちろんクライアントがローカルに保持していてもOKです。 4. 公開鍵リストをフィルタとして設定し、テキスト投稿を要求します。 これにより、タイムラインが表示できます。 5. 以降、プロフィールの更新やテキスト投稿が増えると逐次配信されるため、UIに反映します。 ■ 実際にはさらに、特定の人のTLを見に行った場合は、上記のような動作を 特定の公開鍵に対して実施する。

Slide 25

Slide 25 text

nostrの問題点

Slide 26

Slide 26 text

nostrの問題点 ■ 治安・スパム ■ データ保証と削除 ■ なりすまし ■ 人を探す ■ クライアントの権限が強すぎる ■ そもそもこれはSNSなのか? 他じゃあまり考えないことが いろいろ

Slide 27

Slide 27 text

nostrの問題点 治安・スパム ■ censorship-resistant(検閲耐性)により、原理的に治安維持ができません。 ■ 誰も追い出されないかわりに、誰も追い出せないのです。 ■ スパムや危険情報の発信者をリレー単位では遮断できますが、 ネットワーク上に存在するのを止められません。 (メールのスパムや詐欺サイトが無くならないのと似ている) ■ 一方、リレーを共有さえしなければ届かないので、 将来的には平和なリレー群と 危険地帯リレー群に分かれるかもしれません ■ また、金を払わないと投稿を受け付けないリレーというのもあります ■ もちろんクライアント側でのミュートや非表示化もできます。 有名な日本向けリレーは、 日本以外の地域からの投稿を遮断する ことでスパムなどを抑止しているヨ BANや凍結を無意味化し、発言・発信を止めるのを原理的に困難にする

Slide 28

Slide 28 text

nostrの問題点 データ保証と削除 ■ データの保持も削除も保証されていません。 ■ あるリレーがどの程度データを保持してくれるのか? 期間・容量は? あるリレーが送りたいデータを受け入れてくれるのか? データが突然消えないのか? → すべて保証されていません。 ■ 一方で、一度投稿したデータを消したくなったときは、 削除の要求ができますが、削除機能に対応しているのか? 本当に消えるのか? → 保証されていません。 ■ 特に、ブロードキャストという操作で他者の投稿を 自分の接続しているリレーに再送信することができるため、 基本的に完全消去は困難です。 クライアントとの相性で 数百あったフォローが吹っ飛んで0に なったりするよ イケてるね

Slide 29

Slide 29 text

nostrの問題点 なりすまし ■ 公開鍵は偽装できませんが、人間が読むには複雑すぎます。 ■ 中央管理するサーバーがないため、プロフィールや名前はすべて自称です。 ■ 検証するには、有効な署名や公開鍵を、外部サイトや手渡しなどで 受け取る必要があります。 ■ ちなみに、フォローは公開鍵ベースで行われるため、 一度フォローしてしまえばなりすましは無視できます。 有名SNSでも なりすまし自体はあるし 特有ってほどでもないけどネ Don't Trust. Verify

Slide 30

Slide 30 text

nostrの問題点 人を探す ■ 人を探すのが大変です。 ■ 名前で探すことはできないかもしれません。 ■ NIP-05か、公開鍵のどちらかがあれば確実にフォローはできます。 ■ しかし、接続先のリレーが共通でない & 不明な場合は、 公開鍵が特定できてフォローしていたとしても投稿を受け取れません。 ■ 公開鍵を渡すときは、有名なリレーに参加しておくか、 リレーを併記しておきましょう。 (nostr対応のプロフィールサイトを利用すると リレーは自動で表示されます。) ■ nprofile形式を使うのも良いですが対応ソフトが限られます。 ドコー

Slide 31

Slide 31 text

nostrの問題点 クライアントの権限が強すぎる ■ リレーに権限がほとんどなく、クライアントの権限が強すぎます。 ■ これはつまり、なにか有事の際(秘密鍵を漏洩した場合など)に 泣きつき先がないことを意味します。 ■ 秘密鍵を渡すことは、取り消し不能なFull Access権限を 与えることになります。 ■ 現状、キーローテーションや委任の仕組みは、 無いわけではないですが実用的ではありません。 ■ そのため、 ・信用できるクライアントを探し、それを使う ・基本的にはNIP-07を使用し、秘密鍵を露出しない などの自衛手段を取る以外にありません。 ■ マルウェアなどで不正に奪取されたら終了です。 秘密鍵は人間が扱えるものじゃない

Slide 32

Slide 32 text

nostrの問題点 そもそもこれはSNSなのか? ■ 電子署名を使った汎用プロトコル ■ WebSocket製チャットに過去ログ機能がついたやつ みたいな認識でいると、色々と理解しやすいかもしれません とにかく作りがシンプルすぎる 故にクライアントづくりは とても大変

Slide 33

Slide 33 text

nostrのおもしろさ

Slide 34

Slide 34 text

nostrのおもしろさ ■ あまりに自由度が高いクライアント プロトコルの自由度が高すぎるので、 ・ブログが実装されたり、 ・掲示板が実装されたり、 ・キーバリューストアDBにされてみたり、 ・サイバー空間が実装されたり、 ・MMOみたいなのが実装されたりしている 独自実装も提案も活発 ■ 爆速配信 WebSocketによるリアルタイム配信のため、他人の投稿やリアクションが 爆速で来る。投稿して0.3秒後にはFavが飛んでくる。 他じゃありえないことが いろいろ https://github.com/nostr-jp/awesome-nostr-japan

Slide 35

Slide 35 text

代表的なクライアント

Slide 36

Slide 36 text

代表的なクライアント Damus ■ iOSでnostrはじめるならこれ、という定番クライアント いろいろあるけど、 とにかくユーザー数が多い。 Zapper 5000と隣ニキ

Slide 37

Slide 37 text

代表的なクライアント Amethyst ■ Androidでnostrはじめるならこれ、という定番クライアント 竹

Slide 38

Slide 38 text

代表的なクライアント nostter ■ ブラウザでnostrはじめる初心者向き https://nostter.vercel.app/ illust by @stok33 npub1e09suzmq9mp6nt0ud9ttl03790q jx70wzwlc2pwwghcusvwju54qs0c800

Slide 39

Slide 39 text

代表的なクライアント Rabbit ■ Deck風で使いやすいブラウザクライアント https://syusui-s.github.io/rabbit/ illust by @stok33 npub1e09suzmq9mp6nt0ud9ttl03790q jx70wzwlc2pwwghcusvwju54qs0c800

Slide 40

Slide 40 text

代表的なクライアント Astraea ■ 日本語トレンドや絵文字リアクションに早期に対応した ブラウザクライアント https://astraea.mousedev.page/ illust by @stok33 npub1e09suzmq9mp6nt0ud9ttl03790q jx70wzwlc2pwwghcusvwju54qs0c800

Slide 41

Slide 41 text

もっと詳しく 知りたくなったら

Slide 42

Slide 42 text

もっと詳しく知りたくなったら ■ nostr protocol https://github.com/nostr-protocol/nostr ■ nostr protocol NIPs https://github.com/nostr-protocol/nips ■ awesome-nostr-japan (日本ユーザによる作品集) https://github.com/nostr-jp/awesome-nostr-japan ■ nostr 日本Scrapbox https://scrapbox.io/nostr/ illust by @stok33 npub1e09suzmq9mp6nt0ud9ttl03790q jx70wzwlc2pwwghcusvwju54qs0c800