adx - フェデレーション ソーシャル ネットワークの自己認証データ構造の実験

(Experiment in self-authenticating data structures for a federated social network)

Created at: 2021-12-18 04:06:47
Language: TypeScript
License: MIT

ADX - 認証済みデータ体験

これは、私たちがADX:認証されたデータエクスペリメントと呼んでいるBlueskyのデータプロトコルの実用的なリポジトリです。「X」は「実験」を表し、プロジェクトは初期の探索的状態にあります。


⚠️これはプロダクション対応のソフトウェアでも、アルファ版ソフトウェアでもありません。このプロジェクトは活発に開発中です。⚠️


これで何も作ろうとしないでください!インターフェイスとデータ構造は根本的に変化する可能性があり、まだ開発中の機能 (キー管理、スキーマ、インデックス作成など) についていくつかのショートカットを使用しました。この実験は、主にデータと承認レイヤーに限定され、他のシステムのいくつかにヒントがあります。

質問やアイデアがあれば、ディスカッションを開始することをお勧めします。このコードは、完璧または100%バグフリーであることを意図したものではありません。したがって、私たちはあなたが遭遇する可能性のある問題について(問題の形で)聞くことに興味がありますが、より大きな書き換えのためにそれらを残しておき、短期的には解決しないかもしれません。

ℹ️このプロジェクトについて

ADX の詳細については、以下を参照してください。

🔍ここには何がありますか?

これは 3 つのパッケージを含むモノレポです。

  • common
    : これは、次の実装を含む adx SDK です。

    • リポジトリのデータ構造
    • 完全なクライアントと委任クライアントの両方の実装を含むサンプルのネットワーク名前空間 (マイクロブログ)
    • ADX 対応の UCAN を操作するための承認ライブラリ
    • adxデータサーバーを呼び出すためのヘルパー
  • server
    : これは adx サーバーの実装です。簡単にするために、実際にはネットワーク内の3つの「役割」の機能を組み合わせています。

    • 同一性:
      • ユーザー名のマッピングを維持 -> DID
    • データ:
      • データリポジトリの最新のルートCIDへのポインタを保持します。
      • リポジトリへのプッシュの権限を確認し、ルートを更新します。
      • プル用のリポジトリを提供します。
      • 代理人として機能し、適切に承認された要求のためにリポジトリを更新します
      • ホストしている特定の DID にサブスクライブしている他のデータ/インデックス作成サーバーに更新を送信します。
    • インデキシング:
      • ホストしている、またはそのユーザーがフォローしているリポジトリのインデックス付きバージョンを格納します
      • フォロワーリスト、集計された同類数、ユーザータイムラインなどのデータのグローバルビューが返されました。
  • cli
    : これは adx ネットワークとの対話のための基本的なコマンドラインインターフェイスです:

    • ローカルリポジトリの作成
    • ユーザーの登録
    • 投稿の作成/編集/削除
    • いいね!の作成/削除
    • ユーザーのタイムラインを表示する
    • ユーザーのフィードを表示する

    注: cli は現時点では委任クライアントを使用します。まもなく、完全なクライアントを使用するオプションを追加しています。

📺デモ録音

デモ.gif

🏎️クイック使用

ノード> = 15、および糸が必要です

すぐに飛び込みたいですか?サンプルの 2 つのサーバー・ネットワークを稼働させるには、以下のステップに従ってください。

このデモでは、次の 4 つのターミナル ウィンドウを使用します。

  • データフェデレーションを披露する2つのサーバー(必要に応じて、ここで1つだけを使用できます)
  • 別々のサーバー上の 2 人のユーザーを表す 2 つの cli クライアント

⚠️サーバーはデータをメモリ内に保存します。サーバーをシャットダウンして再起動すると、アカウントと関連データが削除されます。

括弧内の数字は、各コマンドを実行する端末を示します。プロジェクトのルートから:

# install dependencies
(1) yarn

# build projects
(1) yarn build

# run server
(1) yarn server # runs on localhost:2583

# in a separate terminal, run a second server
(2) yarn server:alt # runs on localhost:2584

# set an env var to store alice's repo in a scoped dir
(3) export ADX_REPO_PATH="~/.adx-alice"

# set an env var to store bob's repo in a scoped dir
(4) export ADX_REPO_PATH="~/.adx-bob"

# register alice
(3) yarn cli init
# prompt with 'alice' for username, 'localhost:2583' for host, true for registration & false for delegator client

# register bob
(4) yarn cli init
# prompt with 'bob' for username, 'localhost:2584' for host, true for registration & false for delegator client

# make a couple posts as alice
(3) yarn cli post "hello world"
(3) yarn cli post "howdy"

# follow alice as bob
(4) yarn cli follow [email protected]:2583

# like alice's post
(4) yarn cli like [email protected]:2583 {post_id from alice post} # the post id has the format `3iwc-gvs-ehpk-2s`

# view your timeline
(4) yarn cli timeline

# list your follows
(3/4) yarn cli list follows

# list your followers
(3/4) yarn cli list followers

# list your feed
(3/4) yarn cli feed

# view alice's feed as bob
(4) yarn cli feed [email protected]:2583

# Keep playing around. Try unliking, deleting or editing posts, or add a third user into the mix! They can be registered to one of the existing servers

# Remember, the servers are running in-memory, if you restart a server and want to restart your CLI as well, run
(3/4) yarn cli destroy # deletes user repo & keypair

🗒️ドキュメンテーション

サーバー API または SDK の詳細なドキュメントは、API がまもなく変更される予定であるため、まとめていません。

どちらかで遊ぶ傾向がある場合は、テストをチェックしてライブラリの各部分の使用方法を確認することをお勧めします。

具体的には:

server/test/delegator.ts
委任クライアント (最も操作しやすいクライアント) の例が含まれています。

server/test/indexer.ts
2 サーバー ネットワーク上での複数のユーザーの対話の例が含まれています

common/test/repo.ts
ユーザーリポジトリに対して直接更新を実行する例が含まれています

common/test/microblog.ts
マイクロブログライブラリを使用してリポジトリ内のマイクロブログ名前空間オブジェクトを作成/更新する例が含まれています

サーバーAPIと直接通信するために、各ルートの上にスキーマがあり、受信する予定の正確なパラメータを詳述しています。すべてのポストルートには、ベアラトークンとして有効なUCANが必要です。これらのトークンは手動でロールするのが難しい場合があるため、SDK を使用してこれらの要求を行うことをお勧めします。

🔦コードスペルンカに関する注記

コードに飛び込んで、私たちと一緒にこれらの概念を探求してくれることを願っています!

前述のとおり、質問やアイデアを交えてディスカッションに参加してください。バグをすぐには解決できないかもしれないという理解のもと、バグを報告してください。

コードの深さをたどっている好奇心旺盛な人のためのいくつかのメモ:

名前空間

ユーザー リポジトリ内のデータは、名前空間によって区切られます。

ユーザーのマイクロブログデータは、長文の書き込みデータなどとは別に存在する画像ブロードキャストデータとは別に存在します。各名前空間は、それぞれのデータ仕様に従います。

ここでは、マイクロブログという 1 つのサンプル名前空間のみを実装しました。

「インタラクション」と「いいね」という言葉の使用を切り替えることがあります。その理由は、ユーザーリポジトリが「相互作用」、つまりアプリケーションによって生成されるあらゆる種類の相互作用の観点から話すためです。これらは、いいね、リツイート、アップ投票、シェア、rsvpsなどです。私たちの現在の(単純化された)マイクロブログ仕様では、相互作用として「いいね」しか許可されていません。

したがって、私たちは一般的な概念を「相互作用」として、特定の概念を「好き」として話そうとします。ここには灰色の領域があり、これら 2 つの概念が一緒にぼやけ、スキーマ システムを開発するにつれてより適切に区切られます。

DID と UCAN

このプロトタイプでは、ユーザーのルート DID は単純な .将来的には、これらは、アーキテクチャのドキュメントで提案されている現在名前のないコンソーシアム提供のDIDなどのより永続的な識別子になります。

did:key
did:ion

DID ネットワークは、このプロトタイプの範囲外です。ただし、DID は、ユーザーの正規の不変の識別子です。データ/サーバーの相互運用を有効にするために必要です。したがって、POSTとGET(署名チェック付き)のみを許可する非常に単純なDIDネットワークを実行します。DID ネットワークはデータ・サーバー () 上で実行されますが、DID ネットワーク要求に関しては、実行中のすべてのサーバーが同じデータ・サーバーと通信します。DIDは解決のために自己記述型であるため、DIDの検出方法をハードコーディングすることでこれをエミュレートします(つまり、「個人データサーバーではなく、常にこの特定のアドレスに移動します」)。

http://localhost:2583/did-network

ルートキーからルートキーにUCANを委任することがわかります(これはノーオペレーションです)、これは実際のルートキーから完全に委任されたUCANを受け取るプロセスを完全に許可されたデバイスキーにミラーリングするためです。

また、マイクロブログ名前空間の DID が単なるものであることにも気付くでしょう (これは実際に有効な DID ではありません)。これは、スキーマ用のアドレス指定されたネットワークができるまでは、待機状態です。

did:example:microblog

UCAN アクセス許可も現時点では簡略化されており、スコープ付きアクセス許可または完全リポジトリ アクセス許可が許可されています。これらの権限は、CRUD操作とより詳細なメンテナンス(つまり、作成とマージとクリーンアップなど)を提示できるように、将来的に拡張される予定です。

WRITE
MAINTENANCE

クライアントの種類

アーキテクチャの概要では、フル、ライト、および委任子の 3 つのクライアントの種類を指定します。このライブラリには、完全および委任子の実装のみが含まれています。したがって、軽量の操作には委任子を使用し、リポジトリ全体が必要な場合は完全なクライアントを使用します。

これの主な影響は、データサーバーのサブスクライバーがサブスクライブするユーザーの完全なレポを受信する必要があることです。ライトクライアントを追加すると、完全なレポと同じ信頼モデルを持ちながら、関心のあるレポのセクション(たとえば、単一の投稿など)のみを受け取ることができます。