[tmp]ADXをコードリーディング(0.1.0)
分散型ソーシャルメディアのオープン標準プロジェクトが初期テスト版をリリースしたのでADXをコードリーディングします
※記事で途中まで書いていたのですが詰まってきたし情報の正確性に欠けてきたのでスクラップに投げておきます。大分怪しいので何らの責任も負わないものとします。
ADXとは
Twitterのやつです。
正確にはBlueskyのやつです。
コードリーディング記事書いたことないのでとりあえず淡々とやっていきます。
コードリーディング
おことわり
2022年5月7日
やること
- GitHubとSourcegraphを使って重要そうなファイル、シンボルから読む
- architecture.mdで解説している技術の使われ方
- 必要に応じて別途ドキュメントを読む
- 可能な範囲でコミットログも読む
やらないこと
- architecture.mdの和訳
- ブロックチェーンやIPFSが世界を変えるみたいな思ってもいない大仰なポエム
- 複数ビルドしてAliceとBobの通信するやつ
パッケージ
モノレポなのでルートには特に入っていない。
サーバーのパッケージ。Expressで受け取ったデータをZodでバリデーションしてKnexでデータベースへ追加している。データベースは今のところSQLiteのみサポート。
メインのパッケージ。分散するために必要な機能が入っておりこれをCLIから呼び出している。
CLIのパッケージ。コマンドを叩きサーバーへデータを送信する。GUIクライアントはない(なくなった。後述)
アーキテクチャ
なんか色々書いてあるけど実態はDID, IPLD, UCANを組み合わせて分散を実現している。
UCANだけ聞いたことがなかったけど、Fissionという企業が作ったものでNFT.Storageなどで使われているらしい。
そもそも開発者がFission出身らしい。
もう一人はDat ProtocolやHypercore Protocolに対応したブラウザBeaker Browserの作者。
IPLD
IPLDはIPFSで使われている技術。IPFS「が」IPLDを使っている。
よくIPFSを使ってLinked Dataを実現しているやつと勘違いされることが多いが別にIPFSなくても使える。
そのためIPFSを使わずにMerkle DAGs実装をするためにはデータが不変になるよう頑張る必要があり、DIDとUCANが必要になる。
またDIDとUCANを使ってMerkle treeは作れるがDAGは難しいのでdag-cborというCBORコーデックを使ってる。
IPLDではHAMTも使っているがこれは後述。
DID
DIDはW3CによってWeb標準化された分散型ID。
TODO:
did:example:
did:key:
did:orb:
did:ion:
did:pkh:
UCAN
UCANはJWT拡張。
History
最初はNEXT-SASSテンプレートを使っており、GUIがあったようです。
また途中Goやesbuildを使ってサーバー実装を行っていた時期もあったようです。
フロントエンドとバックエンド両方ともTypeScriptで書きたかったためこのようにしたそうです。
一応今後GoやRustでも書く予定はあるそうです。
まとめ
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
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.namespace+count:all+.&patternType=regexp
- namespace: 27
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.class+count:all+.&patternType=regexp
- class: 15
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.method+count:all+.&patternType=regexp
- method: 175
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.property+count:all+.&patternType=regexp
- property: 58
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.interface+count:all+.&patternType=regexp
- interface: 10
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.function+count:all+.&patternType=regexp
- function: 15
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.variable+count:all+.&patternType=regexp
- variable: 113
-
https://sourcegraph.com/search?q=context:global+repo:^github\.com/bluesky-social/adx%24+type:symbol+select:symbol.constant+count:all+.&patternType=regexp
- constant: 1300