아키텍처
프로토콜은 컨트랙트 세 개와 피어투피어 전송 하나입니다. 나머지는 모두 클라이언트입니다.
컨트랙트(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);
- 지갑당 하나. 다시 등록해도 최초 등록 시각은 유지됩니다.
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는 지원하지만 옵트인입니다.
신용과 도달성
워커는 행동에서 나온 신용 점수를 갖습니다. 토큰이 아니며 살 수 없습니다. 두 게이트가 이를 씁니다.
- 도달성 게이트 — 핸드셰이크에 반복 실패한 워커는 우선순위가 낮아집니다.
- 신용 게이트 — 기록이 나쁜 워커는 기본적으로 표시되지 않습니다.
둘 다 클라이언트 정책이며 컨트랙트 상태가 아니므로, 클라이언트는 언제든 무시할 수 있습니다.
Commit-challenge
실제로 돌리지 않는 모델을 주장하는 워커를 막기 위해, 클라이언트는 첫 토큰 전에 무작위 챌린지에 대한 커밋먼트를 요구할 수 있습니다. 내지 못하는 워커는 끊깁니다.
의도적으로 없는 것
- 오케스트레이터, 작업 큐 서버, 프롬프트 데이터베이스.
- 토큰, 스테이킹, 거버넌스 컨트랙트.
- 메인넷 배포.
- 데스크톱 앱 텔레메트리.