Архитектура
Протокол — это три контракта и один одноранговый транспорт. Всё остальное — клиент.
Контракты (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 поверх TCP/QUIC с Noise и yamux. peer ID из реестра — это идентичность, которую ждёт клиент; несовпадение прерывает рукопожатие.
- DCUtR решает большую часть NAT.
- Релей используется только когда прямой путь не устанавливается, и только для рукопожатия. Бюджет релея (128 KiB / 2 мин) исключает стриминг через него.
- IPv6 поддерживается, но включается явно.
Кредит и достижимость
У воркеров есть кредитный рейтинг, выведенный из поведения. Это не токен, и его нельзя купить. Его используют два гейта:
- Гейт достижимости — воркер, который раз за разом проваливает рукопожатие, опускается в приоритете.
- Кредитный гейт — воркер с плохой историей по умолчанию не показывается.
Оба — политика клиента, а не состояние контракта, поэтому клиент всегда может их игнорировать.
Commit-challenge
Чтобы воркер не мог заявить модель, которую не запускает, клиент может до первого токена запросить обязательство по случайному challenge. Воркер, который не может его выдать, отбрасывается.
Чего здесь намеренно нет
- Оркестратора, сервера очереди задач, базы данных промптов.
- Токена, стейкинга, контракта управления.
- Развёртывания в mainnet.
- Телеметрии в десктопном приложении.