Архитектура
Всё, что GenKaKu запускает в продакшене, — это либо статический сайт, либо одноранговый процесс. Ничто в пути запроса не является сервером GenKaKu.
Пакеты
| Пакет | Роль |
|---|---|
@genkaku/protocol | Привязки к блокчейну, биллинг эскроу, сайдкар libp2p, мост Ollama |
@genkaku/dsh-runtime | Адаптер, общий для обоих плагинов |
@genkaku/dsh-worker-plugin | Отдаёт локальные модели |
@genkaku/dsh-user-plugin | Потребляет модели сети |
@genkaku/seed | Релей libp2p и служба обнаружения пиров |
@genkaku/admin | Консоль оператора для хоста seed |
Ядро протокола не зависит от DeepSeek Harness. Это сделано намеренно: другой адаптер не должен требовать его изменения.
В блокчейне
Base Sepolia, chain ID 84532:
| Контракт | Адрес |
|---|---|
| WorkerRegistry | 0xFbE9FF497dC24bD69d13E4201418938Df7435Ff6 |
| JobEscrow | 0x8175df796A659681009BeDa4609a3cFe9d281D82 |
| MockUSDC (только тесты) | 0xEb33DFC0424810039337a38510ef522e9E7F9727 |
WorkerRegistry хранит для каждого кошелька дайджест peer ID, хеш политики bytes32,
необязательный локатор и флаг активности. JobEscrow держит USDC по сессиям, проверяет подпись
квитанции воркера, делит 99/1 и начисляет воркеру баланс к выводу. Комиссия 1% — константа
контракта.
Запись доступна только в тестовой сети. Пути для mainnet выбрасывают исключение: канонический USDC и мультисиг-казна — это отдельный запуск, а не флаг конфигурации.
Плоскость данных
Воркеры обслуживают следующие протоколы libp2p:
/genkaku/open/0 session open
/genkaku/token/0 auth token
/genkaku/receipt/0 signed ledger increments
/genkaku/settle/0 co-sign a settlement
/genkaku/offers/0 offer board
/genkaku/policy/0 policy document
/genkaku/hello/0 identity, wallet proof, quote
Каждый обработчик принимает соединение через релей (runOnLimitedConnection). Поэтому сессия либо
прямая, либо идёт через релей, и оба варианта полноценны. libp2p шифрует поток, так что релей
пересылает шифротекст и видит только метаданные.
В этой сборке нет DCUtR / обхода NAT. Пир за симметричным NAT использует релей или недостижим.
Обнаружение
Два независимых пути:
- Каталог в блокчейне — события
WorkerRegistryдают кошелёк, дайджест peer ID и необязательный локатор. Плагины читают логи через публичный RPC со спискомfallback(base-sepolia.gateway.tenderly.coпервым,sepolia.base.orgпоследним, потому что он ограничиваетeth_getLogs200 блоками). - Seed-релей —
https://staging.genkaku.app/seedотвечает наGET /peersmultiaddr-ами, которые верны прямо сейчас, и предоставляет circuit relay для пиров, которые не могут подключиться напрямую.
Адрес seed зашит в пакет протокола, но его можно переопределить через GENKAKU_BOOTSTRAP_SEEDS
(multiaddr-ы через запятую).
Модель биллинга
pricePerHour : 6-decimal USDC, set by the worker
unit : 1 minute (60 units per hour)
billed : ceil(elapsed / 1min) × ceil(pricePerHour / 60)
Округление происходит раз в час, а не на каждом тике, поэтому пользователь никогда не платит больше объявленной цены за час, а неоплаченный риск воркера — не более одной минуты.
Платная сессия — это две транзакции:
openEscrow(worker, pricePerHour)— пользователь → JobEscrow,settle(...)— JobEscrow → воркер (99%) + казна (1%), остаток возвращается.
Цена 0 обслуживается без эскроу — поэтому бесплатный воркер может работать на машине вообще без
ETH.
Интерфейсы оператора
- Панель — собственный интерфейс плагина в DeepSeek Harness: модели, цена, кошелёк, claim, платежи, ручные воркеры.
- Сервер статуса — локальная HTTP-поверхность на
127.0.0.1, первый свободный порт в 47821–47826, используется панелью и клиентским адаптером. - Администрирование seed — отдельная консоль на VM seed за Caddy по пути
/admin, читает статистику seed и логи блокчейна. Она не держит ключи кошелька и не двигает деньги.
Чего здесь намеренно нет
- Токена, стейкинга, токена кредитного рейтинга.
- Сервера оркестрации, базы данных промптов.
- Автоматического фильтра контента — в протоколе нет хука, который проверяет промпт до того, как его увидит воркер.
- Пути записи в mainnet.