Вы запускаете 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.
Полный список этапов работ
- Проектирование (3-5 дней). Выбор AMM/CLOB, oracle стратегии, governance модели. White paper с математикой.
- Разработка контрактов (7-10 дней). Market factory, AMM логика, CTF интеграция. У каждого модуля unit-тесты.
- Аудит и fuzzing (3-5 дней). Foundry fuzzer, Echidna для invariant testing, Slither на весь код.
- Фронтенд и The Graph (5-7 дней). Subgraph, TypeScript SDK, React-интерфейс.
- Тестирование на testnet (3-5 дней). Полный цикл: создание → торги → резолюция → redeem.
Общий срок — от 1-2 недель (только контракты) до 4-6 недель (полноценная платформа).
Что входит в работу
- Документация: техническое задание, white paper, API-спецификации.
- Исходный код смарт-контрактов с открытой лицензией.
- Развёртывание на выбранной сети (Ethereum, Polygon, Arbitrum, BNB Chain).
- Аудит безопасности с отчётом.
- Интеграция с фронтендом (опционально) и The Graph subgraph.
- Техническая поддержка на 3 месяца после деплоя.
Оценим ваш проект за 1-2 дня. Свяжитесь с нами для обсуждения деталей. Получите консультацию по вашему протоколу.







