Skip to content

Note

このドキュメントは2026-02-27 03:01PLaMo Translation Modelを使用して自動翻訳されました。

FEP-5711: コレクションに対する逆方向プロパティの定義

概要

本FEP(Fediverse Enhancement Proposal)は、ActivityPubにおいて重要な意味を持つコレクションに対して逆方向プロパティを定義するものです。

背景と必要性

アクティビティ語彙では、オブジェクトへのリアクションを整理するための主要なコレクション属性が規定されています。ActivityPubはこれを拡張し、アクターの活動ストリームやソーシャルグラフを指定する追加属性を導入しています。

文脈によっては、特定のコレクションが対象のオブジェクトまたはアクターとの間に定義された関係を持っているかどうかを判断することが困難な場合があります。これは、AddRemoveUpdateDeleteといったアクティビティを通じてユーザーがコレクションを操作できるクライアントアプリケーションにとって重要な課題です。ActivityPubで定義されている特殊なコレクションは、通常異なる処理フローによって管理されるためです。

また、アクターのプロパティ値としてコレクションを特定する他の方法も存在します。具体的には、attributedTo属性を用いてアクターを識別した後、当該アクターが持つすべてのコレクション属性(inboxoutboxなど)と比較する方法があります。この手法は有効な代替手段ではありますが、本文書で定義する逆方向プロパティを用いることで、より直接的に関係性を確認できます。ただし、オブジェクトのプロパティとしてコレクションが設定されているかどうかを判定する方法は現在のところ存在しません。

さらに、サーバー側で悪用され得る一つの形態として、実際には他オブジェクトに関連するコレクションをあたかもそのオブジェクトのプロパティであるかのように扱うケースが考えられます。例えば、ある画像に対する「いいね」コレクションを、その画像自体とは無関係なオブジェクトのプロパティとして含めるといった手法です。このような操作は、対象オブジェクトの見かけ上の人気度を不当に高める目的で利用される可能性があります。逆方向プロパティを導入することで、こうした偽装行為を防止するための双方向検証メカニズムを実現できます。

これらの逆方向プロパティが特に有用となるのは、コレクションが関連するオブジェクトやアクターから独立して表現される場合です。例えば、以下のJSON例のように、コレクションが「いいね」の対象となるオブジェクトを明確に示すことができます:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Collection",
  "id": "https://example.com/collection/b25kr36ief",
  "likesOf": "https://example.com/image/7pqs5i7c1e"
}

一方、以下の例のようにコレクションをオブジェクトのプロパティとして表現する場合、これは冗長な記述となります:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Image",
  "id": "https://example.com/image/7pqs5i7c1e",
  "likes": {
    "type": "Collection",
    "id": "https://example.com/collection/b25kr36ief",
    "likesOf": "https://example.com/image/7pqs5i7c1e"
  }
}

ユースケースシナリオ

  • ActivityPubユーザーとして:オブジェクトのプロパティとして参照されるコレクションが実際にその用途に適していることを確認し、偽装行為を防止したい
  • ActivityPub開発者として:特定の用途向けに設計されたコレクションを正しく認識し、それに応じたアプリケーション開発を行いたい

仕様定義

以下の用語本語彙拡張において正式に定義されます。

以降のセクションで示す具体例は、以下のサンプルオブジェクトを前提としています:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Image",
  "id": "https://example.com/image/7pqs5i7c1e",
  "name": "美しい画像",
  "url": "https://files.example.com/image/29m2p4kdq15.jpg",
  "likes": "https://example.com/collection/b25kr36ief",
  "shares": "https://example.com/collection/hvjgqhpv3e",
  "replies": "https://example.com/collection/u9hwmfih7r"
}

および以下のアクターオブジェクト:

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Person",
  "id": "https://example.com/person/bup9a8eqm",
  "name": "Alice",
  "inbox": "https://example.com/collection/tgiqwh6p3b",
  "outbox": "https://example.com/collection/hvf8crcd6r",
  "followers": "https://example.com/collection/x48dtnhlt9",
  "following": "https://example.com/collection/r9w7krxua",
  "liked": "https://example.com/collection/jzc50wc28l"
}

likesOf属性

  • URI:https://w3id.org/fep/5711#likesOf
  • 適用範囲:as:Collection
  • 値の種類:as:Object
  • 関数型:真

このコレクションが「likes」プロパティの値として設定されている対象オブジェクトを定義します。

例:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Collection",
  "id": "https://example.com/collection/b25kr36ief",
  "likesOf": "https://example.com/image/7pqs5i7c1e"
}

sharesOf属性

  • URI:https://w3id.org/fep/5711#sharesOf
  • 適用範囲:as:Collection
  • 値の種類:as:Object
  • 関数型:真

このコレクションが「shares」プロパティの値として設定されている対象オブジェクトを定義します。

例:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Collection",
  "id": "https://example.com/collection/hvjgqhpv3e",
  "sharesOf": "https://example.com/image/7pqs5i7c1e"
}

repliesOf属性

  • URI:https://w3id.org/fep/5711#repliesOf
  • 適用範囲:as:Collection
  • 値の種類:as:Object
  • 関数型:真

このコレクションが「replies」プロパティの値として設定されている対象オブジェクトを定義します。

例:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "OrderedCollection",
  "id": "https://example.com/collection/u9hwmfih7r",
  "repliesOf": "https://example.com/image/7pqs5i7c1e"
}

inboxOf属性

  • URI:https://w3id.org/fep/5711#inboxOf
  • 適用範囲:as:Collection
  • 値の種類:as:Object
  • 関数型:真

このコレクションが「inbox」プロパティの値として設定されている対象オブジェクトを定義します。

例:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Collection",
  "id": "https://example.com/collection/tgiqwh6p3b",
  "inboxOf": "https://example.com/person/bup9a8eqm"
}

likedOf属性

  • URI:https://w3id.org/fep/5711#likedOf
  • 適用範囲:as:Collection
  • 値の種類:as:Object
  • 関数型:真

このコレクションが「liked」プロパティの値として設定されている対象オブジェクトを定義します。

例:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/fep/5711"
  ],
  "type": "Collection",
  "id": "https://example.com/collection/jzc50wc28l",
  "likedOf": "https://example.com/person/bup9a8eqm"
}

実装上の注意点

コレクションに対して定義される逆方向関係プロパティは単一でなければなりません。オブジェクトの「replies」コレクションがアクターの「liked」コレクションとしても機能する特殊な構造も考えられますが、このようなケースは極めて稀です。

これらすべてのプロパティは関数型であり、各コレクションには唯一の値が対応します。

セキュリティに関する考慮事項

本プロパティによって行われる主張は、参照先のオブジェクトまたはアクターを取得し、適切なプロパティを確認することで検証する必要があります。例えば、サーバーが「sharesOf」プロパティを用いて特定のコレクションがオブジェクトの「shares」プロパティであると主張している場合、クライアントはその参照先オブジェクトを取得して実際にそのコレクションを参照しているかを検証しなければなりません。

これらの逆方向プロパティを活用することでコレクションの偽装を防止できますが、コレクション内の具体的な内容に対する検証機能は提供しません。例えば、likesOfプロパティを使用して動画の「いいね」コレクションであると称するコレクションが、実際にはその動画とは無関係な「Like」アクティビティを含んでいる可能性もあります。

参考文献

著作権情報

CC0 1.0 Universal(パブリックドメイン献呈)に基づき、このFediverse Enhancement Proposalの著者らは、本著作物に関するすべての著作権および関連する権利を放棄しています。