ステータスに関する注意: 現行のNIP-31仕様は、自らを「不必要に肥大化している」としてunrecommendedと位置づけており、そのステータス行にはdraft、unrecommended、optionalと記されています。この慣例を用いたイベントはすでにリレーに保存されているため、このページではクライアントがそれらをどう読むかを説明します。新しいプロトコルにNIP-31を推奨するものではありません。

NIP-31はトップレベルのaltタグを定義します。このタグは、通常のテキストノートとして読まれることを想定していないカスタムイベントkindのための、短いプレーンテキストの要約を保持します。

仕組み

カスタムkindのイベントの作成者は、人が読めるラベルを入れたaltタグを追加します。kind 1を中心に作られたクライアントは、認識できないすべてのkindを購読する必要はありません。それでも、そうしたクライアントのユーザーはノートがそのようなイベントを参照したときにそれに出会うことがあり、クライアントがそのkindを実装していなくても、ラベルがある程度の文脈を与えます。

タグの断片であり、完全なイベントではありません:

["alt", "<short plaintext summary>"]

人が読めるラベルが担うのは表示だけです。投票したり、ウォレットリクエストに応じたり、そのkind本来のその他のアクションを実行したりすることはできません。より豊かなやり取りについて、仕様はNIP-89: 推奨アプリケーションハンドラーを参照するよう示しています。

実装

noStrudelのコミット7c68acf時点の未知イベントカードでは、最初のaltタグがトリムされてメインラベルとなり、任意でUsing <client>の行が付きます。値が欠けているか空白の場合はUnknown event (kind ...)となり、コンテンツは最大3行までそれ単独で表示されます。同じコンポーネントは、NIP-89のハンドラーテンプレートを通じてclientタグを解決します。共有可能なアドレスが存在する場合はOpenボタンを表示し、有効なハンドラーリンクが解決された場合はOpen in <client>を表示します。説明とアプリへの振り分けは別々のコントロールです。

Amethystのコミット553f761時点のUnknownEventDigest.ktは、散文と分類したコンテンツを優先し、altにフォールバックします。そのパーサーは値をトリムし、空白でない最初のaltを採用します。その結果、最初のaltが空白のイベントは、noStrudelとは異なるラベルになる場合があります。どちらの記述も、それぞれのコミット時点のソースコードを反映したものです。いずれもリリース版の挙動を確認したものではありません。

制限

  • altはタグであるため、NIP-01で定義されるイベントIDと署名の対象に含まれます。有効な署名は、作成者がそのラベルを公開したことを示します。ラベルが正確であることは示さないため、要約が誤解を招く可能性があります。
  • タグは公開されます。暗号化されたコンテンツを持つイベントのaltは、その要約を露出させ、コンテンツが隠している内容を明かしてしまう可能性があります。
  • 上記の2つの性質は、NIP-01のイベントエンベロープに由来します。NIP-31自体の本文は、これらを要件として述べていません。
  • トップレベルのaltタグは、imeta内にある画像説明用のaltフィールドとは別物であり、レンダラーはそれぞれを別々にパースします。

一次資料:

言及箇所:

関連項目: