paint-brush
ActivityPub の簡単な紹介: ソーシャル ネットワークの未来@thebojda
9,213 測定値
9,213 測定値

ActivityPub の簡単な紹介: ソーシャル ネットワークの未来

Laszlo Fazekas10m2023/10/07
Read on Terminal Reader

長すぎる; 読むには

ActivityPub は、World Wide Web によって標準化されたオープンな分散型ソーシャル ネットワーク プロトコルです。唯一の弱点は、中央サーバーを必要とする HTTP プロトコルを使用していることです。 ActivityPub プロトコルは、既存の分散型プロトコルをサポートして拡張されるべきであり、これにより、Fediverse がさらにオープンで分散型の方向に向かって開発できるようになります。
featured image - ActivityPub の簡単な紹介: ソーシャル ネットワークの未来
Laszlo Fazekas HackerNoon profile picture

ActivityPubは、World Wide Web Consortium によって標準化されたオープンな分散型ソーシャル ネットワーク プロトコルです。最初のバージョンは 2018 年にリリースされたため、新しいものではありません。これは、イーロン・マスクが Twitter を買収し、多くの人を喜ばせない変更を行ったときに最近人気が大幅に高まったMastodonを含む、いくつかのソーシャル ネットワークで使用されています。


さらに、Tumblr と Facebook の Twitter に代わるサービスである Threads も、将来的にこのプロトコルをサポートする予定であることを示唆しています。新しいプロトコルではないにもかかわらず、ActivityPub は現在ますます人気が高まっています。


欧州連合と米国は長い間、大規模なソーシャルネットワークの市場独占を懸念してきたため、将来的には政府の圧力を受けて、FacebookやTwitterなどの既存の最大規模のソーシャルネットワークもこのプロトコルをサポートし、フェディバースの一部。 (Fediverse は、ActivityPub をサポートするプロバイダーで構成されるソーシャル ネットワークの世界です。)


今後は、TwitterやFacebookが閉鎖されて他に選択肢がないからという理由で選ぶことはなくなると思います。


各プラットフォームの強みは、受信する大量のデータをフィルタリングし、ユーザーにとって最も重要な情報を選別し、選択し、要約するためのより優れた人工知能をどちらが持つかによって決まります。


もちろん、これを行うにはユーザーをよく知る必要があり、それはユーザーの利益にもなります。その代わりに、人工知能はより関連性の高い広告を提供できるようになります。


オープンでアクセス可能なシステムでは、競争はソーシャル ネットワーク間ではなく、人工知能ベースのアルゴリズム間で行われます。


ActivityPub がどのように機能するかを見てみましょう。基本的な機能は、この非常に単純な図にうまくまとめられています。

アクティビティパブの説明


出典: https://activitypub.rocks/



このプロトコルには、受信ボックスと送信ボックスという 2 つの主要コンポーネントがあります。これらは、HTTP プロトコルを通じてアクセスできる 2 つの API エンドポイントです。ユーザーが外部と何かを通信したい場合 (コンテンツの投稿など)、それを送信ボックスに送信します。ここで、システムはそれを適切なリストに追加し、フォロワーは送信トレイを読み取ることでアクセスできます。


外部の誰かがユーザーに何かを送信したい場合 (特定のユーザーのみが閲覧できる非公開の投稿など)、暗号化された形式で受信箱に送信します。受信箱は電子メールの受信箱に似ており、受信したコンテンツが収集され、ユーザーはそこにアクセスできます。


WebFinger プロトコルを使用して、受信箱と送信箱の場所を取得できます。これは、プロトコルを実験して理解するためのスーパー ツールであるActivityPub Explorer を使用してテストすることもできます。


ActivityPub のユーザー名は電子メール アドレスに似ています。たとえば、私のマストドンのユーザー名は @[email protected] です。これは、私のユーザー情報が dm.me サーバーに thebojda という名前で保存されていることを意味します。


ActivityPub Explorer に入ると、WebFinger プロトコルに従って次の URL をクエリしてデータを取得します。


 https://me.dm/.well-known/webfinger?resource=acct:thebojda%40me.dm


応答は次のような JSON オブジェクトです。


 { "subject":"acct:[email protected]", "aliases":[ "https://me.dm/@thebojda", "https://me.dm/users/thebojda" ], "links":[ { "rel":"http://webfinger.net/rel/profile-page", "type":"text/html", "href":"https://me.dm/@thebojda" }, { "rel":"self", "type":"application/activity+json", "href":"https://me.dm/users/thebojda" }, { "rel":"http://ostatus.org/schema/1.0/subscribe", "template":"https://me.dm/authorize_interaction?uri={uri}" } ] }


ここから、ActivityPub 情報がhttps://me.dm/users/thebojda URL でアクセス可能であることがわかります。これを ActivityPub Explorer に入力すると、次の JSON が返されます。


 { "@context": [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", { "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", "toot": "http://joinmastodon.org/ns#", "featured": { "@id": "toot:featured", "@type": "@id" }, "featuredTags": { "@id": "toot:featuredTags", "@type": "@id" }, "alsoKnownAs": { "@id": "as:alsoKnownAs", "@type": "@id" }, "movedTo": { "@id": "as:movedTo", "@type": "@id" }, "schema": "http://schema.org#", "PropertyValue": "schema:PropertyValue", "value": "schema:value", "discoverable": "toot:discoverable", "Device": "toot:Device", "Ed25519Signature": "toot:Ed25519Signature", "Ed25519Key": "toot:Ed25519Key", "Curve25519Key": "toot:Curve25519Key", "EncryptedMessage": "toot:EncryptedMessage", "publicKeyBase64": "toot:publicKeyBase64", "deviceId": "toot:deviceId", "claim": { "@type": "@id", "@id": "toot:claim" }, "fingerprintKey": { "@type": "@id", "@id": "toot:fingerprintKey" }, "identityKey": { "@type": "@id", "@id": "toot:identityKey" }, "devices": { "@type": "@id", "@id": "toot:devices" }, "messageFranking": "toot:messageFranking", "messageType": "toot:messageType", "cipherText": "toot:cipherText", "suspended": "toot:suspended", "focalPoint": { "@container": "@list", "@id": "toot:focalPoint" } } ], "id": "https://me.dm/users/thebojda", "type": "Person", "following": "https://me.dm/users/thebojda/following", "followers": "https://me.dm/users/thebojda/followers", "inbox": "https://me.dm/users/thebojda/inbox", "outbox": "https://me.dm/users/thebojda/outbox", "featured": "https://me.dm/users/thebojda/collections/featured", "featuredTags": "https://me.dm/users/thebojda/collections/tags", "preferredUsername": "thebojda", "name": "Laszlo Fazekas", "summary": "<p>Software developer, contributing writer</p>", "url": "https://me.dm/@thebojda", "manuallyApprovesFollowers": false, "discoverable": false, "published": "2023-03-02T00:00:00Z", "devices": "https://me.dm/users/thebojda/collections/devices", "publicKey": { "id": "https://me.dm/users/thebojda#main-key", "owner": "https://me.dm/users/thebojda", "publicKeyPem": "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxlvpgcOxBikiXfm9snZt EB3Y2BSnBW3s8nd1d4Z1wCzaNfa/woB6RDQJoQYEISbMpkEyWhDzI4jRDafpn5/j YiyyGka9U2KZHv1to0Ej9uVwUcQOnsq9iUtJGhOWCP27blKGTLKFEHtPL2Y4hp4Z kYzlh1x0aAyw8YC7/nbS8WDAeZNS7R3ET7Syhp3LKiCMmL1aCLSoOQJ5DdxVikMJ rJ9bzlUjxzCsm1aNBB0i269t4fD1evBO8QDhEAOnAZ6wLEV74j9SCjYMvKRV8z5i PQbhbKntXjn1XhbkIkj1D+yGRYYfnm1XyWTuaM4mDllvuOyqJ8GQVFADLc6KCQYz 7QIDAQAB -----END PUBLIC KEY----- " }, "tag": [], "endpoints": { "sharedInbox": "https://me.dm/inbox" }, "icon": { "type": "Image", "mediaType": "image/jpeg", "url": "https://media.me.dm/accounts/avatars/109/955/144/019/799/820/original/fe8e930e0f1467ac.jpeg" } }


ここでは、私に関するすべてのユーザー固有の情報を見つけることができますが、最も重要なのは、受信トレイと送信トレイのエンドポイントの URL と、私に送信されたメッセージを暗号化するための公開キーです。送信トレイの内容をクエリすると、次の JSON が返されます。


 { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://me.dm/users/thebojda/outbox", "type": "OrderedCollection", "totalItems": 1, "first": "https://me.dm/users/thebojda/outbox?page=true", "last": "https://me.dm/users/thebojda/outbox?min_id=0&page=true" }


投稿はページに分かれているため、ここでは最初と最後のページの URL を確認できます。最初のページの URL にアクセスすると、現在 1 件しかない私のエントリーが表示されます。


 { "@context": [ "https://www.w3.org/ns/activitystreams", { "ostatus": "http://ostatus.org#", "atomUri": "ostatus:atomUri", "inReplyToAtomUri": "ostatus:inReplyToAtomUri", "conversation": "ostatus:conversation", "sensitive": "as:sensitive", "toot": "http://joinmastodon.org/ns#", "votersCount": "toot:votersCount" } ], "id": "https://me.dm/users/thebojda/outbox?page=true", "type": "OrderedCollectionPage", "prev": "https://me.dm/users/thebojda/outbox?min_id=109955178005562038&page=true", "partOf": "https://me.dm/users/thebojda/outbox", "orderedItems": [ { "id": "https://me.dm/users/thebojda/statuses/109955178005562038/activity", "type": "Create", "actor": "https://me.dm/users/thebojda", "published": "2023-03-02T18:47:47Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://me.dm/users/thebojda/followers" ], "object": { "id": "https://me.dm/users/thebojda/statuses/109955178005562038", "type": "Note", "summary": null, "inReplyTo": null, "published": "2023-03-02T18:47:47Z", "url": "https://me.dm/@thebojda/109955178005562038", "attributedTo": "https://me.dm/users/thebojda", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://me.dm/users/thebojda/followers" ], "sensitive": false, "atomUri": "https://me.dm/users/thebojda/statuses/109955178005562038", "inReplyToAtomUri": null, "conversation": "tag:me.dm,2023-03-02:objectId=1406005:objectType=Conversation", "content": "<p>My &quot;ars poetica&quot;: How to Change the World?! Pocket Guide for People With a Messiah Complex <a href=\"https://medium.com/geekculture/how-to-change-the-world-pocket-guide-for-people-with-a-messiah-complex-dd2d16bb92a\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">medium.com/geekculture/how-to-</span><span class=\"invisible\">change-the-world-pocket-guide-for-people-with-a-messiah-complex-dd2d16bb92a</span></a></p>", "contentMap": { "en": "<p>My &quot;ars poetica&quot;: How to Change the World?! Pocket Guide for People With a Messiah Complex <a href=\"https://medium.com/geekculture/how-to-change-the-world-pocket-guide-for-people-with-a-messiah-complex-dd2d16bb92a\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span class=\"invisible\">https://</span><span class=\"ellipsis\">medium.com/geekculture/how-to-</span><span class=\"invisible\">change-the-world-pocket-guide-for-people-with-a-messiah-complex-dd2d16bb92a</span></a></p>" }, "attachment": [], "tag": [], "replies": { "id": "https://me.dm/users/thebojda/statuses/109955178005562038/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "https://me.dm/users/thebojda/statuses/109955178005562038/replies?only_other_accounts=true&page=true", "partOf": "https://me.dm/users/thebojda/statuses/109955178005562038/replies", "items": [] } } } } ] }


これらの例に基づいて、他人の公開投稿を読んだり、外部の世界に公開投稿を公開したりできる最小限のクライアントを実装するのは簡単です。ここでは、個々の JSON ファイルの正確な構造と受信トレイの機能については説明しません。


これらは、 ActivityPub ドキュメントに記載されています。


ご覧のとおり、ActivityPub は理解と実装が簡単な比較的単純な標準です。唯一の弱点は、中央サーバーを必要とする HTTP プロトコルを使用していることです。これにより、ジャック ドーシー (Twitter の創設者) のお気に入りのプロジェクトである Nostr などの代替プロトコルが誕生しました。


しかし、私はその必要はなく、ソーシャルネットワークのさらなる分断を引き起こすだけだと考えています。代わりに、ActivityPub プロトコルは、既存の分散型プロトコルのサポートによって拡張されるべきであり、これにより、Fediverse がさらにオープンで分散型の方向に向かって開発できるようになります。以下では、これをどのように実現できるかを説明します。


記述データとフィードを分散化するための完璧なソリューションの 1 つは、 Swarm FeedまたはIPNSを使用することです (これらのプロトコルに関する完全な記事があります)。 Ethereum Swarm の場合、フィード識別子は Swarm アドレスですが、IPNS の場合、フィード識別子は公開キーです。


これらを使用すると、ActivityPub ユーザーは次のようになります: {swarm アドレス}@swarm または {IPNS アドレス}@IPNS。ここからユーザーの説明を照会できます。


下位互換性を確保するために、{swarm アドレス}@gateway.ethswarm.org などのゲートウェイ サーバーを使用することもできます。これにより、Webfinger プロトコルを通じて Swarm に保存されているユーザーの説明が返され、既存のシステム (Mastodon など) がこのデータを何もせずに読み取ることができます。修正。


送信ボックスの実装は、Swarm または IPNS フィードを通じても行われます。下位互換性を維持するには、Swarm フィード (bzz://...) または IPNS (ipns://...) アドレスが配置される「decentralized_outbox」フィールドを導入する必要があります。


下位互換性を維持するために、既存のクライアントが変更せずにこれらのフィードを読み取れるように、追加のゲートウェイ アドレスを元の「送信ボックス」フィールドに含めることができます。


受信トレイの実装はいくつかの方法で行うことができます。 Ethereum Swarm にはPSSと呼ばれるメッセージング システムがありますが、 Wakuなどの他の代替手段もあります。ここで、PSS または Waku アドレスは「decentralized_inbox」フィールドに配置され、元の受信ボックス フィールドにはゲートウェイ アドレスが含まれます。


これらのいくつかの小さな拡張機能を使用すると、Nostr のような新しいプロトコルを導入する必要なく、ActivityPub を完全に分散化し、「web3 互換」にすることができます。


Nostr のGitHub リポジトリによると、新しいプロトコルと中継システムが必要なのは、ActivityPub サーバーによるユーザーの検閲の可能性とインセンティブ システムの欠如によるものです。しかし、この問題は上記の拡張機能によって完全に解決されます。


IPNS と Swarm は両方とも検閲に耐性があり、Swarm は完全な匿名性も提供します。さらに、Swarm には独自のインセンティブ システムがあり、IPNS には FileCoin が利用可能です。


私は、未来は明らかに ActivityPub に属しており、最終的に包括的で真に統一された Fediverse を確立するために、開発者は新しいプロトコルを作成するのではなく、ActivityPub の進歩と進化に集中する必要があると信じています。