Closed1

[tmp]ADXをコードリーディング(0.1.0)

黒ヰ樹黒ヰ樹

分散型ソーシャルメディアのオープン標準プロジェクトが初期テスト版をリリースしたのでADXをコードリーディングします

※記事で途中まで書いていたのですが詰まってきたし情報の正確性に欠けてきたのでスクラップに投げておきます。大分怪しいので何らの責任も負わないものとします。

ADXとは

Twitterのやつです。

https://github.com/bluesky-social/adx

正確にはBlueskyのやつです。

https://gigazine.net/news/20220506-twitter-bluesky-release-first-experiment-adx/

コードリーディング記事書いたことないのでとりあえず淡々とやっていきます。

コードリーディング

おことわり

2022年5月7日
https://github.com/bluesky-social/adx/tree/3c7b12e8de4f9e75675d847c7a9a45d5a0e44291

やること

  • GitHubとSourcegraphを使って重要そうなファイル、シンボルから読む
  • architecture.mdで解説している技術の使われ方
  • 必要に応じて別途ドキュメントを読む
  • 可能な範囲でコミットログも読む

やらないこと

  • architecture.mdの和訳
  • ブロックチェーンやIPFSが世界を変えるみたいな思ってもいない大仰なポエム
  • 複数ビルドしてAliceとBobの通信するやつ

パッケージ

https://github.com/bluesky-social/adx/blob/main/package.json

モノレポなのでルートには特に入っていない。

https://github.com/bluesky-social/adx/blob/main/server/package.json

サーバーのパッケージ。Expressで受け取ったデータをZodでバリデーションしてKnexでデータベースへ追加している。データベースは今のところSQLiteのみサポート。

https://github.com/bluesky-social/adx/blob/main/common/package.json

メインのパッケージ。分散するために必要な機能が入っておりこれをCLIから呼び出している。

https://github.com/bluesky-social/adx/blob/main/cli/package.json

CLIのパッケージ。コマンドを叩きサーバーへデータを送信する。GUIクライアントはない(なくなった。後述)

アーキテクチャ

https://sourcegraph.com/github.com/bluesky-social/adx/-/blob/architecture.md

なんか色々書いてあるけど実態はDID, IPLD, UCANを組み合わせて分散を実現している。
UCANだけ聞いたことがなかったけど、Fissionという企業が作ったものでNFT.Storageなどで使われているらしい。

https://fission.codes/

そもそも開発者がFission出身らしい。
もう一人はDat ProtocolやHypercore Protocolに対応したブラウザBeaker Browserの作者。

IPLD

https://ipld.io/
https://ipld.io/docs/intro/ecosystem/

IPLDはIPFSで使われている技術。IPFS「が」IPLDを使っている。
よくIPFSを使ってLinked Dataを実現しているやつと勘違いされることが多いが別にIPFSなくても使える。

https://docs.ipfs.io/concepts/merkle-dag/
https://ipld.io/docs/codecs/known/dag-cbor/

そのためIPFSを使わずにMerkle DAGs実装をするためにはデータが不変になるよう頑張る必要があり、DIDとUCANが必要になる。
またDIDとUCANを使ってMerkle treeは作れるがDAGは難しいのでdag-cborというCBORコーデックを使ってる。
IPLDではHAMTも使っているがこれは後述。

https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+lang:typescript+%40ipld/car+OR+%40ipld/dag-cbor+OR+ipld-hashmap&patternType=literal

https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+lang:typescript+CarReader+OR+CarWriter+OR+BlockReader+OR+BlockWriter+OR+HAMT+OR+blockCodec&patternType=literal

DID

https://www.w3.org/TR/did-core/
https://identity.foundation/

DIDはW3CによってWeb標準化された分散型ID。

https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+lang:typescript+multiformats+OR+ucan+OR+level&patternType=literal

https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+lang:typescript+count:all+tid+OR+did+OR+cid&patternType=literal

https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+\'did:.*\'&patternType=regexp

TODO:

https://identity.foundation/sidetree/spec
https://identity.foundation/sidetree/api

https://trustbloc.github.io/activityanchors/
https://trustbloc.github.io/did-method-orb/

did:example:
did:key:
did:orb:
did:ion:
did:pkh:

https://www.w3.org/TR/did-spec-registries/

UCAN

https://ucan.xyz/
https://github.com/ucan-wg/spec/

UCANはJWT拡張。

History

https://sourcegraph.com/github.com/bluesky-social/adx@c285ceba38304d7520ce964d98119fab08b335eb/-/blob/third-party/package.json
https://sourcegraph.com/github.com/bluesky-social/adx@17c45acedcbb92a79a5d9b31f2f369013b757567/-/blob/frontend/package.json

最初はNEXT-SASSテンプレートを使っており、GUIがあったようです。

https://sourcegraph.com/github.com/bluesky-social/adx@17c45acedcbb92a79a5d9b31f2f369013b757567/-/blob/go/go.mod
https://sourcegraph.com/github.com/bluesky-social/adx@091c0ab8e5388c5f99451930fe261274399c61f9/-/blob/ts-server/package.json
https://sourcegraph.com/github.com/bluesky-social/adx@091c0ab8e5388c5f99451930fe261274399c61f9/-/blob/server/go.mod

また途中Goやesbuildを使ってサーバー実装を行っていた時期もあったようです。

https://github.com/bluesky-social/adx/issues/111#issuecomment-1118833100

フロントエンドとバックエンド両方ともTypeScriptで書きたかったためこのようにしたそうです。
一応今後GoやRustでも書く予定はあるそうです。

https://github.com/bluesky-social/adx/issues?q=is%3Aissue+author%3Adholms
https://github.com/bluesky-social/adx/issues?q=is%3Aissue+author%3Apfrazee

まとめ

DID, CID, TID
HAMT, SSTable, Merkle DAGs
Webfinger
JSON, JWS, Cbor

DID_NETWORK_URL, ENV, BLOCKSTORE_LOC, DATABASE_LOC, PORT, ADX_REPO_PATH

ENV=persistent

このスクラップは2022/05/07にクローズされました