Skip to content

Note

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

FEP-1042: Peer to Peer Federated Identity System for Fediverse

概要

ActivityPubの分散型モデルでは、異なるインスタンス間でデータを参照する際の柔軟性が確保されています。ただし、この仕組みを利用するには各インスタンスが常にオンライン状態である必要があり、HTTPS/DNSベースのウェブ環境以外での非インターネット型またはローカル公開アイデンティティはサポートされていません。

本文書では、実装者がPeer to Peerプロトコルでホストされているオブジェクトを参照するためのActivityPub拡張方法と、互換性のあるクライアントがこの機能を検出して相互にコンテンツを読み込み可能とする方法について説明します。

根拠

ActivityPubの分散型モデルは、異なるインスタンス間でデータを参照する際の柔軟性を提供します。ただし、各インスタンスが常にオンライン状態であることを要求するため、HTTPS/DNSベースのウェブ環境以外における非インターネット型またはローカル公開アイデンティティはサポートされていません。Peer to Peer版ドキュメントをHTTPS版と連携させることで、既存のAP実装との相互運用性を維持しつつ、P2P専用ネットワークへの道を開くことが可能となります。

詳細仕様

基本アプローチ

コンテンツに対する「代替」URLを参照するための既存規格が存在します。これらは既に、ウェブページからActivityPubアイデンティティを解決する際や、ActorやNoteといったActivityPubオブジェクトからウェブページへリンクする場合、あるいは@username@domain形式の表記で参照されるユーザーのActivityPubアカウントをWebfingerを用いて発見する際に利用されています。

本アプローチでは、従来の方法を拡張し、期待されるHTTPリンクに加えてP2Pバージョンのリソースを指す追加URLを提供します。

準拠クライアントは、可能かつユーザーが許可している場合には、可能な限りP2P版APデータを優先して読み込むよう設計されるべきです。

HTMLにおけるリンク要素

最も簡単な実装方法として、コンテンツネゴシエーション機能とHTMLページへのリンクを併用する方法があります。Acceptヘッダーによるコンテンツネゴシエーションが利用できない静的公開型のAPサイトでは、linkヘッダーを使用して、該当ページに関連するActivityStreams形式のJSON-LDファイルを指すURLを指定できます。P2P対応サイトでは、この後にrel=alternate属性を使用した追加のP2P URLリンクを記載する必要があります。

HTMLページへのリンクを読み込む際には、クライアントは優先すべきURLスキームを持つLink要素を検出し、そこから読み込みを再開するよう設計すべきです。

Webfinger

HTMLリンクと同様に、公開サイトではJRDドキュメント内のlinksセクションにおいて、HTTP版に続いて自身のAP ActorのP2P URLを追加記載する必要があります。これらのリンクには"type": "application/activity+json""rel": "self"を指定し、href属性にP2P URLを設定しなければなりません。実装上の不具合を防ぐため、HTTPバージョンの後に配置するよう注意してください。

@username@domain.com形式のようなWebfingerスタイルの言及からユーザーを解決する際には、まず標準的な方法でHTTP経由でWebfingerデータを解決すべきです。その後、linksフィールドを検索して"type": "application/activity+json""rel": "self"を持ち、かつhref属性がP2P URLを指すオブジェクトを探します。

APオブジェクト内のURLリンク

FEP-fffdはコンテンツの代替バージョンを参照するための基盤を確立しました。P2Pクライアントはこの仕様を拡張し、HTTP経由で提供される全てのAPオブジェクトに対してP2P版へのリンクを追加する必要があります。ただし、P2Pオブジェクトのid属性には対応するP2P URLを設定する必要があり、必ず元のHTTPデータバージョンへのリンクも含まなければなりません。ほとんどのAP実装でこれらのリンクが処理される仕組み上、P2P解決機能を持たない実装で読み込みエラーが発生しないよう、HTTPリンクはURLリストの先頭に配置してください。

ActivityPubオブジェクト(Actor、Note、Collectionなど)に関連するJSON-LDファイルを読み込む際には、クライアントはurlフィールドをチェックし、type: Linkかつrel: Alternateで、hrefプロパティがサポート対象のP2Pプロトコルを使用するURLを指すオブジェクトを検出する必要があります。

ゲートウェイ機能

独自のHTTPサーバーを構築したくないアカウントの場合、HTTPゲートウェイを利用することができます。この場合、P2Pサイトは自身のサブドメイン上でゲートウェイ経由で読み込めるように設定します(例:ipfs.io)。その後、このドメインをデータのHTTPバージョン用ルートとして使用します。P2PオブジェクトからはHTTP URLへのリンクを記載し、その逆も同様とします。

実装事例

ActorのHTTP版

{
  "@context": ["https://www.w3.org/ns/activitystreams", { "@language": "en- CA" }],
  "type": "Person",
  "id": "https://staticpub.mauve.moe/about.html",
  "url": [{
    "type": "Link",
    "rel": "alternate",
    "mediaType": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
    "href": "ipns://staticpub.mauve.moe/about-ipns.jsonld"
  }],
  "outbox": "https://staticpub.mauve.moe/outbox.jsonld",
  "inbox": "https://social.distributed.press/v1/@mauve@staticpub.mauve.moe/inbox",
  "following": "https://staticpub.mauve.moe/following.jsonld",
  "followers": "https://staticpub.mauve.moe/followers.jsonld",
  "preferredUsername": "mauve",
  "name": "Mauve 👁️",
  "summary": "これはサンプル静的サイトのプロフィールです。ソースコードは https://github.com/RangerMauve/staticpub.mauve.moe/ で公開しています",
  "icon": [{
    "type": "Image",
    "mediaType": "image/png",
    "name": "Distributed Pressロゴ",
    "url": "https://staticpub.mauve.moe/profile.png"
  }]
}

ActorのIPNS版:

{
  "@context": ["https://www.w3.org/ns/activitystreams", { "@language": "en- CA" }],
  "type": "Person",
  "id": "ipns://staticpub.mauve.moe/about-ipns.jsonld",
  "url": [{
    "type": "Link",
    "rel": "alternate",
    "mediaType": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"",
    "href": "https://staticpub.mauve.moe/about.jsonld"
  }],
  "outbox": "ipns://staticpub.mauve.moe/outbox-ipns.jsonld",
  "inbox": "https://social.distributed.press/v1/@mauve@staticpub.mauve.moe/inbox",
  "following": "ipns://staticpub.mauve.moe/following-ipns.jsonld",
  "followers": "ipns://staticpub.mauve.moe/followers-ipns.jsonld",
  "preferredUsername": "mauve",
  "name": "Mauve 👁️",
  "summary": "これはサンプル静的サイトのプロフィールです。ソースコードは https://github.com/RangerMauve/staticpub.mauve.moe/ で公開しています",
  "icon": [{
    "type": "Image",
    "mediaType": "image/png",
    "name": "Distributed Pressロゴ",
    "url": "ipns://staticpub.mauve.moe/profile.png"
  }]
}

Webfingerドキュメント

{  
  "subject": "acct:mauve@staticpub.mauve.moe",
  "aliases": [
  ],
  "links": [
    {
      "rel": "http://webfinger.net/rel/profile-page",
      "type": "text/html",
      "href": "https://staticpub.mauve.moe/about.html"
    },
    {
      "rel": "self",
      "type": "application/activity+json",
      "href": "https://staticpub.mauve.moe/about.jsonld"
    },
    {
      "rel": "self",
      "type": "application/activity+json",
      "href": "ipns://staticpub.mauve.moe/about-ipns.jsonld"
    }
  ]
}

参考文献

  • Christine Lemmer Webber, Jessica Tallon, ActivityPub, 2018
  • Alyssa P. Hacker, サンプル提案書, 2020
  • [staticpub.mauve.moe][staticpub.mauve.moe]
  • [HTML Linkタグに関する議論][html-link-discussions]

著作権

CC0 1.0 Universal(パブリックドメイン献呈)

法律で認められる範囲内において、本Fediverse拡張提案の著者らはこの著作物に関するすべての著作権および関連権利を放棄しています。