👾

Nostr の面白さをエンジニア目線で解説してみる

2023/12/16に公開

はじめに

今年は、SNS でありプロトコルでもある Nostr に出会いました。2023年2月の参加でしたがもう、どういった経緯で Nostr を見付けて参加したのかすら思い出せなくなってしまいました。ここ数年、X/Twitter が API という物を開発者に触らせなくなってしまいました。僕は X/Twitter が大きくなった理由の1つが、API をオープンにした事で数多くの bot やサービスがが登場した事だと思っていて、API が自由で無くなった X/Twitter をとても残念に感じています。次第に SNS に関連する何かを作るモチベーションはさっぱり無くなってしまっていました。

そんな中で見付けた Nostr はエンジニアのオアシスとでも言える SNS だと感じました。

Nostr の思想

X/Twitter は中央集権型の SNS であり、以下の様な問題を持っています。

  • 障害が起きると何もできなくなる
  • 個人の情報は運営に管理される
  • 気に入らないオススメ等を運営に強制される
  • 機能の追加や削除は運営に委ねられる

言ってしまえばイーロンや株主の意見によって X/Twitter の運営方法は左右されしまうのです。
それはユーザにとって有益な物もあれば不利益な物があります。一方で Nostr の方式は言ってみればユーザ自身がサービスを作り、ユーザ自身が変えられる SNS なのです。

Nostr はリレーというデータサーバとクライアントで構成されます。

これいわゆる「バラマキ」です。ユーザは複数のリレーに投稿を投げ、複数のリレーからそのリレーに投稿されている他のユーザのイベントを受信します。

この方式が前述の問題点の何を解決しようとしているのかを順に解説します。

障害が起きると何もできなくなる

中央集権型の SNS のこの問題点を Nostr は分散で回避しています。分散にも色々な方法があります。Mastodon の様にユーザが居住するサーバを複数点在させる方法があります。これは有効な方式なのですが、その内の1つのサーバが停止するとそこに居住していたユーザは何もできなくなります。

Nostr ではクライアントが複数のリレーに投稿を送信しておくことで、あるリレーが停止したとしても SNS は継続するのです。

当然ながら同じ投稿を複数のリレーに投げつける訳ですから、同じ複数のリレーを閲覧するユーザから見るとまったく同じイベントが複数回登場する事があります。ここはクライアントはそれらをマージしつつ表示する事になります。ただ実際は websocket 上に流れる数十バイト程度の JSON でしかありませんので大した通信量にはなりません。

ここで着目して欲しいのが、上記の図でのユーザが扱うリレーの違いについてです。あるリレーを使うユーザは、別のリレーを使うユーザの投稿が見れない事が起きるのです。これは例えば日本語専用のリレーを建てる事で

  • ある人は日本語の投稿だけが見たいので日本語専用リレーだけを
  • ある人は日本語と英語の両方が見たいので日本語専用リレーと海外リレーを
  • ある人は英語だけが見たいので海外リレーだけを

この様な住み分けすなわち地域性が生まれる訳です。そして特定の地域内のリレーは個々に伝搬し合い、データの到達制も担保しようとしています。これが行われると何が起きるかというと、川ができるのです。


© あわゆき

面白いですね。

個人の情報は運営に管理される

SNS の個人情報とは何でしょうか。パスワードですか?それともメールアドレスですか?

実は Nostr にはパスワードはありません。あるのはアカウントを作った際に使った秘密鍵だけです。秘密鍵から公開鍵が算出され、この公開鍵がいわゆる1ユーザを示します。

例えば僕の公開鍵は以下です。

npub1937vv2nf06360qn9y8el6d8sevnndy7tuh5nzre4gj05xc32tnwqauhaj6

ユーザは投稿するイベントの JSON の一部をシリアライズし、そのシリアライズされたデータに署名(sig)を付けてリレーに投稿します。

{
  "content": "お薬\nhttps://image.nostr.build/eae5a55fe163f57e3f8e45319e1ca89da86cef060954f3025c0993d85f24e0da.jpg",
  "created_at": 1702137673,
  "id": "1a0f9a1eb6c394c0714cb363a5f08596c56714cc4be14030a30fce44503a359e",
  "kind": 1,
  "pubkey": "2c7cc62a697ea3a7826521f3fd34f0cb273693cbe5e9310f35449f43622a5cdc",
  "sig": "51cfde8e4346b3accea07baf2906523fdb307abd5b99897088a3f74cd57f1f9ff9b9c506e2fbed348c969e6cab90dc09f2157f911c84d6df81511074d261fcc6",
  "tags": [
    [
      "r",
      "https://image.nostr.build/eae5a55fe163f57e3f8e45319e1ca89da86cef060954f3025c0993d85f24e0da.jpg"
    ]
  ]
}

※ kind 1 は投稿を示しており、kind の値次第でリポスト(RT)やいいねを示します。また削除も同様にこのイベント JSON 形式で表現されます。

リレーはイベント投稿を受け取ると、そのイベントが本当にそのユーザで署名されたのかを確認します。クライアントが投稿時に行った様にイベント JSON の一部をハッシュ化し、公開鍵である pubkey を使ってシュノア署名を確認します。シュノア署名を利用すると、検証者が秘密鍵を知ることなくデータの検証を行う事ができます。

これによりイベントの JSON が改ざんされていない事が確認できます。つまりイベント JSON に明記されている pubkey による投稿やリポストやいいね、さらには投稿の削除は、秘密鍵を知っているユーザでないと出来ない事を意味します。
秘密鍵はリレーですら管理されません。あなたの秘密鍵を知っているのはあなただけなのです。

当然の話ですが、ユーザはこの秘密鍵を絶対に漏らしてはなりません。秘密鍵を漏らすとその秘密鍵を使って他人に乗っ取られます。とは言っても、パスワードのある他の SNS と違い、悪意のあるユーザが乗っ取ったユーザを排除する事はできません。

通常、Nostr クライアントは秘密鍵を入力してログインする機能があります。「クライアント作者に秘密鍵が漏れるんじゃないの?」と思われるかもしれません。Nostr のクライアントでは一般的に、ブラウザ拡張でログインする仕組みを保持しています。ブラウザ拡張に秘密鍵を設定しておくと、投稿の際に必要な署名をブラウザ拡張が代行する様になっています。ですので Nostr クライアントは秘密鍵がなくても投稿 JSON に署名を付ける事ができるのです。

ただ iOS や Android の様なスマートフォンアプリではクライアントに秘密鍵を預ける方式が使われています。これは現在の Nostr の課題ではあります。ただし、Android に関しては現在 Android の Signer を使って前述のブラウザ拡張と同じ方式を作ろうという検討が行われています。

https://github.com/nostr-protocol/nips/pull/868

この nostr-protocol/nips というリポジトリは何をしているのかというと、Nostr のリレーサーバやクライアントを作っている開発者達が集まって仕様を決めているのです。X/Twitter の仕様は X/Twitter 社が作っていますが、Nostr の仕様は開発者が作っているのです。機能を足したければ提案すればいいのです。

気に入らないオススメ等を運営に強制される

X/Twitter がやっている様な広告の投稿や、別に見たくもない別のユーザをオススメされたりする様な事がもありません。無駄に広告を流してくるスパムはもちろん存在しますが、見たくなければフォローしなければ良いだけです。

中央集権型の SNS と違い Nostr にはオフィシャルによる排除が無いのです。あるのはリレーの運営者による BAN です。しかしながら BAN されたユーザは別のリレーで生きていく事ができます。Mastodon や Miskey ではサーバを追い出されるとアカウントを使い続ける事ができなくなりますが、Nostr では自分の識別である公開鍵(npub)を使い続ける事ができます。

一般的に、Nostr のクライアントはフォローしている人だけを見せるタイムラインと、扱っているリレーに流れる投稿を全て見せるグローバルタイムラインを用意しています。まれにそのリレーに沢山のスパムが流れる事がありますが、あまりにも悪意のあるスパマーはリレー運営者によって排除されます。

機能の追加や削除は運営に委ねられる

ここまで読んだ方はだいたい想像できるかもしれませんが、Nostr の機能の殆どを作っているのは実はクライアントです。イベントを表現する JSON をどの様に画面で表現するかはクライアントによって決まります。ですので同じ Nostr プロトコルであっても沢山のクライアントが別々の見せ方をして存在します。

あるクライアントでは英語の投稿を自動で翻訳する機能を持っています。またあるクライアントでは投げ銭をサポートしています。

Nostr というプロコトルは、SNS の為に作られたプロトコルではありますが、これを使って色々な物を表現する事ができます。

Nostr プロトコルを使ってリバーシ(オセロと呼ばれたりもします)を作った人もいますし、ブックマークビューワを作った人もいますし、Togetter の様な物を作った人もいます。

https://github.com/nostr-jp/awesome-nostr-japan

また自分にとって便利な機能が欲しければ、自分で bot を作ってしまえばいいのです。

Nostr にしかないもの

自由

前述の様に Nostr はリレーサーバを用意すれば自分の地域を作る事ができます。例えるならば、今まで東京と大阪にしかなかった拠点に対して福岡の拠点を作る事ができ、それを許可なく始められるのです。またクライアントや bot を作るのも自由です。NIP として仕様は公開されており、それに従って誰がどんなクライアントや bot を作ってもいいのです。

Zap

Nostr にしかない特徴として、Nostr プロトコルには zap という投げ銭機能が仕様に含まれています。ビットコインの最小単位である Satoshi (0.00000001 BTC) を使って投稿やユーザに投げ銭できます。1 Satoshi はこの記事の執筆時点ではおよそ 0.06365 円です。

https://lokuyow.github.io/sats-rate/

fund を貰えるチャンス

新しい分散 SNS を求め続けているTwitter の元 CEO であるジャック・ドーシー氏は、以下の2つに寄付を行っています。

  • Bluesky (ジャック・ドーシー氏が起こした分散 SNS)
  • Nostr (fiataf 氏が作った分散 SNS プロトコル)

fiatjaf 氏は Nostr 発展のため、Nostr 関連の OSS 開発者に fund を行っています。筆者も fiatjaf 氏から 5000000 Satoshi 貰った事があります。さらにはオープンソースのビットコインプロジェクトをサポートする OpenSats から支援を受けられる可能性もあります。

https://twitter.com/mattn_jp/status/1714680681476014266

著名な Nostr クライアントの作者は OpenSats による支援を受けています。

Nostr の問題点

良い事ばかり言うのは詐欺師ぽいので、Nostr の問題点を書いていきたいと思います。

雑に秘密鍵を扱ってしまうリスクがある

前述の様に秘密鍵を漏らしてはいけません。また忘れる事もできません。中央集権型の SNS ではパスワードをリセットする事ができますが、それもありません。
そして公開鍵を変更する事は、ユーザを捨てる事を意味します。万が一、秘密鍵が漏れ、誰かに乗っ取られた場合に残された道は

  • 生涯、乗っ取った人と同じアカウントを共有して生きていく
  • アカウントを捨てる

の2択しかありません。このリスクをどう捉えるかはユーザの皆さん次第です。

リレーサーバの運営コストが掛かる

おおよそのリレーサーバは個人の有志で運営されています。一部のリレーサーバはスパムを排除したり特定の言語をしゃべるユーザの投稿しか流れないフィルタ機能を追加したり、といった付加価値を付け、それに対して課金をさせる有償リレーサーバも存在します。

しかし現在は多くの人に Nostr を知って貰い参加して貰うフェーズです。もし Nostr をやってみてリレーサーバの運営者に感謝の気持ちを伝えたいのであれば、Zap を送ると良いでしょう。

おわりに

分散 SNS である Nostr の仕組みの簡単な説明と、中央集権型 SNS との違い、Nostr の良さ、Nostr の問題点、を解説しました。
少しでも Nostr に興味を持ってくれる人が増えれば幸いです。

どうやって Nostr を始めたら良いのか分からない人は、iOS で Damus を入れるか、Android で Amethyst を入れるか、ブラウザで直接 Nostter を開いてみるといいと思います。

Discussion