アーキテクチャ
プロトコルは 3 つのコントラクトと 1 つのピアツーピア伝送です。それ以外はすべてクライアントです。
コントラクト(Base Sepolia、chain 84532)
| コントラクト | アドレス |
|---|---|
| WorkerRegistry v0.2 | 0xFbE9FF497dC24bD69d13E4201418938Df7435Ff6 |
| JobEscrow v0.2 | 0x8175df796A659681009BeDa4609a3cFe9d281D82 |
| MockUSDC(テストのみ) | 0xEb33DFC0424810039337a38510ef522e9E7F9727 |
WorkerRegistry
function register(bytes32 peerId, bytes32 policyHash) external;
function registerWithLocator(bytes32 peerId, bytes32 policyHash, string locator) external;
function advertise(string calldata locator) external;
function selfDeactivate() external;
function isActive(address wallet) external view returns (bool);
function count() external view returns (uint256);
- ウォレットごとに 1 件。再登録しても最初の登録時刻は保持されます。
advertise()はログが安価で、長さ上限があります(MAX_LOCATOR_BYTES = 256)。- 停止はセルフサービス。運営者が理由付きで停止することもできます。
JobEscrow
function openSession(address worker, uint128 amount) external returns (uint256 id);
function settle(uint256 id, bytes32 receiptHash, uint128 spend, bytes calldata workerSig) external;
function refund(uint256 id) external;
function claim() external;
settle()はセッションレシートへのワーカー署名を検証します。- 配分は 99 / 1(ワーカー / 財務)。
- 未使用のエスクローは
refund()で利用者へ戻ります。
伝送
libp2p over TCP/QUIC、Noise と yamux。レジストリの peer ID がクライアントの期待する身元で、 一致しなければハンドシェイクを中止します。
- DCUtR がほとんどの NAT 越えを担当。
- リレーは直接経路が作れない場合のみ、しかもハンドシェイクだけ。リレー枠 (128 KiB / 2 分)ではストリーミングは成立しません。
- IPv6 は対応しますがオプトインです。
信用と到達性
ワーカーには行動から導かれる信用スコアがあります。トークンではなく、購入もできません。 2 つのゲートが使います。
- 到達性ゲート — ハンドシェイクに繰り返し失敗するワーカーは優先度が下がります。
- 信用ゲート — 記録の悪いワーカーは既定で表示されません。
どちらもクライアント側のポリシーでコントラクト状態ではないため、無視する選択も常に可能です。
Commit-challenge
実際には動かしていないモデルを主張するワーカーを防ぐため、クライアントは最初のトークンの前に ランダムなチャレンジへのコミットメントを要求できます。出せないワーカーは切断されます。
意図的に存在しないもの
- オーケストレーター、ジョブキューのサーバー、プロンプトのデータベース。
- トークン、ステーキング、ガバナンスコントラクト。
- メインネットのデプロイ。
- デスクトップアプリのテレメトリ。