Perl Hackers Hub

第59回 Fediverse入門―非中央集権型SNSサーバを作ろう!(1)

この記事を読むのに必要な時間:およそ 5.5 分

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは白方健太郎さんで,テーマは「実践Fediverse」です。

本稿のサンプルコードは,WEB+DB PRESS Vol.114のサポートサイトから入手できます。

Fediverse─⁠─非中央集権型ソーシャルネットワーク

2017年春に日本でブームとなったMastodonが構成するような非中央集権型ソーシャルネットワークは,Fediverseと呼ばれます。Fediverseは,中央に全体を制御するサーバがおらず,各サーバが連合と呼ばれるゆるいネットワークを構成することが特徴です。

本稿では,Fediverseに参加するために最小限実装する必要がある機能と,Perlにおける実装方法を説明します。

Fediverseを構成する仕様群

Fediverseは複数の仕様を組み合わせることで実現されています。本節では,それぞれの概要を紹介します。

ActivityPub─⁠─Fediverseを実現するための中心プロトコル

ActivityPubは,2018年1月にW3CWorld Wide Web Consortiumによって勧告された仕様で,非中央集権型ソーシャルネットワークを実現するプロトコルを定めています。ActivityPubではいわゆるユーザーのことをアクターと呼び,アクター間で次項で説明するActivity Streams 2.0(以下,AS2)形式のデータをHTTPSプロトコルでやりとりします。

ActivityPubでやりとりされるデータのMIMEMultipurpose Internet Mail Extensions型にはapplication/ld+json; profile="https://www.w3.org/ns/activitystreams"を使います。HTTPSリクエストのAcceptヘッダやレスポンスのContent-Typeヘッダには,このMIME型を指定します。

COLUMN ActivityPub仕様の読み方

ActivityPubサーバを作成するには当然ActivityPub仕様を読む必要が出てきますが,この仕様の読み方にはコツがあります。

ActivityPub仕様は大きく分けると,第1章と第2章の序論,第3章から第5章のデータモデルに続いて,第6章に「Client to Server Interactions⁠⁠,第7章に「Server to Server Interactions」があります。

Fediverseに参加するサーバの作成を目的としている場合,このうち第6章は読む必要がありません。第6章の仕様は,現在Mastodonなどが提供しているクライアント用REST APIを置き換えることを目的としたものです。Fediverseの連合プロトコルとは直接関係なく,この仕様を実装しているサーバもほとんどありません。連合プロトコルに関連するものというイメージを持って読むと混乱するので,第6章は読み飛ばして,連合プロトコルについて書かれている第7章を読み進めてください。

Activity Streams 2.0─⁠─ActivityPubのデータモデル

AS2は,2017年5月にW3Cによって勧告された仕様で,ソーシャルネットワークで使われるさまざまな語彙を,JSON-LDというJSONベースの仕様を利用して定めています。

AS2およびそのベースとなったJSON-LDは非常に大きな仕様ですが,Fediverseに参加するために必須の要素はその一部です。以下に,ActivityPubで使用される,AS2で表現されたオブジェクトの例を示します。

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://example.com/users/foobar#follow/1",
  "type": "Follow",
  "actor": "https://example.com/users/foobar",
  "object": "https://actub.ub32.org/argrath"
}

@context属性はJSON-LDに特有の属性で,XMLにおける名前空間とスキーマに相当するものです。AS2の名前空間はhttps://www.w3.org/ns/activitystreamsです。この属性には,配列を指定することで複数の名前空間の情報を1つのオブジェクトで利用することもできます。

id属性はネットワーク全体でユニークとなるURL形式の文字列,type属性はオブジェクトの型を示します。そのほかの属性はオブジェクトの型によって異なるので都度説明します。

HTTP Signatures─⁠─ActivityPub通信の検証プロトコル

ActivityPubでは,あるアクターからほかのアクターへの通知はHTTPSプロトコルのPOSTメソッドを使います。その際,アクターのなりすましを防ぐために,通知が正当なものであるかを検証する手法が必要です。

ActivityPubではどのような手法を用いるかは定めていませんが,Fediverseで現在主に使われているのは,IETFInternet Engineering Task ForceドラフトとなっているHTTP Signaturesです。HTTP Signaturesでは,各アクターは鍵ペアを持ちます。オブジェクトの送信時には秘密鍵を使ってリクエストに署名し,それをHTTPヘッダのSignatureフィールドに指定してリクエストを送信します。受信側は送信アクターの公開鍵を取得して署名を検証し,成功したもののみを正当なリクエストとして受け付けます。

COLUMN OStatus─⁠─ActivityPub以前のFediverse仕様

Fediverseの概念はActivityPubの勧告以前からあり,当初はOStatusと呼ばれる仕様群が使われていました。OStatusは,データモデルにAtom Activity Streams,購読および配信にPubSubHubbubといった仕様を集めたもので,2017年春に日本でMastodonが流行した時点ではMastodonはOStatusサーバでした。

しかし,OStatusは細かいプライバシー設定ができないなどの弱点があり,Mastodonは2017年11月に当時ドラフト版のActivityPubにも対応しました。その後,ほかのFediverseサーバもActivityPubに対応するようになりました。

それ以降もOStatusとActivityPubの両方に対応していたMastodonですが,2019年10月にOStatus対応を削除しました。したがって,現在Fediverse上で使われているプロトコルはほぼActivityPubだけになっています。みなさんが今後Fediverseに参加するサーバを作成する場合は,ActivityPubにだけ対応すればほぼ問題ありません。

著者プロフィール

白方健太郎(しらかたけんたろう)

株式会社モカ代表取締役。自称「さすらいのプログラマー」。Perl関連ではJapanized Perl Resources Projectなどで活動中。