🍗

Nostrではじめる、分散型アプリケーション開発

2023/12/24に公開

Nostr(1) Advent Calendar 2023 24日目の記事です。

はじめに

こんにちは!kaijiです。

この記事は、NostrをただのSNSと思っている方や、「そもそもそれ何?」という方へ向けて、分散型アプリケーション開発としてのNostrの面白さと可能性を伝えられればと思って書いています!

Nostrに関する前提知識は不要なので、気軽に読んでみてください。

Nostrって何?

Nostr(Notes and Other Stuff Transmitted by Relays)は、主に分散型SNSのために使われているプロトコルで、情報やデータがサーバーではなく、複数の「リレー」と呼ばれるノード群に分散して保存される仕組みで動いています。

有名な実装例としては、Damus, Amethyst, Snort, Nostter等があります。

https://apps.apple.com/jp/app/damus/id1628663131

https://play.google.com/store/apps/details?id=com.vitorpamplona.amethyst&hl=ja&gl=US

https://snort.social/

https://nostter.app/

他の分散型SNSとの違い

Mastdonや、Bluesky、Misskeyといった他の分散型SNSとの違いとして、Nostrリレーは、他ノードとのやりとりやユーザー認証といった、いわゆるアプリケーションサーバーのようなことは行いません。

リレーはデータを保存するだけの単純なデータベースのように動作するため、運用にかかるコストがとても低く、またクライアント単体でできることの幅がとても広いことが特徴です。

また、認証は全てユーザーに紐づいた秘密鍵を使って行われ、投稿内容が正しいものかは署名を用いて検証することで、ユーザー認証を行わなくても内容が改竄されていないことを確認できます。

NostrはSNSではない

Nostrは主に分散型SNSのためのプロトコルとして使われていますが、リレーサーバーの実態は単純なデータベースであるため、実はここに任意のデータを載せることができます。

Nostrには、NIPs(Nostr Implementation Possibilities)と呼ばれる仕様があり、基本的なSNSの機能とリレーに関する仕様は主にNIP-01に定義されています。

しかしNIP-01以外にも、NIPsではSNS以外にも使える仕様ががいくつも制定されています。以下でその一部をご紹介します。

NIP-15: マーケットプレイス

AmazonやShopifyのような在庫管理可能なマーケットプレイスを作るための仕様。

NIP-23: 長文コンテンツ

noteやzennのような長文コンテンツを投稿するための仕様。内容はマークダウンで記述する。

NIP-52: カレンダーイベント

カレンダーのような時間ベースのアプリをNostrで作るための仕様。

NIP-78: アプリケーション固有データ

ユーザーごとの設定ファイルのような、そのアプリケーションでしか使われないデータを保存するための仕組み。

NIP-98: HTTP認証

Nostrのアカウント(秘密鍵)を使って発行した、BearerトークンでHTTP認証するための仕様です。

Nostrでアプリ開発をすると嬉しい理由

ここまでNostrの特徴と、SNS以外の開発基盤としても使えるという話をしてきましたが、次に実際にNostrでアプリ開発をするとどんなメリットがあるのかについて説明します。

運用にかかるコストが低い

Nostrの多くのリレーは無料で提供されており、このリレーをデータベースのように扱うことができるので、Nostr上で完結するサービスの場合、金銭的なコストをかけずにアプリケーションを作ることができます。(もちろん、将来的に大きいアプリケーションになった際は、リレーの負荷が高くなってしまうため、自分でリレーを立てる方がいい場合もあります)

パスワードやトークンのようなセンシティブなデータを扱わなくてもいい

Nostrはユーザーを秘密鍵ベースで管理するので、まず認証のためにパスワードやトークンのようなデータを管理することなくサービスを提供することができます。

また、このユーザーの秘密鍵もNIP-07という仕様により、ブラウザの拡張機能など外部で秘密鍵を管理し、実際のアプリケーション側では、署名のリクエストのみを送ることで、直接秘密鍵を触らない安全なアプリケーションを作ることができます。

共通のID(DID)とイベント

先述した通り、Nostrはユーザーを秘密鍵ベースで管理します。そしてこのユーザーという単位はアプリケーションごとではなく、Nostrプロトコル全体で使えます。つまり、分散型ID(DID)としてNostrのアカウントを利用することができます。

これにより、同じNostr内のアプリであれば会員登録が不要であることに加え、他アプリで利用しているプロフィール等をそのまま使うこともできますし、この情報をベースにユーザーのSNSでの投稿や、他アプリで作成したイベントをそのまま利用することができます。

活発なコミュニティ

Nostrでは、国内外問わずコミュニティが活発です。いわゆるオープンソースプロトコルとしての実装や仕様策定ももちろん賑わっていますが、それ以上に、アプリやサービスがどんどんリリースされ、Nostrにいるユーザーは、エンジニアかどうかを問わず積極的にそれらのアプリケーションを利用してフィードバックを送ってくれます。

個人開発者にとっては、最初に応援してくれたり、フィードバックをくれるユーザーを獲得することがとても重要ですが、同時にとても難しいことでもあるので、このステップが踏みやすいNostrはそれだけでとても魅力的な場所だと思います。

(DApps開発者向け) Ethereumのようなブロックチェーン・スマートコントラクトとの違い

ブロックチェーンでも分散型アプリケーション(DApps)を構築することは可能ですが、Nostrとの大きな違いとして、トークンネイティブでないということが挙げられます。

基本的にブロックチェーンにデータを記録するためには、手数料を支払う必要がありますが、Nostrでは必ずしもその必要はなく、実際にほとんどのリレーは無料で提供されています。

その代わり、スマートコントラクトのような仕組みは現状ないため、オンチェーンでの計算処理が必要な場合や、グローバルステートを用いたアプリケーション、そもそもトークンがないと成り立たないアプリケーションに関しては、Nostrではなくブロックチェーンを利用すべきです。

逆に多くのweb2アプリケーションを分散型にするための仕組みとしては、Nostrの方が支払いコストがかからないため、UXの良いアプリケーションを構築しやすいと考えられます。

また、NostrにもLightning Networkを使った決済に関するNIPsがあり、SNS上でもZapという少額の投げ銭の仕組みがあるため、いわゆる資金決済レイヤーのようなものは、Nostr上にも一応あります(EVMに比べたらかなり疎結合ですが…)。

事例集

最後にNostrを使った、SNS以外の分散型アプリの事例を紹介します!(半分宣伝)

Hostr

作者: kaiji

Nostrリレー上にHTML・CSS・JSファイルを置いてウェブホスティングをできるようにする仕組みです。ドメイン・サーバー不要で分散型ウェブホスティングを実現できます。

https://hostr.cc

Habla

作者: verbiricha

Long Form Content(NIP-23)を投稿、表示するためのプラットフォーム。

https://habla.news

Wavman

ランダムで音楽が再生され、気に入った曲があればアーティストに投げ銭できる音楽アプリ。

作者: Wavlake

https://www.wavman.app/

Jester

作者: Thebora Kompanioni

Nostr上でチェスができるアプリ

https://jesterui.github.io/

chronostr

作者: kaiji

12/20にリリースしたばかりのアプリで、Nostr上で調整さんのような日程調整ができます。イベントの作成者以外はログイン不要で使えます。

https://chronostr.pages.dev/#/

さいごに

Nostrはこのプロトコルのシンプルさから、分散型SNSの枠を超えた様々なアプリケーションの構築レイヤーとして使えるということが、少しは伝わったかなと思います。

この記事は、Nostrでできることにフォーカスして書いたので、技術的な部分についてはあまり触れていません。
より詳しく知りたい方向けに、最後にいくつか記事を貼っておきますので、そちらも合わせて見てみると、より理解が深まると思います。

https://qiita.com/gpsnmeajp/items/77eee9535fb1a092e286

https://zenn.dev/mattn/articles/cf43423178d65c

https://txt.murakmii.dev/posts/nostr-based-software-practice

Discussion