প্রোটোকলের দুটি প্রধান উপাদান রয়েছে: ইনবক্স এবং আউটবক্স। এই দুটি API এন্ডপয়েন্ট যা HTTP প্রোটোকলের মাধ্যমে অ্যাক্সেস করা যেতে পারে। যখন একজন ব্যবহারকারী বাইরের বিশ্বের সাথে কিছু যোগাযোগ করতে চান (যেমন, কিছু বিষয়বস্তু পোস্ট করুন), তারা এটি আউটবক্সে পাঠায়। এখানে, সিস্টেম এটিকে একটি উপযুক্ত তালিকায় যুক্ত করে, যা অনুসরণকারীরা আউটবক্স পড়ে অ্যাক্সেস করতে পারে।
ActivityPub-এ একটি ব্যবহারকারীর নাম একটি ইমেল ঠিকানার মতো। উদাহরণস্বরূপ, আমার মাস্টোডন ব্যবহারকারীর নাম হল @[email protected]। এর মানে হল যে আমার ব্যবহারকারীর তথ্য dm.me সার্ভারে thebojda নামে সংরক্ষিত আছে।
//me.dm/.well-known/webfinger?resource=acct:thebojda%40me.dm
{ "subject":"acct:[email protected]", "aliases":[ "//me.dm/@thebojda", "//me.dm/users/thebojda" ], "links":[ { "rel":"//webfinger.net/rel/profile-page", "type":"text/html", "href":"//me.dm/@thebojda" }, { "rel":"self", "type":"application/activity+json", "href":"//me.dm/users/thebojda" }, { "rel":"//ostatus.org/schema/1.0/subscribe", "template":"//me.dm/authorize_interaction?uri={uri}" } ] }
{ "@context": [ "//www.w3.org/ns/activitystreams", "//w3id.org/security/v1", { "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", "toot": "//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": "//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": "//me.dm/users/thebojda", "type": "Person", "following": "//me.dm/users/thebojda/following", "followers": "//me.dm/users/thebojda/followers", "inbox": "//me.dm/users/thebojda/inbox", "outbox": "//me.dm/users/thebojda/outbox", "featured": "//me.dm/users/thebojda/collections/featured", "featuredTags": "//me.dm/users/thebojda/collections/tags", "preferredUsername": "thebojda", "name": "Laszlo Fazekas", "summary": "<p>Software developer, contributing writer</p>", "url": "//me.dm/@thebojda", "manuallyApprovesFollowers": false, "discoverable": false, "published": "2024-03-02T00:00:00Z", "devices": "//me.dm/users/thebojda/collections/devices", "publicKey": { "id": "//me.dm/users/thebojda#main-key", "owner": "//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": "//me.dm/inbox" }, "icon": { "type": "Image", "mediaType": "image/jpeg", "url": "//media.me.dm/accounts/avatars/109/955/144/019/799/820/original/fe8e930e0f1467ac.jpeg" } }
{ "@context": "//www.w3.org/ns/activitystreams", "id": "//me.dm/users/thebojda/outbox", "type": "OrderedCollection", "totalItems": 1, "first": "//me.dm/users/thebojda/outbox?page=true", "last": "//me.dm/users/thebojda/outbox?min_id=0&page=true" }
{ "@context": [ "//www.w3.org/ns/activitystreams", { "ostatus": "//ostatus.org#", "atomUri": "ostatus:atomUri", "inReplyToAtomUri": "ostatus:inReplyToAtomUri", "conversation": "ostatus:conversation", "sensitive": "as:sensitive", "toot": "//joinmastodon.org/ns#", "votersCount": "toot:votersCount" } ], "id": "//me.dm/users/thebojda/outbox?page=true", "type": "OrderedCollectionPage", "prev": "//me.dm/users/thebojda/outbox?min_id=5562038&page=true", "partOf": "//me.dm/users/thebojda/outbox", "orderedItems": [ { "id": "//me.dm/users/thebojda/statuses/5562038/activity", "type": "Create", "actor": "//me.dm/users/thebojda", "published": "2024-03-02T18:47:47Z", "to": [ "//www.w3.org/ns/activitystreams#Public" ], "cc": [ "//me.dm/users/thebojda/followers" ], "object": { "id": "//me.dm/users/thebojda/statuses/5562038", "type": "Note", "summary": null, "inReplyTo": null, "published": "2024-03-02T18:47:47Z", "url": "//me.dm/@thebojda/5562038", "attributedTo": "//me.dm/users/thebojda", "to": [ "//www.w3.org/ns/activitystreams#Public" ], "cc": [ "//me.dm/users/thebojda/followers" ], "sensitive": false, "atomUri": "//me.dm/users/thebojda/statuses/5562038", "inReplyToAtomUri": null, "conversation": "tag:me.dm,2024-03-02:objectId=1406005:objectType=Conversation", "content": "<p>My "ars poetica": How to Change the World?! Pocket Guide for People With a Messiah Complex <a href=\"//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\">//</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 "ars poetica": How to Change the World?! Pocket Guide for People With a Messiah Complex <a href=\"//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\">//</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": "//me.dm/users/thebojda/statuses/5562038/replies", "type": "Collection", "first": { "type": "CollectionPage", "next": "//me.dm/users/thebojda/statuses/5562038/replies?only_other_accounts=true&page=true", "partOf": "//me.dm/users/thebojda/statuses/5562038/replies", "items": [] } } } } ] }
দেখা যায়, ActivityPub একটি অপেক্ষাকৃত সহজ মান যা বোঝা এবং প্রয়োগ করা সহজ। এর একমাত্র দুর্বলতা হল এটি HTTP প্রোটোকল ব্যবহার করে, যার জন্য একটি কেন্দ্রীয় সার্ভার প্রয়োজন। এটি নস্ট্রের মতো বিকল্প প্রোটোকলের জন্ম দিয়েছে, যা জ্যাক ডরসির (টুইটারের প্রতিষ্ঠাতা) প্রিয় প্রকল্প।
বর্ণনামূলক ডেটা এবং ফিডগুলিকে বিকেন্দ্রীকরণের জন্য একটি নিখুঁত সমাধান হল বা ব্যবহার করা (এই প্রোটোকলগুলি সম্পর্কে আমার একটি সম্পূর্ণ নিবন্ধ রয়েছে)। Ethereum Swarm এর ক্ষেত্রে, ফিড শনাক্তকারী একটি Swarm ঠিকানা, IPNS এর ক্ষেত্রে, এটি একটি সর্বজনীন কী।
এই কয়েকটি ছোট এক্সটেনশনের সাহায্যে, Nostr-এর মতো নতুন প্রোটোকল প্রবর্তনের প্রয়োজন ছাড়াই ActivityPub সম্পূর্ণ বিকেন্দ্রীকৃত এবং "web3 সামঞ্জস্যপূর্ণ" করা যেতে পারে।