2023年のNostrへの貢献を振り返る

2023年のNostrへの貢献を振り返る

本稿はNostr(1) Advent Calendarの17日目の記事です。

前日の記事はmattnさんの [Nostrの面白さをエンジニア目線で解説してみる]a(https://zenn.dev/mattn/articles/cf43423178d65c)と kotaroさんの『のすた/のすとら/のすととと』 の2本でした。第2会場の本日の記事はおだらさんの NIP-04は危ない です。

English version is here:


かすてらふぃと申します。今年2月にNostrにはじめて触れて以降、しがないソフトウェアエンジニアとして生きつつ、自分のできることをもってNostrという場に貢献してきました。思えば遠くへ来たものだということで、今回はNostrに出会ってから10ヶ月の間にやってきたことを振り返ってみようと思います。

2月~3月: はじまり

Nostrの名前をはじめて目にしたのは2022年末のことでした。Twitterが競合SNSへのリンクを禁止したというニュース。FacebookやMastodonといった錚々たる顔ぶれの中に、Nostrという何やら見慣れない名前が紛れ込んでいるのを見つけ、「なんだこれ…?」と思った記憶があります。しかしこの段階ではNostrを始めるにまでは至りませんでした。

Nostrをはじめとする分散型SNSに手を出すきっかけになったのは、2023年2月3日頃のTwitterアカウント凍結祭りでした。幸い、自分のTwitterアカウントが凍結されることはなかったものの、イーロン・マスク体制に移ってからのサービスに対する不満や、ごく個人的な「Twitterで何を言っても誰も聞く耳を持ってくれない…」という感情が手伝って、ここらで外に飛び出してみるのも悪くないと思ったのです。しかし、早速秘密鍵を作ってみるも眼前に現れるのは中国語スパムの嵐か、よくて英語のつぶやきばかり。ちょっとこれは厳しいなと感じて一旦Misskey.ioに浮気。

Misskey.ioのキラキラ感に若干飽きが来はじめた3日後の2月6日、ふと思い出してNostrのほうに目をやると、「#japanタグで日本人同士つながろう!」というムーブメントが起きていました。これをきっかけに、同じタイミングでNostrにやってきた多くの日本人の皆さんとつながることができました。そして、他愛のない発言にも反応をもらえる嬉しさや、この人たちといるとなんだか面白そうなことができそう!という不思議な予感から、SNSとしてのNostrにのめり込んでいくのでした。

最初の頃は、他の開発者の面々の興味がオリジナルクライアントの開発に向く中、なんとなくちょっと違うこと、具体的にはリレーの実装をしてみたいな、というモチベーションがあってNIPsを読んでいました。Nostrの情報を集積するScrapboxが立ち上がり、そこにNIPsの日本語訳をまとめている方がいるのを見て、せっかくなら自分も協力しようと仕事中の暇な時間まで費やして翻訳を進めてみたところ、多くの人に感謝の言葉やZapをいただきました。今日までこの場で貢献を続けてこられたのは、このときの嬉しさがあったからこそだと思っています。

そんなこんなしているうちに2月22日、初回のNostr勉強会(#0)が開催されました。コミュニティが形成されてからわずか2週間ちょっとしか経っていないにもかかわらず、たくさんの面白いアイディアが生み出されているのを目の当たりにし、こうしてはいられない、自分もなにか面白いものを作りたいという思いが高まります。このとき最初に頭に浮かんだのはフォロー整理ツールの構想でした1。フォロー整理の参考情報として各フォロイーの最終投稿日時や過去数日間の投稿数を出せると面白いと思い、実装に取りかかったところ、指定したとおりにリレーからイベントが取得できないことがあるのに気づきました。取得条件に合致するイベントが多数ある場合、そのうちの一部しか返ってこないのです。実験をしたりソースコードを読んだりしながらさまざまなリレーの挙動を追ううちに、リレーに保存済みの過去のイベントを思い通りに取得するのは見た目よりもずっと大変で、これを上手く解決するライブラリがあれば自分も他の開発者もハッピーなのでは…? と思い至ります。

こうして生まれたのが、今や自分のNostrにおけるOSS活動の代表作ともなった nostr-fetch です。過去のタイムラインを遡れるWebクライアント Nosaray や、リレーに保存されている過去のイベントを余すことなく取得できるCLIツール nosdump といった自分製のアプリケーションはもちろん、全世界のNostrリレー情報を総覧できるサイトである[nostr.watch](@kojira

その後、前回からたった2週間後の3月10日に開催されることとなった Nostr勉強会#1 で、意を決してこの成果を発表してみることに。これが人生初の技術勉強会登壇でした。スライドの準備がギリギリになったり、いざ実際に発表してみると全然時間枠に収まらず、会のスケジュールを崩壊させてしまったりと至らない点ばかりでしたが、自分が考えたこと・作ったものについて多くの人に聞いてもらう楽しさに気づくことができました。

4月~5月: 初の技術書寄稿

勉強会の後しばらくはNIPs2の翻訳に勤しんだり、訳す途中で気になったNIPsの重箱の隅をつついてみたり、nostr-fetchに機能を追加したり、ちょっとBlueskyに浮気してみたりといった日々を過ごしていました。

NIPsのコントリビューター一覧 (NIPsのコントリビュータ一覧に食い込む自分の図)

ある日、5月に開催の技術書典14でNostrの合同技術同人誌を出そう!という声が上がり、そこからあれよあれよと話が進んでいきます。数年前に技術書典に一般参加してからというもの、技術書典で何かを書き物を発表することに漠然とした憧れがあった自分は、即座に寄稿を決意しました。いわずもがな、人生初の経験です。

さて、何を書いたものか。技術書典は「新しい技術に出会えるお祭り」。こちらとしてはNostrのことを幅広い技術者に知ってもらえる絶好の機会。ならば、実際に動くモノ(bot)を作りつつNostrプロトコルの基本を押さえられる演習問題を作れば、Nostrコミュニティの開発者の裾野が広がってもっと面白い場所になっていくんじゃないか?と考えました。そうして書き上がったのが 「Hello, Nostr!」内の一記事「手を動かして学ぶ Nostrプロトコル」と演習問題 です。

Hello, Nostr! 書影 (Hello, Nostr! 書影。Nostrちゃん(by @青ぎさん

結局当初の目論見は外れ、むしろ「既にNostrをやっている、普段はあまりプログラムを書かない層」に届く結果となりました。しかし、これを個性豊かなbotがたくさん生まれTLが今まで以上ににぎやかになったり、これをきっかけとしてNostr上で自分の作りたいものを実現する方が出てきたりと、コミュニティに良い影響を与えることができました。

6月~7月: かすてらリレー建立

ふと疑問が浮かびます。「Raspberry Piベースの趣味で動かしているような自宅サーバでも、Nostrリレーを立ててみんなに使ってもらうことはできるだろうか?」

時を同じくしてrnostrという新しいリレー実装が発表されたので、せっかくだからと最初はその実装を動かしていました。しかし当時はリリース直後とあってなんとも挙動が怪しく、クライアントが求めていないイベントを返してみんなのタイムラインを崩壊させてしまうようなこともありました。これでは流石に迷惑なので、結局より実績のあるリレー実装strfryに移行することにしました。

ここで少し工夫して、既存の日本人向けリレーと同様にアクセス元を日本国内のみに限定したリレーに加えて、リレー管理者である私をフォローしているアカウントからの投稿のみを受け付ける「フォロワー限定リレー」を用意してみました。海外在住だったり一時的に海外に出ていたりする日本人Nostrich3の皆さんにも、ある程度スパムが排除されたタイムラインをお届けできるという、他にはない価値を生み出すことができました。

ちなみに、このとき得られた知見については11月の技術書典15で出た「Hello Nostr! Yo Bluesky! 分散SNSの最前線」内の記事「ラズパイで簡単! 一家に一台 おうちNostrリレー」にまとめてありますので、興味のある方はぜひお読みください。

Hello Nostr! Yo Bluesky! 書影 (Hello Nostr! Yo Bluesky! 書影。のすちゃん空ちゃん(by @崇徳さん

8月~9月: 王道からちょっと外れたクライアント開発

この文章をここまで読んできた方は薄々感づかれているかと思いますが、自分はどうやら「王道から少し逸れたこと」をやるのに価値を感じる4タイプの人間のようで、この時期になると開発活動の方針にもこの性向が表れてきます。

vscode-nostr-client

テキストエディタの拡張機能としてのNostrクライアントがあれば、仕事をしているふりをしながらNostrできるのでは…? という声に応えて作ってみたのが、Visual Studio Code拡張機能としてのNostrクライアント、 vscode-nostr-client です。今のところ投稿機能とステータス(後述)変更機能しかありませんが、人の目を盗んでNostrするには十分でしょう(?) これまた人生初のVSCode拡張機能開発で、刺激的な経験になりました。

nostatus

同時期に、言わずと知れたiOS向けNostrクライアントDamusの開発者である[Willさん](@xtsc…kk5s この発想から生まれたのが nostatus です。

nostatusロゴ (nostatusのロゴ。Figmaで丸と四角しか描けなかった自分に、線を曲げる方法を教えてくれた@あんずさん

このnostatus、実は最初はWebフロントエンド技術のお試し用プロジェクトでしかなく、あまり作り込む予定はありませんでした。しかしいざリリースしてみると思いの外反響が大きく、Habla.news開発者の[verbirichaさん](@verbiricha

Software Design誌への寄稿

日本のソフトウェアエンジニアであれば誰もが知っているソフトウェア技術の総合誌、Software Design。そこへの寄稿記事を執筆していたのもこの時期です。

[mattnさん](@mattn 興味はあったものの話題に乗り遅れ、後塵を拝する結果に… と思いきや、ある日寄稿予定だった方のひとりが執筆を辞退。もう二度とやってこないかもしれないチャンス、逃すわけにはいかない…! との思いで代筆を名乗り出ました。こうして、初の技術同人誌への寄稿から数ヶ月でまさかの商業誌デビューが決まったのです。

担当記事のテーマは「Nostrプロトコル」。先の技術書典で執筆経験のあるテーマではありましたが、読者層の違いや文字数の制約などを意識しながらの執筆は一筋縄では行きませんでした。しかしその分、完成した本をめくって自分の書いた文章が印刷されているところを観測したときの喜びは、言葉で語り尽くせないほどのものでした。

SD誌寄稿見出し (SD誌への寄稿の大見出しショット)

10月~12月: さらなるニッチへ、そして苦悩

この時期は技術的興味に駆られて思いついたものをどんどん作るようなことをしていましたが、一方で本当にこれは人の役に立つのだろうか…? という悩むこともしばしばありました。

hono-nostr-auth

https://github.com/jiftechnify/hono-nostr-auth

NIP-98という、NostrのしくみをHTTP認証に応用するための仕様があります。これを、Honoという最近話題のWebサーバフレームワークで1行で実装できるようにしたらCOOLなんじゃないか、と思って作ったものです。しかしそもそもNIP-98認証の使いどころが難しく、上手い応用方法が見つけられずにいます…(画像アップローダの認証以外になにかないだろうか)

strfrui

https://github.com/jiftechnify/strfrui

先述のかすてらリレーでも利用しているstrfryには、リレーに入ってくるイベントひとつひとつに対し所定の条件を満たしているかをチェックし、条件を満たすイベントだけを通すevent-sifter(イベントふるい)という機能があります。この条件チェックでは好きなプログラムを実行できるため、他のリレー実装に比べて非常に柔軟なフィルタリングが可能です。この条件チェック用のプログラムをもっと手軽に実装できるようにしたらCOOLなんじゃないか、と思って作ったものです。

リリース直後は主に海外のNostrリレー運用者の皆さんから反響があり、Nostrコミュニティ上で起きたできごとを日ごと・週ごとにまとめるNostr Reportにも取り上げられましたが、モノの性質上Nostrを単にSNSとして使っている「普通の人」にはあまり響かなかったようです。このとき、自分は己の技術的関心を満たすことよりも、自分がつくったものを沢山の人に使ってもらえることのほうに喜びを感じるタイプの人間なんだ、と気づくのでした。

しりとリレー

https://srtrelay.c-stellar.net/

直前の投稿に対してしりとりが成立していないと投稿できない特殊なリレーです。strfryのevent-sifter機能を応用してなんか面白いことがしたいという単純な動機からできあがりました。

最初のころは、終わりのないしりとりをわざわざNostr上でやる意味もなく、あまり盛り上がりませんでしたが、漢字やアルファベットなどの読みにも対応した上で他のリレーから投稿を輸入するようにしたところ、偶然繋がるしりとりを愉しむ奇妙ながらもなんだか面白い場になりました。

りとりん (しりとリレーの番人、りとりん。かわいい! Special Thanks to @たーごいるさん)

おわりに

こうして振り返ってみると、この10ヶ月間いろいろなこと、たくさんの「人生初」をやってきたものだなと思います。ここまで精力的に活動してこれたのは、間違いなくNostrコミュニティの皆さんから温かい言葉やリアクション、そしてZapのおかげです。この場をお借りして感謝いたします。心から、ありがとうございました!

来年以降Nostrというものがどう発展していくかは未知数ですが、その発展の一端を自分が担えるのであれば、それ以上に嬉しいことはありません。


付録: かすてらふぃによる2023年のNostrへの全貢献リスト

Nostrクライアント

名前 アプリURL リポジトリURL 概要
Nosaray https://nosaray.vercel.app/ https://github.com/jiftechnify/nosaray 過去のTLを遡れるクライアント
nostatus https://nostatus.vercel.app/ https://github.com/jiftechnify/nostatus フォローしている人のステータスを一覧できるクライアント
vscode-nostr-client https://marketplace.visualstudio.com/items?itemName=jiftechnify.nostr-client https://github.com/jiftechnify/vscode-nostr-client VSCodeから投稿できるクライアント

Nostr関連ライブラリ/ツール

名前 リポジトリURL 概要
nostr-fetch https://github.com/jiftechnify/nostr-fetch 複数のリレーから過去のイベントを簡単に取得するためのライブラリ
nosdump https://github.com/jiftechnify/nosdump 複数のリレーから過去のイベントをまとめて取得するCLIツール
hono-nostr-auth https://github.com/jiftechnify/hono-nostr-auth Hono用のNostr HTTP認証ミドルウェア
strfrui https://github.com/jiftechnify/strfrui Go言語でstrfryのevent-sifterプラグインを書くためのフレームワーク

Nostrリレー

リレーURL 概要
wss://nrelay.c-stellar.net リレー管理者のフォロワーのみ書き込みできるリレー
wss://nrelay-jp.c-stellar.net 日本国内からのみアクセス可能なリレー
wss://srtrelay.c-stellar.net しりとりが成立していないと書き込めない特殊なリレー

LT

会場 配信アーカイブURL スライドURL 概要
Nostr勉強会 #1 https://www.youtube.com/live/J6wgG4epGK0 https://speakerdeck.com/jiftechnify/nostrnorirekaralou-renakusubetenoibentowoqu-tutekuruji-shu nostr-fetchの概要
Nostr勉強会 #2 https://www.youtube.com/live/j7IZeAzL67M https://speakerdeck.com/jiftechnify/think-about-feasibility-of-scheduled-posts-on-nostr Nostrで予約投稿を実現する方法について
Nostr勉強会 #3 https://www.youtube.com/live/t3VkJpr1_sA https://speakerdeck.com/jiftechnify/cryptography-101-for-understanding-nostr Nostrを支える暗号技術に関する解説

執筆活動

書名 URL 寄稿タイトル 概要
Hello Nostr! 先住民が教えるNostrの歩き方 https://nip-book.nostr-jp.org/book/1/ 手を動かして学ぶ Nostrプロトコル botの実装を通してNostrプロトコルを理解するハンズオン
Hello Nostr! Yo Bluesky! 分散SNSの最前線 https://nip-book.nostr-jp.org/book/2/ ラズパイで簡単! 一家に一台 おうちNostrリレー Raspberry PiでNostrリレーを運用する方法
Software Design 2023年10月号 https://gihyo.jp/magazine/SD/archive/2023/202310 詳説 Nostrプロトコル NIP-01をはじめとする主要なNIPsに関する解説

  1. なぜこんなタイミングでフォロー整理ツールを作ろうと思うに至ったかというと、フォローリストが突然空になる現象の原因としてフォローのしすぎが疑われていたため。なお、実際の原因は単なるクライアントの実装不備だと思われる。ちなみに、結局フォロー整理ツールは完成していない。 

  2. Nostr Implementation Possibilitiesの略で、簡単に言えばNostrプロトコルの仕様書の集まり。 

  3. Nostrとostrich(ダチョウ)を組み合わせた言葉で、Nostrユーザのことを指す。 

  4. ライバルの多い土俵で戦うのを避けているだけとも言う 


No comments yet.