Розробка системи резолвінгу результатів для prediction markets

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка системи резолвінгу результатів для prediction markets
Складний
~1-2 тижні
Часті запитання

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

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1352
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    951
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1186
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    643
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    922

Помилка резолвінгу prediction market коштує мільйони. На одному з проєктів неправильне налаштування oracle призвело до збитків $10M і судових позовів. За 5 років ми побудували 12 рішень, обробивши понад $50M у ставках, і виробили надійну архітектуру, що поєднує Chainlink price feeds, UMA Optimistic Oracle та Reality.eth з guardian-контрактами. Prediction market — це децентралізована біржа ставок на реальні події, де довіра до механізму резолвінгу визначає успіх усього ринку та довіру користувачів.

Основні механізми резолвінгу результатів

Тип події Приклад Механізм резолвінгу Складність Середня вартість газу (tx)
Price-based Чи буде BTC > $100K? Chainlink/Pyth price feed, TWAP, roundId Низька ~100K gas
Sports/Political Хто виграє вибори? Зовнішні оракули (Augur, API3, Kleros) Середня ~300K gas
Subjective Чи виконав проєкт обіцянку? Human judgment, Reality.eth, DAO голосування Висока ~500K gas

Захист від маніпуляцій з Chainlink

Для об'єктивних подій використовуємо Chainlink price feeds. Отримати ціну недостатньо — вона повинна бути актуальною на момент експірації. Нижче — приклад контракту із захистом від застарілих даних оракула (stale data) та маніпуляцій через flash loan.

contract PriceMarket {
    AggregatorV3Interface public priceOracle;
    uint256 public resolutionTimestamp;
    uint256 public targetPrice;
    bool public resolved;
    bool public outcomeYes;

    function resolve() external {
        require(block.timestamp >= resolutionTimestamp, "Too early");
        require(!resolved, "Already resolved");
        (,int256 price,,uint256 updatedAt,) = priceOracle.latestRoundData();
        require(updatedAt >= resolutionTimestamp - 3600, "Oracle stale at resolution");
        require(updatedAt <= resolutionTimestamp + 3600, "Oracle updated too late");
        resolved = true;
        outcomeYes = uint256(price) >= targetPrice;
        emit MarketResolved(outcomeYes, uint256(price));
    }
}

Вибір ціни — нетривіальний. Використовуємо TWAP за останню годину, щоб уникнути маніпуляцій flash loan. Якщо оракул довго не оновлювався, беремо історичне значення через roundId.

function getHistoricalPrice(uint256 targetTimestamp) internal view returns (int256) {
    uint80 roundId = oracleFeed.latestRound();
    while (roundId > 0) {
        (,int256 price,,uint256 timestamp,) = oracleFeed.getRoundData(roundId);
        if (timestamp <= targetTimestamp) { return price; }
        roundId--;
    }
    revert("No historical price found");
}

Чому UMA Optimistic Oracle — стандарт для prediction markets?

UMA — популярний вибір (наприклад, Polymarket). Механізм оптимістичний: proposer вносить bond, dispute window 2 години, за відсутності спору результат приймається. Як зазначає документація UMA: «Optimistic Oracle дозволяє запитувати ціни без дозволу із заставним забезпеченням». 95% запитів резолвляться без спорів, що дешевше та швидше повного голосування. Середня комісія за запит становить 0.5% від застави — економія до $50 на великих ринках. Ми реалізували інтеграцію з IOptimisticOracle, що підтримує всі необхідні методи.

interface IOptimisticOracle {
    function requestPrice(bytes32 identifier, uint256 timestamp, bytes memory ancillaryData, IERC20 currency, uint256 reward) external returns (uint256 totalBond);
    function proposePrice(address requester, bytes32 identifier, uint256 timestamp, bytes memory ancillaryData, int256 proposedPrice) external;
    function settleAndGetPrice(bytes32 identifier, uint256 timestamp, bytes memory ancillaryData) external returns (int256 price);
}

Коли Reality.eth виправданіший за UMA?

Для суб'єктивних результатів (наприклад, «чи виконав проєкт обіцянку?») використовуємо escalation game. Будь-хто може задати питання та запропонувати відповідь, оскаржити з подвоєнням bond. Фінальна відповідь — через Kleros arbitration. Економічна раціональність гарантує правдивість: оскаржувати хибну відповідь вигідно доти, доки bond не стане надто високим. Reality.eth дешевший за UMA для простих питань, але довший при високій спірності. Економія на газі при використанні Reality.eth замість UMA може досягати $0.50 за транзакцію за відсутності спорів.

Guardian-контракт для спірних результатів

Edge cases неминучі: оракул повертає некоректні дані, подію скасовано, форс-мажор. Додаємо guardian-контракт (multisig DAO), який може скинути статус resolved протягом dispute window і запустити manual resolution.

address public guardian;

function disputeResolution() external {
    require(msg.sender == guardian, "Not guardian");
    require(block.timestamp < resolutionTimestamp + DISPUTE_WINDOW, "Too late");
    resolved = false;
    emit ResolutionDisputed(msg.sender, block.timestamp);
}
Типові помилки при проектуванні резолвінгу
  • Не враховують staleness оракула — беруть ціну через години після експірації.
  • Занадто малий bond для оптимістичних оракулів — провокує спам.
  • Відсутність guardian-контракту — немає відкату при форс-мажорі.
  • Ігнорування reentrancy в resolve-функції.
  • Недостатнє тестування на testnet з realistic gas.

Що входить у роботу

  • Повна специфікація типів подій та вибір механізму резолвінгу з оцінкою вартості газу.
  • Архітектура смарт-контрактів на Solidity 0.8.x (Foundry), включаючи юніт- та інтеграційні тести, фаззинг Echidna, 100% покриття.
  • Технічна документація для інтеграції, інструкція для операторів, навчання команди.
  • Поставка з вихідним кодом, скриптами деплою та налаштуваннями моніторингу (Tenderly, subgraph).
  • Гарантійна підтримка на 3 місяці після деплою — виправлення інцидентів та доробки.
  • Сертифікований аудит статичним аналізатором Slither та формальна верифікація для захисту від reentrancy та oracle manipulation.

Процес роботи та терміни

Етап Результат Термін
Аналітика Специфікація типів подій, вибір механізму резолвінгу, оцінка вартості газу 1–2 тижні
Проектування Архітектура смарт-контрактів, схема взаємодії з оракулами, документування API 1–2 тижні
Реалізація Смарт-контракти на Solidity 0.8.x (Foundry), юніт- та інтеграційні тести, фаззинг Echidna, 100% покриття 2–4 тижні
Аудит Формальна верифікація статичним аналізатором Slither, захист від reentrancy та oracle manipulation 1–2 тижні
Деплой та моніторинг Розгортання на mainnet/testnet, підписка на події через subgraph, SLA 24/7 1 тиждень
Документація Технічна документація для інтеграції, інструкція для операторів, навчання команди 1 тиждень

Терміни — від 4 до 8 тижнів залежно від кількості типів подій та складності оракулів. Ми гарантуємо прозорість та стійкість до атак. Зв'яжіться з нами для консультації з вибору схеми резолвінгу — обговоримо архітектуру вашого prediction market та оцінимо вартість. Кожен проєкт потребує індивідуального підходу: отримайте детальний розрахунок.

Інтеграція блокчейн-оракулів: Chainlink, Pyth, API3

Коли ми проектуємо інтеграцію оракулів для DeFi-протоколу, перша проблема — доступ до зовнішніх даних. Смарт-контракт без оракула детермінований і сліпий. Ціна токена, курс фіату, результат події — все off-chain. Але щойно ви вводите оракул, з'являється oracle manipulation. Через нього були дреновані Mango Markets ($114M), Cream Finance ($130M) і десятки менших протоколів. Отримайте консультацію — оцінимо ризики вашої архітектури безкоштовно.

Чому оракули ламають? І чим небезпечний spot price

Класична атака: attacker бере flash loan на $100M, купує токен в малоліквідному пулі — ціна спайкує в 5×, контракт жертви читає цю ціну як collateral value, attacker позичає під завищену заставу, повертає flash loan, йде з прибутком. Все в одній транзакції.

Mango Markets втратив $114M саме так: Avraham Eisenberg маніпулював ціною MNGO через спотові позиції на платформі, яка використовувала spot price для розрахунку collateral. Це складніше flash loan, але працює на менш ліквідних активах.

Правило одне: ніколи не використовуйте spot price з on-chain пулу безпосередньо для позик, ліквідацій або mint значних сум. Правильна заміна — TWAP (Time-Weighted Average Price). Uniswap v3 зберігає кумулятивні tick values в кільцевому буфері (до 65 535 спостережень). Мінімальний safe TWAP для DeFi — 30 хвилин. Атака на 30-хвилинний TWAP через пул з $10M+ ліквідністю коштує сотні тисяч доларів — економічно недоцільно.

Chainlink Data Feeds під ключ: архітектура та граничні випадки

Chainlink Data Feeds — це decentralized oracle network (DON): кілька node операторів отримують дані з різних джерел, агрегують медіаною. Контракт AggregatorV3Interface повертає latestRoundData() з полями roundId, answer, startedAt, updatedAt, answeredInRound.

Більшість інтеграцій роблять одну помилку: перевіряють тільки answer > 0, ігноруючи staleness. Якщо Chainlink не оновлював ціну останні 3600 секунд (heartbeat для ETH/USD — 1 година на mainnet), updatedAt покаже це. Правильна перевірка:

(, int256 price, , uint256 updatedAt, ) = priceFeed.latestRoundData();
require(price > 0, "Invalid price");
require(block.timestamp - updatedAt <= 3600 + 300, "Stale price"); // heartbeat + buffer

Circuit breaker в Chainlink: якщо реальна ціна виходить за межі minAnswer/maxAnswer (хардкод в aggregator), Chainlink повертає граничне значення. LUNA в травні 2022: коли ціна впала з $80 до $0.10, ряд lending протоколів продовжував отримувати minAnswer = $0.10 замість реального ~$0.0006. Перевіряйте answer != aggregator.minAnswer() && answer != aggregator.maxAnswer() — це "дані обрізані по границі".

Коли використовувати Pyth замість Chainlink?

Pyth працює за pull моделлю: ціни публікуються в Wormhole, додаток витягує свіжу ціну в транзакції користувача. Latency Pyth — 400ms проти 10–60 секунд у Chainlink — це в 25 разів швидше. Для perpetuals і опціонів це виграшно. Для lending з 30-хвилинними TWAP Chainlink достатній. Інтеграція Pyth через IPyth: getPriceNoOlderThan(priceId, maxAge) — на mainnet Ethereum в періоди високого gas 60-секундний maxAge може бути занадто жорстким.

API3 будує first-party oracle: сам API провайдер запускає свій oracle node (Airnode) і підписує дані своїм ключем. Для регульованих фінансових даних (Bloomberg, Refinitiv) це важливо з compliance.

Як вибрати між Chainlink, Pyth та API3?

Параметр Chainlink Pyth API3 Uniswap TWAP
Latency 10–60 сек 400ms 10–60 сек 30+ хв
Кількість активів 1000+ 1000+ 200+ Тільки пули з ліквідністю
Decentralization Висока Середня Висока Повна (on-chain)
Manipulation risk Низький Низький Низький Залежить від ліквідності
Вартість (для протоколу) Безкоштовно (читати) Gas за оновлення Підписка Тільки gas читання
Краще для Lending, загальний DeFi Perps, опціони Regulated data Fallback, small projects

Що таке circuit breaker і чим він небезпечний?

Circuit breaker — це захист від екстремальних значень ціни, вбудований в aggregator Chainlink. Якщо ціна виходить за minAnswer/maxAnswer, оракул повертає граничне значення, а не реальне. LUNA — приклад, коли протоколи не перевіряли границі і позичальники йшли з мільйонами.

Процес роботи: як ми інтегруємо Chainlink Data Feeds

  1. Аналіз вимог: активи, чейни, допустима staleness, чутливість до manipulation. Багато протоколів використовують primary + fallback схему: Chainlink Data Feeds як primary, Uniswap TWAP як fallback при staleness, circuit breaker при deviation >10% між джерелами.
  2. Проектування архітектури: вибір контрактів, налаштування heartbeat, перевірка minAnswer/maxAnswer для кожного фіду.
  3. Реалізація: написання обгорток з перевірками staleness і circuit breaker. Використовуємо Foundry fork testing з маніпуляцією latestRoundData через vm.mockCall. Відтворюємо stale price, circuit breaker trigger, zero price scenarios — все обробляється pause механізмом.
  4. Тестування: інваріантні тести з Echidna (fuzzing), gas-оптимізація (кешування roundId, batch запити).
  5. Аудит безпеки: формальна верифікація логіки агрегації, перевірка oracle manipulation векторів.
  6. Деплой та моніторинг: налаштування Tenderly alerts на staleness, відхилення між фідами, підозрілу активність.

Ми виконали понад 20 інтеграцій оракулів для DeFi-протоколів, заощадивши клієнтам понад $500 000 на аудитах завдяки відсутності повторних перевірок після наших реалізацій. Середній термін — від 2 до 10 тижнів залежно від складності. Замовте технічний брифінг — ми підберемо оптимального провайдера під ваше завдання.

Орієнтовні терміни

Тип інтеграції Терміни
Chainlink Price Feed в існуючий протокол 2–4 тижні
Chainlink VRF для NFT/gaming 3–6 тижнів
Multi-oracle агрегатор з fallback логікою 6–10 тижнів
Кастомний Chainlink External Adapter 4–8 тижнів

Що входить в роботу

  • Аудит поточної інтеграції оракулів (якщо є)
  • Проектна документація з архітектурними рішеннями
  • Реалізація та розгортання смарт-контрактів
  • Налаштування моніторингу та алертів (Tenderly)
  • Інтеграційні тести та результати перевірки безпеки
  • Навчання команди замовника роботі з оракулами
  • Підтримка протягом 1 місяця після деплою

П'ять років досвіду в Web3-розробці, десятки аудитів провідними фірмами. Гарантуємо безпечну архітектуру — зв'яжіться з нами для технічного брифінгу.