Перейти к содержанию

GPU Воркеры / Майнинг — Обзор

GPU Воркеры (майнеры) выполняют полезные вычисления на GPU и получают награды за корректное выполнение задач.

Концепция

Proof-of-Compute заменяет бессмысленный хешрейт полезными вычислениями:

  • Вместо поиска nonce, воркеры выполняют реальные задачи
  • Результаты проверяются и записываются в блокчейн
  • Воркеры получают награды за корректное выполнение

Роль Воркера

Основные функции

  1. Подключение к PoC Валидатору:
  2. WebSocket или HTTP подключение
  3. Получение задач на выполнение

  4. Выполнение вычислений:

  5. Запуск ядер CUDA/ROCm на GPU
  6. Обработка задач (умножение матриц, инференс, обучение и т.д.)

  7. Отправка результата:

  8. Хеширование результата
  9. Формирование доказательства (будущее: ZK-proof)
  10. Отправка транзакции SUBMIT_RESULT в L1

  11. Получение награды:

  12. Off-chain (через PoC валидатора) или
  13. On-chain (через механизм наград L1)

Структура ComputeResult

Поля

class ComputeResult:
    task_id: str  # UUID задачи
    worker_address: str  # Адрес воркера (cpc1...)
    result_hash: str  # Хеш результата вычислений
    proof: Optional[str] = None  # Доказательство корректности (будущее: ZK-proof)
    nonce: Optional[int] = None  # Для синтетических задач
    signature: Optional[str] = None  # Подпись воркера

Пример Payload

{
  "task_id": "550e8400-e29b-41d4-a716-446655440000",
  "worker_address": "cpc1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p7q8r9s0t",
  "result_hash": "0x1234567890abcdef...",
  "proof": null,
  "nonce": 12345,
  "signature": "0xabcdef..."
}

Транзакция SUBMIT_RESULT

Тип транзакции

TxType.SUBMIT_RESULT

Стоимость газа: 80,000 gas

Структура транзакции

Transaction(
    tx_type=TxType.SUBMIT_RESULT,
    from_address="cpc1worker...",  # Адрес воркера
    to_address=None,
    amount=0,  # Награда пока не интегрирована в L1
    fee=gas_limit * gas_price,
    nonce=...,
    gas_price=1000,
    gas_limit=80000,
    payload={
        "task_id": "...",
        "worker_address": "cpc1worker...",
        "result_hash": "0x...",
        "proof": None,
        "nonce": 12345,
        "signature": "..."
    }
)

Валидация

Проверки L1:

  1. Структура ComputeResult валидна
  2. worker_address совпадает с tx.from_address
  3. Доказательство верифицировано (будущее: через ZK-верификацию)

Интеграция с блокчейном

compute_root

В заголовке блока:

class BlockHeader:
    compute_root: str  # Merkle root всех ComputeResult в блоке

Вычисление:

def compute_poc_root(txs: List[Transaction]) -> str:
    leaves = []
    for tx in txs:
        if tx.tx_type == TxType.SUBMIT_RESULT:
            res = ComputeResult(**tx.payload)
            data = res.model_dump_json().encode("utf-8")
            leaves.append(sha256(data))

    if not leaves:
        return ""

    return compute_merkle_root(leaves).hex()

Типы задач

Синтетические задачи

Статус: ✅ Реализовано (Stage 4)

Назначение: Стресс-тест и бенчмарк GPU

Тип: challenge_type: "synthetic"

Свойства: - Детерминированный вывод - Быстрая верификация - Генерируется из хеша блока

Пример:

# Генерация задачи из хеша блока
block_hash = get_latest_block_hash()
seed = sha256(block_hash + worker_address)
matrix_size = 1024

# Выполнение
result = matrix_multiplication(seed, matrix_size)
result_hash = sha256(result)

Реальные задачи (Будущее)

Статус: 🚧 В разработке (Stage 5)

Типы: - inference — инференс ML моделей - training — обучение моделей - rendering — рендеринг графики - simulation — научные симуляции

Свойства: - Загружаются через Task Market - Оплачиваются пользователем - Проверяются через ZK-proofs или дублирующее выполнение

Процесс выполнения задач

Текущая реализация (Stage 4)

Упрощённый поток:

  1. Воркер генерирует задачу из хеша блока (синтетическая)
  2. Воркер выполняет вычисление (CPU/GPU mock)
  3. Воркер отправляет транзакцию SUBMIT_RESULT в L1
  4. L1 валидатор проверяет структуру и включает в блок
  5. compute_root обновляется в заголовке блока

Будущая реализация (Stage 5)

Полный поток с маркетплейсом:

  1. Пользователь создаёт задачу через Task Market API
  2. PoC валидатор получает задачу и разбивает на задания
  3. PoC валидатор распределяет задания между воркерами через WebSocket
  4. Воркер выполняет задачу на GPU
  5. Воркер отправляет результат с доказательством обратно
  6. PoC валидатор проверяет результат (выборочная верификация)
  7. PoC валидатор или Воркер отправляет SUBMIT_RESULT в L1
  8. L1 валидатор включает транзакцию в блок
  9. Воркер получает награду (off-chain или через L1 reward)

Награды

Текущая реализация

Статус: Off-chain (в PoC валидаторе) или через простой бонус в _distribute_rewards

Награды ещё не интегрированы в L1 на уровне протокола.

Будущая реализация

Интеграция с L1:

  • Награды за транзакции SUBMIT_RESULT
  • Распределение через _distribute_rewards
  • Рейтинг воркера в стейте (off-chain или on-chain)

Требования к Воркеру

Оборудование

  • GPU: RTX 4090/5090 или аналог (поддержка CUDA/ROCm)
  • CPU: Достаточный для оркестрации задач
  • RAM: Зависит от типа задачи
  • Storage: Минимальные требования (для кода и данных)

ПО

  • Python 3.12+
  • CUDA Toolkit или ROCm (для GPU вычислений)
  • L1 нода (для отправки транзакций)
  • PoC клиент (для подключения к оркестратору)

Сетевое подключение

  • Стабильное интернет-соединение
  • Доступ к L1 ноде (локальной или удаленной)
  • Доступ к PoC валидатору (WebSocket/HTTP)

Следующие шаги