Разработка смарт-контракта предсказаний (Polymarket-стиль)

Вы запускаете DeFi-протокол, где пользователи делают ставки на исход событий — от спортивных матчей до курса ETH. Первая версия контракта на JavaScript с Web3 проваливается под нагрузкой: reentrancy в redeem, oracle manipulation приводит к loss of funds, а gas cost на AMM превышает лимит в 15 млн. З

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Вы запускаете DeFi-протокол, где пользователи делают ставки на исход событий — от спортивных матчей до курса ETH. Первая версия контракта на JavaScript с Web3 проваливается под нагрузкой: reentrancy в redeem, oracle manipulation приводит к loss of funds, а gas cost на AMM превышает лимит в 15 млн. Знакомая ситуация? Мы переписываем такие контракты с нуля.

Как работают рынки предсказаний на блокчейне?

Каждый рынок — пара условных токенов: YES и NO. Пользователь вносит 1 USDC и получает 1 YES + 1 NO токен через Conditional Tokens Framework (CTF) от Gnosis. Дальше он продаёт нежелательный исход на AMM или CLOB. После резолюции выигравший токен обменивается на 1 USDC, проигравший — на 0.

Conditional Tokens Framework (CTF) — стандарт ERC-1155 для условных токенов. Каждый исход представлен как позиция с уникальным positionId. При резолюции CTF разрешает redeem выигравших позиций.

// Gnosis CTF interface interface IConditionalTokens { function prepareCondition( address oracle, bytes32 questionId, uint outcomeSlotCount ) external; function reportPayouts( bytes32 questionId, uint[] calldata payouts ) external; function redeemPositions( IERC20 collateralToken, bytes32 parentCollectionId, bytes32 conditionId, uint[] calldata indexSets ) external; } 

AMM vs CLOB: что выбрать для вашего рынка?

Параметр AMM (LMSR или Constant Product) CLOB (Central Limit Order Book)
Децентрализация Полная (on-chain матчинг) Требует off-chain матчера
Скорость торгов Зависит от газа блока Миллисекунды (матчинг на стороне)
Ликвидность Автоматическая от LP Зависит от спреда и глубины книги
Gas cost Высокий (экспонента в LMSR) Низкий (только settlement)
Подходит для Полностью децентрализованных платформ Высокочастотной торговли

Polymarket использует CLOB для скорости. Для полностью децентрализованного рынка лучше AMM. LMSR математически элегантен, но Constant Product AMM примерно в 3 раза дешевле по газу — хороший выбор для рынков со сбалансированной ликвидностью.

Почему AMM выгоднее для полностью децентрализованного рынка?

LMSR (Logarithmic Market Scoring Rule) — классический AMM для предсказательных рынков. Цена зависит от количества проданных YES и NO токенов:

price_yes = e^(q_yes/b) / (e^(q_yes/b) + e^(q_no/b)) 

где b — параметр ликвидности. LMSR гарантирует, что маркетмейкер всегда принимает ставки, и максимальный убыток ограничен b * ln(2). Constant Product AMM (как в Uniswap v2) проще по газу, но цены менее точны вблизи 0% или 100%. Мы используем модифицированный constant product с ограничением диапазона цен [0.02, 0.98] — это защищает от бесконечных потерь при крайних исходах.

Oracle и резолюция: где прячется главная сложность

Рынок предсказаний без надёжного oracle — это рынок с мануальным арбитражем, который всегда под угрозой. Три подхода:

  • Chainlink Data Feeds — для финансовых рынков (цена ETH выше $5000?). Детерминированный, децентрализованный, но охватывает только финансы.
  • UMA Optimistic Oracle — для субъективных вопросов (исход выборов). Предложение ответа + период оспаривания + диспут через UMA token holders. Задержка 2-48 часов, но работает для любых вопросов.
  • Кастомный мультисиг oracle — набор доверенных сторон (5/9 multisig) голосует за исход. Централизованно, но прозрачно и быстро. Для закрытых рынков.
contract PredictionMarket { struct Market { bytes32 conditionId; address oracle; uint256 endTime; uint256 resolutionTime; MarketStatus status; uint128 yesReserve; uint128 noReserve; uint256 totalVolume; } enum MarketStatus { Open, Closed, Resolved, Disputed } mapping(bytes32 => Market) public markets; // AMM pricing function getPrice(bytes32 marketId, bool isYes) public view returns (uint256) { Market storage m = markets[marketId]; uint256 yesR = m.yesReserve; uint256 noR = m.noReserve; // constant product: price_yes = noR / (yesR + noR) в fixed point return (noR * 1e18) / (yesR + noR); } } 

Как защититься от манипуляций и атак?

Вектор атаки Защита
Oracle manipulation TWAP за 24-48 часов + несколько источников
Front-running резолюции Закрытие торгов за X часов до резолюции
Griefing через spam dispute Bond-требование для диспутов
Reentrancy при redeem Check-Effects-Interactions + ReentrancyGuard
Неправильный conditionId Двойная проверка перед деплоем
  • Oracle manipulation. Если рынок резолвится по on-chain цене в конкретный момент — flash loan атака возможна. Защита: TWAP за 24-48 часов вместо spot price, несколько независимых источников.
  • Front-running резолюции. Кто-то узнаёт исход до официальной резолюции и покупает токены по старой цене. Решение: закрытие торгов за X часов до резолюции.
  • Griefing через spam dispute. В optimistic oracle системах злоумышленник оспаривает каждую резолюцию. Защита: bond-требование для диспутов (залог теряется при проигрыше).
  • Reentrancy при redeem. CTF.redeemPositions переводит токены до обновления state. Используем Check-Effects-Interactions + ReentrancyGuard.
  • Неправильный conditionId. CTF использует keccak256(oracle, questionId, outcomeSlotCount). Проверяем conditionId дважды перед деплоем.

Governance и создание рынков

Кто может создавать рынки? Варианты:

  • Permissioned. Только whitelist операторов. Централизованно, но защищает от мусорных рынков.
  • Permissionless с bond. Любой, кто заплатит залог. Залог возвращается при корректной резолюции.
  • DAO governance. Голосование за каждый рынок. Медленно, но децентрализованно.

Для MVP — permissioned с roadmap к DAO.

Стек разработки

  • Foundry — основной инструмент. Fuzz-тесты для AMM математики.
  • Gnosis CTF — используем готовую имплементацию.
  • Chainlink — oracle для финансовых рынков.
  • OpenZeppelin — AccessControl, ReentrancyGuard, Pausable.
  • Slither + Echidna — статический анализ и property-based testing.
Полный список этапов работ
  1. Проектирование (3-5 дней). Выбор AMM/CLOB, oracle стратегии, governance модели. White paper с математикой.
  2. Разработка контрактов (7-10 дней). Market factory, AMM логика, CTF интеграция. У каждого модуля unit-тесты.
  3. Аудит и fuzzing (3-5 дней). Foundry fuzzer, Echidna для invariant testing, Slither на весь код.
  4. Фронтенд и The Graph (5-7 дней). Subgraph, TypeScript SDK, React-интерфейс.
  5. Тестирование на testnet (3-5 дней). Полный цикл: создание → торги → резолюция → redeem.

Общий срок — от 1-2 недель (только контракты) до 4-6 недель (полноценная платформа).

Что входит в работу

  • Документация: техническое задание, white paper, API-спецификации.
  • Исходный код смарт-контрактов с открытой лицензией.
  • Развёртывание на выбранной сети (Ethereum, Polygon, Arbitrum, BNB Chain).
  • Аудит безопасности с отчётом.
  • Интеграция с фронтендом (опционально) и The Graph subgraph.
  • Техническая поддержка на 3 месяца после деплоя.

Оценим ваш проект за 1-2 дня. Свяжитесь с нами для обсуждения деталей. Получите консультацию по вашему протоколу.