どうも、ryo_gridです。
strfryなるNostrプロトコルのリレーサーバ実装が、他の複数のリレーサーバからデータを受信したり、クライアントから送信されたデータをフォワードすることで、クライアントは自分だけに接続すればいいぞー、みたいなことできるらしいと耳にして、それはクライアントの負荷も減るしええやん、とドキュメントとコードを読んで分かったことを共有します。
注:同じようなGitHubリポジトリへのリンクが表示されていますが、ページ内リンクがついていてそれぞれ飛び先は異なります
リレーサーバのデーモンとしては単体で完結するような作りになっている模様
- 自身に接続してきたクライアントの相手を普通に行うのが基本で、その中で受け取ったイベントデータは自身のDBに格納する。
他のリレーサーバとのやりとりはCLIなコマンドが用意されていて、それを用いて行う
- 主には、イベントデータの受信およびイベントデータの送信
- $ ./strfry stream wss://relay.example.com --dir both
- とかすれば1つのWebsocketコネクションで双方向にデータを送受信しあい、受信したデータはDBに追加するらしい
- 少なくとも受信はイベントの生成日時関係なく受信可能なものは全て受信すると思われる(ちょっと自信がない)
- そもそも、strfryは自身のDB内において、他のリレーサーバのデータが同期されていればいいじゃん、と考えているようで、それを効率的に行う仕組みを作りこんでいる模様
- $ ./strfry sync wss://relay.example.com
- というのが受信方向に対応するコマンド
- $ ./strfry sync wss://relay.example.com --dir both
- こっちは双方向で行うコマンド。しかし coming soon であるとのこと
- データの同期に関しては元々リレーサーバ間の連携のために設計されたyesstrなるプロトコルあって、それを拡張したものの実装である Quadrable というものを(自分たちで作りつつ)用いて行うのだとか
- しかし、Quadrableのリポジトリの説明を読むと、Nostrというキーワードは出てこず、マルチバージョンなデータベースで、効率的に他のデータベースインスタンスと同期できるところが特徴である、みたいなことが書いてある。うーん?
その他
- 自身のDB内にイベントデータを格納する時点で重複を排除するので、クライアントが複数のリレーサーバからデータを受信するよう設定している場合(Nostrではこれが普通)に、通常、発生してしまう同一のイベントデータの重複受信は起こらないようになるようです
- つまり、クライアントにおいては、通信量が減ることになります
- リレーサーバがどれだけの期間データを保持するかは、個々のリレーサーバ次第で、クライアントからはコントロールできませんが、自身で strfry をホストすることで、ストレージの容量が許す限り残しておくことが可能なはずです
お願い
- 記述内容に誤りがあるようでしたら、コメント欄でご指摘いただけるとありがたいです!
追記(220301)
- 調査結果で分かったことの(少なくとも個人的に)重要なところは、プロキシ的な運用ができると言っても、クライアントが投げたイベント情報をフォーワードする、サブスクライブ要求をフォーワードするという考え方での作りにはなっていないという点です
- クライアントの面倒は基本的に全て自身がやるという作りで、(内部処理的に一部例外はあるようであるものの)受信したイベントデータは自身のDB内に格納し、サブスクライブ要求への応答も自信のDB内のデータに基づいて行うという形になっています
- しかしながら、自身のDBの内容を他のリレーサーバのそれと雑に言えば同期させる機能をオプションとして持っていて、それを用いた同期がリアルタイムに近い早さで行われていれば、結果的にクライアントからはプロキシのように見えるということになります
- 同期処理においては、メタデータからクライアントクライアントが他に接続しているリレーサーバを確認して、その情報を意識するといったことはなく、strfryを運用している者が固定的に設定したリレーサーバとの間でしか行われないため、運用者が設定したリレーサーバからの読み込み、へのの書き込みだけでは困るというクライアント(ユーザ)にとっては、"自身だけに接続すればOK!" とはなりません
- 聞くところによると filter.nostr.wine というリレーサーバは、有料でプロキシ的な役割を提供いますが、サーバ実装としてはstrfryを利用しているらしく、サービスの説明のところには、仲介をする(ように見える)リレーサーバがリストされています
enjoy!