- Le protocole AT est le protocole qui sert de base aux réseaux sociaux décentralisés, et toutes les données y sont identifiées par des URI
at://
- Un URI
at:// désigne comme autorité le créateur des données (l’utilisateur), et il faut déterminer séparément l’emplacement où ces données sont effectivement hébergées
- La procédure de résolution d’un URI suit cet ordre : convertir le handle en identité (DID), identifier le serveur d’hébergement via la consultation du document DID, puis demander les données JSON à ce serveur
- Deux types de DID sont pris en charge (
did:web, did:plc), avec des avantages, inconvénients et modes de conservation des données différents
- Cette approche met en avant le fait que la propriété des données appartient à l’utilisateur et garantit une persistance du lien même si le handle ou l’hébergement changent
Protocole AT, URI at:// et processus de résolution de l’identité des données sociales
# Structure de base du protocole AT et des URI at://
- Le protocole AT permet à plusieurs serveurs distribués de communiquer selon un standard donné, et l’ensemble est appelé l’« atmosphere »
- Chaque donnée dans l’atmosphere reçoit un URI unique commençant par
at://, qui joue en quelque sorte le rôle d’un lien vers des données JSON
- Contrairement à la structure traditionnelle des URI, dans le protocole AT, c’est le créateur des données (l’utilisateur) qui est défini comme autorité de l’URI
- Par exemple, dans la forme
at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z, ruuuuu.de indique le propriétaire de ces données
- Le serveur physique où les données sont réellement hébergées n’est pas inclus directement dans l’URI, et il faut une procédure de résolution supplémentaire pour le trouver
# Les trois étapes de résolution d’un URI at://
- Pour faire correspondre un URI
at:// à des données réelles (JSON), trois étapes sont nécessaires
- Convertir le handle (
ruuuuu.de, etc.) en identité (DID: Decentralized Identifier)
- Le handle est un alias servant à identifier l’utilisateur et peut changer
- Il doit être converti en DID, un identifiant global immuable
- Méthodes de conversion :
- Déterminer les informations d’hébergement des données via la consultation du document DID (DID Document)
- Le document DID contient notamment la clé publique de cette identité et les service endpoints (serveurs)
- Dans le cas de
did:web:~, l’accès est basé sur le domaine (https://domaine/.well-known/did.json)
- Dans le cas de
did:plc:~, la consultation se fait via le répertoire PLC (https://plc.directory/DID)
- Le service endpoint (
serviceEndpoint) est le serveur réel d’hébergement des données
- Demander les données JSON via l’API du serveur d’hébergement
- Transmettre les différentes parties de
at:// comme paramètres à l’endpoint com.atproto.repo.getRecord pour demander les données
- Le JSON renvoyé correspond aux données réelles associées à l’URI
at://
# Explication du processus à travers un exemple
- Exemple :
at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z
- Même si le handle change, l’utilisation d’un URI
at:// basé sur le DID (permalink) maintient le lien entre le compte et les données
# Différences entre did:web et did:plc
did:web:
- Permet de gérer et de vérifier son propre domaine
- Si l’on perd le contrôle du domaine, on peut aussi perdre l’identifiant dans son ensemble
did:plc:
- C’est le PLC (Public Ledger of Credentials) qui opère l’identifiant
- Il n’est pas rattaché à un domaine, mais un contrôle limité reste possible, par exemple si l’opérateur du PLC refuse des mises à jour
- Tout l’historique des modifications peut être vérifié et tracé via des hashes
# Séparation entre identité, hébergement et données, et persistance
at:// sépare l’identité et l’hébergement des données, ce qui permet la portabilité des données utilisateur et la création de liens permanents
- Le handle (surnom) peut être modifié à tout moment, et le serveur d’hébergement peut lui aussi être changé
- Le DID (identité) est immuable, et l’URI
at:// fondé dessus peut servir de permalink persistant
- Le document DID contient à la fois la preuve de possession du handle, les clés de vérification de signature et les informations d’hébergement, garantissant fiabilité et flexibilité
# Applications concrètes et mention du développement
- En pratique, la majorité des applications basées sur AT reçoivent les données via WebSocket ou d’autres mécanismes push, puis les agrègent dans leur propre base de données interne
- Malgré cela, bien maîtriser la résolution des URI
at:// reste indispensable pour comprendre les caractéristiques du réseau et assurer la portabilité des données
- Le système
at:// fournit une abstraction de réseau social au-dessus de HTTP, DNS et JSON, et implémente techniquement le fait que la propriété des données appartient à l’utilisateur
# Conclusion
- Le protocole AT et les URI
at:// font progresser techniquement l’identité, la connectivité et la persistance des données sociales
- Les développeurs doivent maîtriser le workflow central : résolution des handles, usage des DID, structure des documents DID et méthodes de requête des données réelles
- Grâce à cette architecture, il devient possible d’obtenir souplesse et propriété sur ses contenus, son identité et leur lieu d’hébergement
1 commentaires
Avis Hacker News
Inspiré par des articles récents sur ATProto, j’ai essayé de m’inscrire sur bsky, mais je n’y vois qu’un flot sans fin de politique américaine. Même en cliquant sans arrêt sur « voir moins de ce genre de posts », ça n’a presque aucun effet. Je me demande si c’est simplement la nature de cette plateforme. Devoir subir en permanence des avis prévisibles sur des polémiques étrangères un peu absurdes, ce n’est pas terrible mentalement.
Je ne sais toujours pas si ce projet résout réellement de manière significative les problèmes d’identité et de propriété des données. Côté identité, tout se résume à utiliser son propre domaine ou celui de quelqu’un d’autre (Bluesky, etc.). Comme la plupart des gens n’ont pas de domaine, leur identité finit de fait chez un tiers. Pour les données, c’est pareil : si votre compte est bloqué sur Bluesky ou sur un autre serveur, le stockage est fermé et vous perdez même l’occasion de déplacer vos données ailleurs. C’est exactement comme l’e-mail : sans votre propre domaine et votre propre serveur, vous ne contrôlez concrètement rien.
Les explications de Dan sont toujours excellentes, et elles tombent à pic avec les récentes nouvelles sur le transfert du contrôle du PLC par Bluesky. Notre équipe a choisi le même système DID chez fair.pm pour distribuer de manière décentralisée des plugins WordPress — en gros, une gestion de paquets façon App Store. L’équipe de Bluesky, surtout Bryan, nous a beaucoup aidés, et nous avons même obtenu la prise en charge des clés Ed25519 pour pouvoir utiliser libsodium. Notre protocole est en cours de conception sur la base des DID et de la modération empilable de Bluesky, mais nous n’utilisons pas directement atproto. Le point important, c’est que les DID sont un standard du W3C, donc le PLC n’est pas lié à atproto.
Pour résoudre un at://, il faut envoyer une requête GET à plc.directory, et c’est à ce moment-là que le système semble redevenir un modèle 100 % centralisé. J’aurais au moins aimé qu’on puisse séparer du protocole plusieurs répertoires de confiance, un peu comme les racines DNS ou les autorités de certification.
Tous les serveurs qui stockent des liens at:// devront finalement passer par DNS/HTTPS pour trouver la représentation canonique (permalink). Si DNSSEC n’est pas correctement mis en place, toute cette architecture me semble un peu fragile. Je n’y ai pas encore réfléchi en profondeur, mais ma crainte immédiate serait qu’avec un problème de type empoisonnement DNS, un attaquant puisse publier des messages en mon nom, puisque la clé publique figure dans le DID récupéré depuis le DNS.
L’article ne donne pas assez d’informations sur les clés utilisées dans l’historique de modifications du DID. Par exemple, si je suis foobar.bsky.social, je ne me souviens pas avoir moi-même téléversé une clé, ni avoir reçu une consigne pour en télécharger une. Je me demande où se trouve exactement cette clé, qui la possède, et comment et quand elle est utilisée. Et si le DID se trouve sur plc.directory, quel mécanisme empêche l’exploitant du site d’écraser arbitrairement mon DID pour voler mon identité ?
Le concept de at:// est intéressant. Mais je m’inquiète aussi des problèmes que peut poser dans la pratique un système fondé sur la propriété des données. Par exemple, si les utilisateurs possèdent leurs données, ils peuvent modifier ou supprimer le contenu à volonté. On peut publier un bon texte au départ, puis le réécrire de façon malveillante plus tard. Même si l’on conserve le hash des anciens messages pour empêcher ce genre d’altération, un nouveau service n’aura aucun moyen de connaître cet historique. Le suivi des likes ou des upvotes semble aussi difficile : si tout le monde stocke les objets chacun de son côté, retrouver qui a voté pour quoi n’a pas l’air simple. Et si quelqu’un crée de faux comptes pour ne pousser que ses propres contenus, il ne semble pas y avoir de vraie limite. Enfin, si un très grand nombre de comptes affluent depuis diverses plateformes, est-ce qu’il ne devient pas impossible de modérer le spam ou les activités malveillantes ? J’ai du mal à voir si, dans un modèle où chaque compte gère lui-même ses données, l’architecture du système tient vraiment pour la transparence, la responsabilité, la modération, l’anti-spam, etc.
Cela me donne un peu la même impression que de nombreux protocoles crypto qui parlent de décentralisation mais finissent malgré tout enfermés dans une seule plateforme.
Il y a une question structurelle : « comment trouve-t-on le JSON avec un URI at:// ? » Même en lisant la documentation, je n’arrive pas à voir pourquoi on a besoin de « ce JSON-là ». Personnellement, cette approche ne me parle pas.
Je me demande si le protocole joue un rôle comparable à un immense topic Kafka public. Par exemple, quand on crée une nouvelle web app, est-ce qu’on ne peut pas se passer de stocker soi-même les données, laisser chaque utilisateur les stocker dans son propre espace, puis placer un listener qui écoute le tout pendant que le protocole garantit la propagation des données, de sorte que l’app n’ait plus qu’à écouter et mettre en cache ? Conceptuellement, c’est fascinant, mais je me demande aussi si des concepts de Kafka comme les offsets pour ne pas rater les mises à jour, ou les partitions pour passer à l’échelle, s’appliquent ici.