paint-brush
Uma breve introdução ao ActivityPub: o futuro das redes sociaispor@thebojda
8,126 leituras
8,126 leituras

Uma breve introdução ao ActivityPub: o futuro das redes sociais

por Laszlo Fazekas10m2023/10/07
Read on Terminal Reader

Muito longo; Para ler

ActivityPub é um protocolo de rede social aberto e distribuído padronizado pela World Wide Web. Seu único ponto fraco é que utiliza o protocolo HTTP, que requer um servidor central. O protocolo ActivityPub deve ser ampliado com suporte para protocolos descentralizados já existentes, o que permitiria ao Fediverse evoluir para uma direção ainda mais aberta e descentralizada.
featured image - Uma breve introdução ao ActivityPub: o futuro das redes sociais
Laszlo Fazekas HackerNoon profile picture

ActivityPub é um protocolo de rede social aberto e distribuído padronizado pelo World Wide Web Consortium. Sua primeira versão foi lançada em 2018, portanto não é nova. Ele é usado por diversas redes sociais, incluindo o Mastodon , que recentemente teve um aumento significativo de popularidade quando Elon Musk comprou o Twitter e fez mudanças que não agradaram a muitos.


Além disso, o Tumblr e a alternativa do Facebook ao Twitter, Threads, também sinalizaram que apoiarão o protocolo no futuro. Apesar de não ser um protocolo novo, o ActivityPub está se tornando cada vez mais popular.


Dado que a União Europeia e os Estados Unidos há muito que se preocupam com o monopólio de mercado das grandes redes sociais, posso imaginar que no futuro, sob pressão governamental, as maiores redes sociais existentes, como o Facebook e o Twitter, também apoiarão o protocolo e tornar-se-ão parte do Fediverse . (O Fediverse é um universo de redes sociais composto por provedores que apoiam o ActivityPub.)


Acredito que no futuro não escolheremos o Twitter ou o Facebook porque eles estarão fechados e não teremos outra escolha.


A força de cada plataforma virá de quem tiver melhor inteligência artificial para filtrar a enorme quantidade de dados recebidos, para filtrar, selecionar e resumir as informações mais importantes para os usuários.


Claro que para isso é preciso conhecer muito bem o usuário, o que também é do interesse do usuário. Em troca, a inteligência artificial pode fornecer anúncios muito mais relevantes.


Num sistema aberto e acessível, a competição não será mais entre redes sociais, mas entre algoritmos baseados em inteligência artificial.


Vamos ver como funciona o ActivityPub. A funcionalidade básica é bem resumida por este diagrama muito simples.

AtividadePub explicada


Fonte: https://activitypub.rocks/



O protocolo possui dois componentes principais: a caixa de entrada e a caixa de saída. Esses são dois endpoints de API que podem ser acessados por meio do protocolo HTTP. Quando um usuário deseja comunicar algo com o mundo exterior (por exemplo, postar algum conteúdo), ele envia para a caixa de saída. Aqui, o sistema o adiciona a uma lista apropriada, que os seguidores podem acessar lendo a caixa de saída.


Se alguém do mundo exterior quiser enviar algo ao usuário (por exemplo, uma postagem não pública que só pode ser vista por determinados usuários), ele a envia para a caixa de entrada de forma criptografada. A caixa de entrada é como uma caixa de entrada de e-mail, onde o conteúdo recebido é coletado e onde o usuário pode acessá-lo.


Pode-se recuperar a localização da caixa de entrada e saída usando o protocolo WebFinger. Isso também pode ser testado com a ajuda do ActivityPub Explorer , uma super ferramenta para experimentar e entender o protocolo.


Um nome de usuário no ActivityPub é semelhante a um endereço de e-mail. Por exemplo, meu nome de usuário Mastodon é @[email protected]. Isso significa que minhas informações de usuário são armazenadas no servidor dm.me com o nome thebojda.


Quando inserido no ActivityPub Explorer, ele consultará o seguinte URL de acordo com o protocolo WebFinger para recuperar os dados:


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


A resposta é um objeto JSON parecido com este:


 { "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}" } ] }


Pode ser determinado a partir daqui que as informações do ActivityPub estarão acessíveis no URL https://me.dm/users/thebojda . Se inserirmos isso no ActivityPub Explorer, ele retornará o seguinte 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" } }


Aqui, você pode encontrar todas as informações específicas do usuário sobre mim, mas o mais importante, aqui estão os URLs dos terminais da caixa de entrada e da caixa de saída, bem como a chave pública para criptografar as mensagens enviadas para mim. Ao consultar o conteúdo da caixa de saída, o seguinte JSON é retornado:


 { "@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" }


Como os posts são divididos em páginas, aqui podemos ver as URLs da primeira e da última página. Acessando a URL da primeira página, podemos visualizar minhas entradas, das quais atualmente existe apenas uma.


 { "@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": [] } } } } ] }


Com base nesses exemplos, é fácil implementar um cliente mínimo que possa ler as postagens públicas de outras pessoas ou publicar postagens públicas para o mundo exterior. Não entrarei na estrutura exata dos arquivos JSON individuais e no funcionamento da caixa de entrada aqui.


Eles podem ser encontrados na documentação do ActivityPub .


Como pode ser visto, ActivityPub é um padrão relativamente simples, fácil de entender e implementar. Seu único ponto fraco é que utiliza o protocolo HTTP, que requer um servidor central. Isto deu origem a protocolos alternativos como o Nostr, que é o projeto favorito de Jack Dorsey (o fundador do Twitter).


No entanto, creio que não há necessidade disso e que apenas provoca uma maior fragmentação das redes sociais. Em vez disso, o protocolo ActivityPub deve ser alargado com apoio aos protocolos descentralizados já existentes, o que permitiria ao Fediverse desenvolver-se numa direcção ainda mais aberta e descentralizada. A seguir, demonstrarei como isso pode ser alcançado.


Uma solução perfeita para descentralizar dados descritivos e feeds é usar Swarm Feeds ou IPNS (tenho um artigo completo sobre esses protocolos). No caso do Ethereum Swarm, o identificador do feed é um endereço do Swarm, enquanto no caso do IPNS é uma chave pública.


Usando-os, um usuário do ActivityPub ficaria assim: {endereço do enxame}@swarm ou {endereço IPNS}@IPNS. A descrição do usuário pode ser consultada aqui.


Para compatibilidade com versões anteriores, servidores gateway também poderiam ser usados, como {swarm address}@gateway.ethswarm.org, que retornaria a descrição do usuário armazenada no Swarm através do protocolo Webfinger, permitindo que sistemas existentes (como Mastodon) lessem esses dados sem qualquer modificações.


A implementação da caixa de saída também seria feita através de feeds Swarm ou IPNS. Para manter a compatibilidade com versões anteriores, seria necessário introduzir um campo "decentralized_outbox", onde seria localizado um endereço Swarm feed (bzz://...) ou IPNS (ipns://...).


Para manter a compatibilidade com versões anteriores, um endereço de gateway adicional pode ser incluído no campo "caixa de saída" original para que os clientes existentes possam ler esses feeds sem quaisquer alterações.


A implementação de uma caixa de entrada pode ser feita de diversas maneiras. O Ethereum Swarm possui um sistema de mensagens chamado PSS , mas também existem outras alternativas, como o Waku . Aqui, o endereço PSS ou Waku seria colocado em um campo “decentralized_inbox”, enquanto o campo da caixa de entrada original conteria um endereço de gateway.


Com essas pequenas extensões, o ActivityPub pode se tornar completamente descentralizado e “compatível com web3”, sem a necessidade de introdução de novos protocolos como o Nostr.


De acordo com o repositório GitHub da Nostr, a necessidade do novo protocolo e sistema de retransmissão se deve à potencial censura dos usuários pelos servidores ActivityPub e à falta de um sistema de incentivos. No entanto, este problema é completamente resolvido pela extensão acima.


Tanto o IPNS quanto o Swarm são resistentes à censura, e o Swarm também oferece anonimato completo. Além disso, o Swarm possui seu próprio sistema de incentivos, enquanto o FileCoin está disponível para IPNS.


Acredito que o futuro pertence claramente ao ActivityPub, e os desenvolvedores devem se concentrar no avanço e na evolução do ActivityPub em vez de criar novos protocolos, a fim de finalmente estabelecer um Fediverse abrangente e verdadeiramente unificado.