リレーヒントの実装
#開発 #実装ノート
リレーヒント
リポストやイベント参照に対象となるイベントやユーザを見つけられるリレーのURLを含める仕様のことをリレーヒントと言います。
他のユーザがイベントやユーザを見つけられるようにするために必要となります。
返信、引用
"e" タグや "a"タグに含める
リポスト(NIP-18)
"e"タグは必ず含めなければなりません。NIP-18#642504bf2b31300000116e3d
bech32エンティティ(NIP-19, NIP-27)
nevent や naddr 、nprofile
任意のフィールドとして存在します
文献
リレーヒントって何を入れればいいの? リレーヒントに入れるリレーの選択方法の検討 by nikolat
どのリレーを選ぶか
本人のwrite先リレー(Outbox model)
イベントを受信したことのあるリレー(nostr-toolsやrx-nostrがサポート)
考慮すべきこと
認証付きリレーの考慮
許可制リレーや有料リレーのように、認証が必要なリレーが存在します。
認証が必要ならば、通常のユーザは閲覧ができないので除外するべきかもしれません。
判定方法
1. 最新1件だけ read して AUTH が流れてくるか
2. NIP-11の limitation.auth_requried を確認
置換可能イベントとパラメータ付き置換可能イベント
ユーザのwriteリレーに最新が載っているかもしれません。ユーザのwriteリレーを指定するのが良いかもしれません。
常に同じリレーを選ぶべきか?ランダムでよいのか?
リレーのスコアリングをするべきか?
リレーの安定性やこれまでのイベント数などに基づいて、リレーをスコアリングし、優秀なリレーをリレーヒントに含めることもできます。
リレーヒントの信頼度は高まる(イベントが見つかりやすくなる)が、リレーが分散されにくいという欠点もあります。
(参考までにgossipではリレーヒントにはスコアを使用していません。後述します。)
リレーヒントの利用
リレーヒントがあれば、イベントを見つけるときに利用できます。
通常のイベントの取得
リポスト等のイベントの参照時にだけ使う。
フォールバックとして使う。自分の普段利用しているリレーから見つからないときに問い合わせる。
置換可能イベント・パラメータ付き置換可能イベント
リポスト等のイベントの参照時に用いる
⚠️ただし、最新のユーザメタデータ(kind:0, いわゆるプロフィール)や最新の長文投稿を取得するなら、ユーザのwriteリレーを参照するのが確実かもしれません。
リレーヒントの限界
リレーヒントは常に信頼できる情報とは限りません。
リレーヒントで提示されたリレーが停止している恐れ(サービス停止、メンテナンス中など)
リレーヒントに認証付きリレーが選ばれてしまう恐れがある。
NIP-65 インデクサーリレーに問い合わせて、ユーザのwriteリレーを見つける
各クライアントの実装
※ SeenOn = クライアントがそのイベントを受信できたリレーのこと
gossip
自分のInboxリレー(readリレー)のうち、seenOnでも見つかった最初のリレー
Coracle
TBD
damus
TBD
amethyst
TBD
nostter
rxNostrのseenOnで最初に見つかったもの
https://njump.me/note14yuxxseah0m0yvp890xwwf6kf5scpeh7km3mjhnuvmjuafhhwrlqznqljy
lumilumi
rxNostrのseenOnの先頭のもの
noshaiku
イベントの場合
1. seenOnのうち、最初のOutbox modelのwriteに指定されているリレー
2. 存在しなければ、seenOnが存在すれば、seenOnの先頭
3. 存在しなければ、nevent1... のリレーヒントに含まれるものうち、writeに指定されているリレー
ユーザの場合 ("p"タグで必要)
1. ユーザメタデータ(kind:0、いわゆるプロフィール)を取得する。そのseenOnのうち最初のOutbox modelのwriteに指定されてるリレー
2. 存在しなければ、seenOnが存在すれば、seenOnの先頭
3. 存在しなければ、nprofile...のリレーヒントに含まれるもののうち、writeに指定されているリレー