NIP-53
Youtubeの
ライブ配信(配信+チャット)のような場をNostr上で実現するための仕様。
概要
サービスプロバイダは、クライアントによって参加者を簡単に記録・クエリできるような方法で、Nostrネットワークにライブアクティビティを提供したい。このNIPは、そのようなライブアクティビティに対する公開鍵(を持つ人)の参加を公表するための一般的なフレームワークについて記述するものである。
ライブイベント
kind: 30311
を持つ特別なイベント「ライブイベント」を、パラメータつき上書き可能イベントとして定義する。それぞれの p
タグは、イベントに参加しているユーザの現在のロール(例: Host
, Speaker
, Participant
)を表す表示可能な名前を持つべきである(SHOULD)。リレー情報は空でもよい(MAY)。このイベントはアクティビティに参加者が参加・退出するたびに、絶えず更新される。
例えば:
30311.json{
"kind": 30311,
"tags": [
["d", "<一意な識別子>"],
["title", "<イベント名>"],
["summary", "<(イベントの)説明>"],
["image", "<プレビュー画像のURL>"],
["t", "<ハッシュタグ>"]
["streaming", "<URL>"],
["recording", "<URL>"], // アクティビティが終わったあとに、編集済みの動画を置くのに使う
["starts", "<unixタイムスタンプ(秒)>"],
["ends", "<unixタイムスタンプ(秒)"],
["status", "<planned, live, ended のどれか>"],
["current_participants", "<数値>"],
["total_participants", "<数値>"],
["p", "91cf9..4e5ca", "wss://provider1.com/", "Host", "<(参加承諾の)証明>"],
["p", "14aeb..8dad4", "wss://provider2.com/nostr", "Speaker"],
["p", "612ae..e610f", "ws://provider3.com/ws", "Participant"],
["relays", "wss://one.com", "wss://two.com", ...]
],
"content": "",
...other fields
}
それぞれのアクティビティに対して、区別可能な d
タグを用いるべきである。他のすべてのタグは任意である。
(サービス)プロバイダは参加者リストを小さく(例: 1000人以下)保つべきであり(SHOULD)、制限に達した際はどの参加者をイベントに参加させるかを選択すべきである(SHOULD)。クライアントは(参加者の)総覧を期待すべきではない。アクティビティが終了したら、このイベントを削除してもよいし、アクティビティを総括し非同期的なコンテンツ(例: イベントの記録)を提供するためにイベントを更新してもよい。
クライアントは kind: 30311
のイベントを全般的に、または所定のフォローリストとステータスに絞り込んで購読することが期待される。クライアントは、アクティビティの参加者のロールやアクティビティに参加するためのアクセスポイントを表示してもよい(MAY)。
ライブアクティビティ管理用クライアントは kind: 30311
のイベントを(ライブ)イベントが開催されている間じゅう絶えず更新することが期待される。クライアントは status
が live
のイベントのうち、( status
が) ended
に更新されないまま1時間が経過したものを終了したとみなしてもよい(MAY)。 starts
と ends
のタイムスタンプは、それぞれ status
が live
になったとき、 live
でなくなったときに更新されるべきである(SHOULD)。
訳注: この段落の2文目(Clients MAY choose to consider...)にはおそらく言葉の欠落がある(イベントをどのようにみなすかを説明する言葉が抜けている)ため、適当に補った
アクティビティは、
NIP-19のnaddrコードと
a
タグを併用してリンクされなければならない(MUST)。
参加承諾の証明
イベント主催者は各 p
タグの5番目の要素として、参加者がイベントへの参加を承諾したのを明確にするための証明を追加できる。イベントを指す a
タグ( kind:pubkey:dTag
)全体のSHA256ハッシュに対する各 p
(参加者)の秘密鍵による署名を16進文字列にエンコードしたものを証明とする。
クライアントは、証明がある参加者のみを表示してもよい(MAY)し、証明がない参加者を「招待された」ものとして表示してもよい(MAY)。
この機能は、悪意のあるイベント主催者が、有名人(large account holders)を、本人の知らないところで勝手にイベントに参加させ、その人のフォロワーを主催者の罠におびき寄せるといった行為を防ぐために重要である。
ライブチャットメッセージ
kind:1311
のイベントはライブチャットのチャンネルメッセージを表す。クライアントは、アクティビティを指す a
タグを root
マーカーつきで含めなければならない(MUST)。 reply
や mention
といった、他の kind:1
のタグ(向けのマーカー)を用いることもできる。
1311.json{
"id": "<32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>",
"pubkey": "<32-bytes lowercase hex-encoded public key of the event creator>",
"created_at": "<Unix timestamp in seconds>",
"kind": 1311,
"tags": [
["a", "34550:<コミュニディイベント主催者の公開鍵>:<コミュニディのdタグ識別子>", "<リレーURL(任意)>", "root"],
],
"content": "Zaps to live streams is beautiful."
}
使用例
よくある使用例としては、ミーティングルーム/ワークショップ、動画鑑賞会(watch-together activities)、live.snort.social や
nostrnests.comのようなイベントスペースが挙げられる。
例