2022년, 일론 머스크가 트위터를 인수했고, 이후 트위터는 X로 리브랜딩되었습니다. 이 이야기의 일부는 널리 알려져 있습니다. 그러나 플랫폼을 분산화하는 프로젝트가 트위터 내에서 구체화되고 있다는 사실을 아는 사람은 적습니다. BlueSky 라는 이름의 이 프로젝트는 2019년에 시작되었습니다. 2021년에는 Bluesky Social Benefit Corporation으로 분사되어 트위터에서 독립적으로 계속 운영될 수 있었습니다. 어떤 면에서 BlueSky는 X만큼이나 트위터의 후계자로 간주될 수 있습니다.
X는 수익성이 매우 높은 서비스로, 유료 검증 및 프리미엄 기능을 제공합니다. 반면 BlueSky는 Fediverse 와 유사한 개방형 프로토콜을 기반으로 구축된 완전히 개방된 시스템으로, 다수의 독립 노드로 구성되어 있습니다.
BlueSky 팀은 ActivityPub 표준에 만족하지 않았기 때문에 AT 프로토콜 이라는 자체 프로토콜을 개발했습니다.
프로토콜의 핵심 요소는 데이터베이스와 유사한 저장소입니다.여기에 게시물, 좋아요 및 기타 모든 데이터가 저장됩니다.모든 사용자(또는 모든 엔터티)는 저장소를 갖습니다.저장소에는 컬렉션(데이터베이스 테이블과 유사)이 포함되고 컬렉션에는 키-값 형식의 레코드가 포함됩니다.저장소는 IPFS 와 같은 데이터를 저장합니다.각 레코드에는 콘텐츠 기반 해시인 CID가 있습니다.사용자가 데이터베이스에서 무엇이든 수정하면 데이터에서 커밋 해시가 생성됩니다(Git 커밋과 유사).데이터베이스에서 단일 비트가 변경되더라도 새로운 커밋 해시가 생성됩니다.저장소 소유자는 모든 변경 후 이 커밋 해시에 디지털 서명하여 데이터베이스를 인증합니다.
이 솔루션의 장점은 모든 시스템에서 데이터의 진위 여부를 쉽게 검증할 수 있는 기능을 유지하면서 전체 저장소 또는 그 일부를 시스템 간에 자유롭게 전송할 수 있다는 것입니다.
사용자는 자신이 선택한 개인 데이터 서버(PDS)에 리포지토리를 호스팅할 수 있습니다. 이런 의미에서 PDS는 데이터베이스 서버처럼 기능합니다. 사용자는 PDS를 통해 리포지토리를 수정하고 다른 사람이 액세스할 수 있도록 할 수 있습니다. 이 외에도 PDS는 광범위한 추가 서비스를 제공합니다. 다른 사용자의 데이터에 액세스하고 피드를 검색하는 등의 작업을 할 수 있습니다. 기본적으로 PDS는 완벽하게 기능하는 소셜 미디어 노드 역할을 하여 사용자가 네트워크에 연결할 수 있도록 합니다.
PDS는 단지 저장소를 운영하는 시스템일 뿐이므로 사용자는 다른 PDS 간에 저장소를 이동하거나 심지어 자신의 PDS를 운영할 수 있는 자유가 있습니다. 이러한 유연성이 시스템에 자유를 제공하는 것입니다.
PDS에 저장된 저장소의 콘텐츠는 피드 생성기에 의해 모니터링되며, 피드 생성기는 특정 기준에 따라 피드를 생성합니다. 다른 소셜 미디어 플랫폼(예: Facebook)에서는 일반적으로 피드가 하나뿐이지만 BlueSky의 경우 사용자는 게시물을 보고 싶은 피드를 자유롭게 선택할 수 있습니다. 사용자가 피드 생성기가 자신의 관심사와 관련된 게시물을 표시하지 않거나, 보고 싶은 게시물을 검열하거나, 조작하려고 한다고 느낄 경우 간단히 다른 피드 제공자로 전환할 수 있습니다.
이러한 느슨한 시스템 네트워크와 저장소 이전 용이성은 효율성을 희생하지 않고도 완전한 자유를 제공합니다. 예를 들어, 클라이언트는 여러 소스에서 게시물을 수집할 필요가 없습니다. 이는 피드 생성기와 PDS에서 처리하기 때문입니다.
이제 시스템의 구조와 주요 구성 요소를 이해했으므로 좀 더 자세히 살펴보고 프로토콜이 어떻게 작동하는지 살펴보겠습니다.
모든 사용자(및 다른 엔터티)는 고유한 분산 식별자(DID)를 할당받습니다. 이 DID는 저장소와 사용자가 저장소 커밋에 서명하는 데 사용하는 키 쌍과 연관됩니다. DID는 기억하기 어렵기 때문에 사용자는 도메인 이름으로 식별되고, 시스템은 이를 DID로 변환합니다.
예를 들어, 내 사용자 이름은 thebojda.bsky.social 입니다. DID는 두 가지 방법으로 여기에 연결할 수 있습니다. 적절한 키로 도메인의 TXT 레코드에 지정하거나 잘 알려진 URI를 통해 간단히 연결할 수 있습니다. DID는 다음 URL에서 액세스할 수 있습니다.
https://thebojda.bsky.social/.well-known/atproto-did
예를 들어, 내 DID는 다음과 같습니다: did:plc:4x7rynvskplz54p5pofj3jxa
AT 프로토콜은 plc 와 web 유형의 DID를 모두 지원합니다. web DID는 간단한 URL인 반면, plc DID는 공개 키와 추가 데이터에서 생성된 AT 프로토콜의 사용자 지정 표준입니다(더 자세히 알아보고 싶은 분은 여기에서 자세히 읽어보세요 ).
각 DID는 DID 문서와 연결되며, 이 문서에는 DID에 연결된 공개 키와 저장소가 호스팅된 PDS의 URL이 포함됩니다.
DID는 다음과 같이 해결될 수 있습니다.
https://plc.directory/did:plc:4x7rynvskplz54p5pofj3jxa
DID 문서는 다음과 같습니다.
{ "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/multikey/v1", "https://w3id.org/security/suites/secp256k1-2019/v1" ], "id": "did:plc:4x7rynvskplz54p5pofj3jxa", "alsoKnownAs": [ "at://thebojda.bsky.social" ], "verificationMethod": [ { "id": "did:plc:4x7rynvskplz54p5pofj3jxa#atproto", "type": "Multikey", "controller": "did:plc:4x7rynvskplz54p5pofj3jxa", "publicKeyMultibase": "zQ3shaNKzE66K1Kr3dmbnDwXWHh6v4nUcBmpEaK7bVktKTwfh" } ], "service": [ { "id": "#atproto_pds", "type": "AtprotoPersonalDataServer", "serviceEndpoint": "https://fibercap.us-west.host.bsky.network" } ] }
이 문서에서 누군가가 새로운 PDS로 이동하면 PDS URL을 업데이트해야 합니다. 예를 들어, 현재 내 PDS는 https://fibercap.us-west.host.bsky.network 에서 액세스할 수 있습니다.
PDS와의 통신은 간단한 HTTP/JSON 기반 프로토콜인 XRPC를 통해 이루어집니다. 각 호출에는 역방향 DNS 스타일 이름이 있습니다. 예를 들어 전체 리포지토리를 가져오려면 다음과 같이 할 수 있습니다.
https://fibercap.us-west.host.bsky.network/xrpc/com.atproto.sync.getRepo?did=did:plc:4x7rynvskplz54p5pofj3jxa
com.atproto.sync.getRepo
메서드는 저장소를 쿼리하는 데 사용되며 did
매개변수가 있습니다.
BlueSky 팀은 API와 데이터 구조를 정의하기 위해 Lexicon 이라는 JSON 기반 설명 언어를 개발했습니다. JSON 스키마와 유사하며, 예를 들어 TypeScript의 경우 프로토콜 구현을 간소화하는 유형 안전 인터페이스를 생성하는 데 사용할 수 있습니다.
다음 호출을 사용하면 마지막 10개 게시물을 가져올 수 있습니다.
https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=thebojda.bsky.social&limit=10
결과는 다음과 같습니다.
{ "feed": [ { "post": { "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l", "cid": "bafyreihagjnwrkakkajkaighz6kyqww3wznvbdcqpnl4wbfnpwrr2xwmmi", "author": { "did": "did:plc:4x7rynvskplz54p5pofj3jxa", "handle": "thebojda.bsky.social", "displayName": "Laszlo Fazekas", "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:4x7rynvskplz54p5pofj3jxa/bafkreibxd4mx7rehgkc77diautavpcota6jotzkaagp4zv2t6w3a52n7sq@jpeg", "labels": [], "createdAt": "2024-11-24T01:36:39.146Z" }, "record": { "$type": "app.bsky.feed.post", "createdAt": "2024-12-24T21:20:56.891Z", "embed": { "$type": "app.bsky.embed.external", "external": { "description": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar. There are no backend servers, you fully own your data.", "thumb": { "$type": "blob", "ref": { "$link": "bafkreifoezhkdtesuhkaoqt3yml44geozu6ckg2cfffg5t5omob2bdjmo4" }, "mimeType": "image/jpeg", "size": 669185 }, "title": "MyETHMeta v2 – Some Improvements on the Gravatar for Your Ethereum Account | HackerNoon", "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account" } }, "facets": [ { "features": [ { "$type": "app.bsky.richtext.facet#link", "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account" } ], "index": { "byteEnd": 270, "byteStart": 240 } } ], "langs": [ "en" ], "reply": { "parent": { "cid": "bafyreieipk3kgwonq3h62wyadauplzgcpdgcg6pxp2776oeldcstgybwha", "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3es7kzmc2l" }, "root": { "cid": "bafyreieipk3kgwonq3h62wyadauplzgcpdgcg6pxp2776oeldcstgybwha", "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3es7kzmc2l" } }, "text": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar, but here the metadata and your profile picture is assigned to your Ethereum address. There are no backend servers, you fully own your data. hackernoon.com/myethmeta-v2..." }, "embed": { "$type": "app.bsky.embed.external#view", "external": { "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account", "title": "MyETHMeta v2 – Some Improvements on the Gravatar for Your Ethereum Account | HackerNoon", "description": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar. There are no backend servers, you fully own your data.", "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4x7rynvskplz54p5pofj3jxa/bafkreifoezhkdtesuhkaoqt3yml44geozu6ckg2cfffg5t5omob2bdjmo4@jpeg" } }, "replyCount": 0, "repostCount": 0, "likeCount": 0, "quoteCount": 0, "indexedAt": "2024-12-24T21:21:02.466Z", "labels": [] }, "reply": {} }, {}, {}, {}, {}, {}, {}, {}, {} ] }
각 요소에는 게시물과 관련 답변이 포함됩니다. 앞서 언급했듯이 모든 게시물은 리포지토리의 레코드이며 고유한 식별자가 있습니다. 각 게시물에는 DID, 컬렉션 이름 및 게시물 ID로 구성된 고유한 URI가 할당될 수 있습니다. 위의 예에서 URI는 다음과 같습니다. at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l
즉, 해당 게시물은 app.bsky.feed.post
컬렉션 내의 내 DID와 연관된 저장소에 위치하고 ID는 3le3esbhaek2l
입니다.
URI 외에도 게시물의 CID도 포함되는데, 이는 콘텐츠에서 생성된 고유한 해시입니다. 이러한 요소는 함께 저장소의 고유한 커밋 해시를 형성합니다.
또 다른 주목할 만한 측면은 게시물과 관련된 이미지를 나타내는 thumb
섹션입니다. 이것은 어떤 컬렉션에도 속하지 않는 블롭 유형 개체입니다. 시스템은 큰 파일(예: 이미지, 비디오 등)을 블롭으로 저장하며, 이는 해시(CID)를 사용하여 개별 레코드(예: 게시물)에서 참조할 수 있습니다.
저장소와 레코드의 구조를 더 자세히 살펴보고 싶은 사람들에게는 go-repo-export 도구가 매우 유용할 수 있습니다. 이 작은 프로그램으로 전체 사용자 저장소를 다운로드하고 컬렉션과 해당 레코드를 JSON 형식의 디렉토리로 추출할 수 있습니다. 이를 통해 BlueSky가 데이터를 저장하는 방식을 정확히 볼 수 있습니다.
또 다른 좋은 정보 출처는 Chrome DevTools입니다. https://bsky.app 웹사이트에서 API 호출과 클라이언트 측이 PDS와 통신하는 방식을 명확하게 볼 수 있습니다.
그리고 물론 공식 문서도 있습니다. AT Protocol 과 BlueSky는 훌륭한 문서를 가지고 있으며, GitHub 에서 클라이언트와 서버 측 모두의 소스 코드와 예제를 찾을 수 있습니다.
AT 프로토콜에 대해 처음 읽었을 때, 제 첫 생각은 ActivityPub 와 함께 또 다른 연합 프로토콜이 필요한 이유였습니다. 하지만 AT 프로토콜은 실제로 그 존재를 충분히 정당화하는 특정 기능을 가지고 있습니다. 물론 이 프로토콜은 완벽하지 않으며 상당한 개발을 거칠 가능성이 큽니다. 예를 들어, 진정으로 검열에 강한 네트워크를 구축하려면 중앙 집중식 도메인 이름 시스템에 의존할 수 없습니다. 진정으로 검열에 강한 블록체인 기반 명명 시스템이 가치가 있을 것입니다(이에 대한 제안을 쓸 수도 있습니다).
BlueSky는 현재 약 2,000만~3,000만 명의 사용자를 보유하고 있는 것으로 추산되는데, 이는 X(Twitter)의 사용자 기반과 비교하면 미미하지만 여전히 상당한 수준입니다. 미래가 어떻게 될지는 아무도 확실히 말할 수 없습니다. 연합 네트워크는 큰 이점이며, Twitter나 Facebook과 같은 글로벌 커뮤니케이션 플랫폼을 하나의 개체가 소유하는 것이 너무 큰 힘인지에 대한 격렬한 논쟁이 있습니다. BlueSky가 언젠가 경쟁사를 앞지를 가능성을 완전히 배제하지는 않습니다. 좋은 피드 생성기와 효과적인 커뮤니티 구축을 통해 이는 가능합니다. 어떤 경우든 이 프로젝트에 주의를 기울이고 작동 방식을 이해하는 것은 가치가 있습니다.