ActivityPub , World Wide Web Konsorsiyumu tarafından standartlaştırılmış açık, dağıtılmış bir sosyal ağ protokolüdür. İlk versiyonu 2018 yılında yayınlandı, dolayısıyla yeni değil. Son zamanlarda Elon Musk'un Twitter'ı satın alması ve pek çok kişiyi memnun etmeyen değişiklikler yapmasıyla popülaritesinde önemli bir artış gören Mastodon da dahil olmak üzere birçok sosyal ağ tarafından kullanılıyor.
Ayrıca Tumblr ve Facebook'un Twitter'a alternatifi olan Threads de gelecekte protokole destek vereceklerinin sinyalini verdi. Yeni bir protokol olmamasına rağmen ActivityPub artık giderek daha popüler hale geliyor.
Avrupa Birliği ve Amerika Birleşik Devletleri uzun süredir büyük sosyal ağların pazar tekelinde olmasından endişe duyduğundan, gelecekte hükümetin baskısı altında Facebook ve Twitter gibi mevcut en büyük sosyal ağların da protokolü destekleyeceğini ve Fediverse'in bir parçası. (Fediverse, ActivityPub'ı destekleyen sağlayıcılardan oluşan bir sosyal ağlar evrenidir.)
Gelecekte Twitter veya Facebook'u seçmeyeceğimizi düşünüyorum çünkü onlar kapatılacak ve başka seçeneğimiz kalmayacak.
Her platformun gücü, gelen büyük miktarda veriyi filtrelemek, kullanıcılar için en önemli bilgileri elemek, seçmek ve özetlemek için daha iyi yapay zekaya sahip olanlardan gelecektir.
Tabi bunun için kullanıcıyı çok iyi tanımak gerekiyor ki bu da kullanıcının çıkarınadır. Buna karşılık yapay zeka çok daha alakalı reklamlar sağlayabilir.
Açık, erişilebilir bir sistemde rekabet artık sosyal ağlar arasında değil, yapay zeka tabanlı algoritmalar arasında olacak.
ActivityPub'ın nasıl çalıştığını görelim. Temel işlevsellik bu çok basit diyagramda güzel bir şekilde özetlenmiştir.
Protokolün iki ana bileşeni vardır: gelen kutusu ve giden kutusu. Bunlar, HTTP protokolü aracılığıyla erişilebilen iki API uç noktasıdır. Bir kullanıcı dış dünyayla bir şey iletişim kurmak istediğinde (örneğin, bir içerik yayınlamak), bunu giden kutusuna gönderir. Burada sistem, takipçilerin giden kutusunu okuyarak erişebilecekleri uygun bir listeye ekler.
Dış dünyadan biri kullanıcıya bir şey göndermek isterse (örneğin, yalnızca belirli kullanıcıların görebileceği, herkese açık olmayan bir gönderi), bunu gelen kutusuna şifreli biçimde gönderir. Gelen kutusu, gelen içeriğin toplandığı ve kullanıcının bu içeriğe erişebildiği bir e-posta gelen kutusu gibidir.
WebFinger protokolünü kullanarak gelen kutusunun ve giden kutusunun konumu alınabilir. Bu aynı zamanda protokolü denemek ve anlamak için süper bir araç olan ActivityPub Explorer'ın yardımıyla da test edilebilir.
ActivityPub'daki kullanıcı adı e-posta adresine benzer. Örneğin Mastodon kullanıcı adım @[email protected]. Bu, kullanıcı bilgilerimin dm.me sunucusunda thebojda adı altında saklandığı anlamına gelir.
ActivityPub Explorer'a girildiğinde, verileri almak için WebFinger protokolüne göre aşağıdaki URL'yi sorgulayacaktır:
https://me.dm/.well-known/webfinger?resource=acct:thebojda%40me.dm
Yanıt şuna benzeyen bir JSON nesnesidir:
{ "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}" } ] }
Buradan ActivityPub bilgilerine https://me.dm/users/thebojda URL adresinden ulaşılacağı belirlenebilir. Bunu ActivityPub Explorer'a girersek aşağıdaki JSON'u döndürecektir:
{ "@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" } }
Burada benimle ilgili kullanıcıya özel tüm bilgileri bulabilirsiniz, ancak en önemlisi burada gelen kutusu ve giden kutusu uç noktalarının URL'leri ve bana gönderilen mesajları şifrelemek için kullanılan genel anahtar bulunmaktadır. Giden kutusunun içeriğini sorgularken aşağıdaki JSON döndürülür:
{ "@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" }
Gönderiler sayfalara bölündüğü için burada ilk ve son sayfaların URL’lerini görebiliriz. İlk sayfanın URL'sine erişerek şu anda yalnızca bir tane olan girişlerimi görebiliriz.
{ "@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 "ars poetica": 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 "ars poetica": 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": [] } } } } ] }
Bu örneklere dayanarak, başkalarının herkese açık gönderilerini okuyabilen veya herkese açık gönderileri dış dünyaya yayınlayabilen minimal bir istemciyi uygulamak kolaydır. Burada tek tek JSON dosyalarının tam yapısına ve gelen kutusunun işleyişine girmeyeceğim.
Bunlar ActivityPub belgelerinde bulunabilir.
Görüldüğü gibi ActivityPub anlaşılması ve uygulanması kolay, nispeten basit bir standarttır. Tek zayıflığı, merkezi bir sunucu gerektiren HTTP protokolünü kullanmasıdır. Bu, Jack Dorsey'in (Twitter'ın kurucusu) favori projesi olan Nostr gibi alternatif protokollerin ortaya çıkmasına neden oldu.
Ancak buna gerek olmadığını ve bunun sosyal ağların daha da parçalanmasına neden olduğunu düşünüyorum. Bunun yerine, ActivityPub protokolü, Fediverse'in daha da açık ve merkezi olmayan bir yöne doğru gelişmesine olanak tanıyacak şekilde mevcut merkezi olmayan protokollere yönelik destekle genişletilmelidir. Aşağıda bunun nasıl başarılabileceğini göstereceğim.
Tanımlayıcı verileri ve yayınları merkezi olmayan hale getirmek için mükemmel bir çözüm, Swarm Feeds veya IPNS kullanmaktır (bu protokoller hakkında tam bir makalem var). Ethereum Swarm durumunda yayın tanımlayıcısı bir Swarm adresidir, IPNS durumunda ise genel anahtardır.
Bunları kullanan bir ActivityPub kullanıcısı şu şekilde görünecektir: {swarm adresi}@swarm veya {IPNS adresi}@IPNS. Kullanıcı açıklaması buradan sorgulanabilir.
Geriye dönük uyumluluk için, {swarm adresi}@gateway.ethswarm.org gibi ağ geçidi sunucuları da kullanılabilir; bu sunucular, kullanıcının Swarm'da depolanan açıklamasını Webfinger protokolü aracılığıyla döndürerek mevcut sistemlerin (Mastodon gibi) herhangi bir değişiklik yapmadan bu verileri okumasına olanak tanır. değişiklikler.
Giden kutusunun uygulanması aynı zamanda Swarm veya IPNS yayınları aracılığıyla da gerçekleştirilecektir. Geriye dönük uyumluluğu korumak için, Swarm feed'inin (bzz://...) veya IPNS (ipns://...) adresinin bulunacağı bir "decentralized_outbox" alanının tanıtılması gerekecektir.
Geriye dönük uyumluluğu korumak için, orijinal "giden kutusu" alanına ek bir ağ geçidi adresi eklenebilir, böylece mevcut istemciler bu akışları herhangi bir değişiklik olmadan okuyabilir.
Gelen kutusunun uygulanması birkaç yolla yapılabilir. Ethereum Swarm'ın PSS adında bir mesajlaşma sistemi vardır ancak Waku gibi başka alternatifler de vardır. Burada PSS veya Waku adresi "decentralized_inbox" alanına yerleştirilecek, orijinal gelen kutusu alanı ise bir ağ geçidi adresi içerecek.
Bu birkaç küçük uzantıyla ActivityPub, Nostr gibi yeni protokollerin tanıtılmasına gerek kalmadan tamamen merkezi olmayan ve "web3 uyumlu" hale getirilebilir.
Nostr'ın GitHub deposuna göre, yeni protokol ve aktarma sistemine olan ihtiyaç, kullanıcıların ActivityPub sunucuları tarafından potansiyel olarak sansürlenmesinden ve bir teşvik sisteminin bulunmamasından kaynaklanıyor. Ancak yukarıdaki eklenti ile bu sorun tamamen çözülmüştür.
Hem IPNS hem de Swarm sansüre dayanıklıdır ve Swarm aynı zamanda tam bir anonimlik sağlar. Ek olarak Swarm'ın kendi teşvik sistemi vardır, FileCoin ise IPNS için mevcuttur.
Geleceğin açıkça ActivityPub'a ait olduğuna inanıyorum ve geliştiricilerin, kapsamlı ve gerçekten birleşik bir Fediverse oluşturmak için yeni protokoller oluşturmak yerine ActivityPub'ı ilerletmeye ve geliştirmeye odaklanmaları gerektiğine inanıyorum.