Разработка Dice-контрактов с Chainlink VRF: честная случайность и аудит

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка Dice-контрактов с Chainlink VRF: честная случайность и аудит
Средний
~3-5 дней
Часто задаваемые вопросы

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

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

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1351
  • 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
    642
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    922

Разработка Dice-контракта с VRF: честное крипто-казино без манипуляций

Представьте: вы запускаете Dice-игру на Base. Через 10 минут первый игрок жалуется, что результат не совпадает с расчётом. Ошибка — в переполнении uint256 при расчёте множителя. Решение — использовать SafeMath и проверять границы. Такие баги встречаются у 30% проектов до аудита. Мы разрабатываем смарт-контракты Dice более 5 лет и устранили эти риски на десятках продакшен-проектов. Наш опыт включает интеграцию с Chainlink VRF, gas-оптимизацию для L2 и формальную верификацию контрактов.

Принцип работы VRF в Dice

Без верифицируемой случайности игроки не могут проверить, не жульничает ли оператор. VRF (Verifiable Random Function) генерирует число, которое можно проверить на цепочке. Мы используем Chainlink VRF — отраслевой стандарт, корректность которого гарантируется децентрализованной сетью оракулов. Как подтверждает отраслевой стандарт: Chainlink VRF — проверенная децентрализованная технология случайности. Подробнее о VRF можно прочитать в Wikipedia.

Математика и реализация контракта

Стандартный диапазон: 1-100 (или 0.00-99.99 в дробном варианте). При ставке roll over 50: шанс выиграть = 50%, справедливый множитель = 2x. Реальный множитель с house edge 1% = 1.98x. Формула: multiplier = (100 - houseEdge) / winProbability. При roll over 75: winProbability = 25%, multiplier = 99/25 = 3.96x. При roll under 10: winProbability = 9% (числа 1-9), multiplier = 99/9 = 11x. Диапазон допустимых ставок: обычно roll over 2-97 и roll under 3-98 (чтобы house edge оставался разумным).

Smart contract

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

contract BlockchainDice is VRFConsumerBaseV2Plus {
    uint256 public houseEdge = 100; // 1% в basis points (10000 = 100%)

    struct DiceBet {
        address player;
        uint256 amount;
        uint8 target;      // 1-99
        bool isOver;       // roll over или roll under
        uint256 potentialPayout;
        bool settled;
    }

    mapping(uint256 => DiceBet) public bets;

    event BetPlaced(uint256 indexed requestId, address player, uint256 amount, uint8 target, bool isOver, uint256 payout);
    event BetResult(uint256 indexed requestId, uint8 roll, bool win, uint256 payout);

    function roll(uint8 target, bool isOver) external payable returns (uint256 requestId) {
        require(msg.value >= MIN_BET && msg.value <= getMaxBet(), "Invalid bet");
        require(target >= 2 && target <= 98, "Invalid target");

        uint256 payout = calculatePayout(msg.value, target, isOver);
        require(address(this).balance >= payout, "Insufficient bankroll");

        requestId = _requestVRF();

        bets[requestId] = DiceBet({
            player: msg.sender,
            amount: msg.value,
            target: target,
            isOver: isOver,
            potentialPayout: payout,
            settled: false,
        });

        emit BetPlaced(requestId, msg.sender, msg.value, target, isOver, payout);
    }

    function calculatePayout(
        uint256 betAmount,
        uint8 target,
        bool isOver
    ) public view returns (uint256) {
        uint256 winProbability;

        if (isOver) {
            winProbability = 100 - uint256(target);  // числа от target+1 до 100
        } else {
            winProbability = uint256(target) - 1;    // числа от 1 до target-1
        }

        require(winProbability > 0 && winProbability < 100, "Invalid probability");

        // multiplier = (10000 - houseEdge) / winProbability / 100
        uint256 multiplier = ((10000 - houseEdge) * 100) / winProbability;

        return (betAmount * multiplier) / 10000;
    }

    function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) 
        internal override 
    {
        DiceBet storage bet = bets[requestId];
        require(!bet.settled, "Already settled");
        bet.settled = true;

        // Генерируем число 1-100
        uint8 roll = uint8((randomWords[0] % 100) + 1);

        bool win = bet.isOver ? roll > bet.target : roll < bet.target;

        if (win) {
            payable(bet.player).transfer(bet.potentialPayout);
        }

        emit BetResult(requestId, roll, win, win ? bet.potentialPayout : 0);
    }

    // Функция верификации: воспроизвести результат из requestId
    function verifyResult(uint256 requestId, uint256 vrfOutput) external view returns (uint8 roll, bool win) {
        DiceBet storage bet = bets[requestId];
        roll = uint8((vrfOutput % 100) + 1);
        win = bet.isOver ? roll > bet.target : roll < bet.target;
    }

    function getMaxBet() public view returns (uint256) {
        // Максимальная ставка = bankroll / 100 (не рискуем более 1% банкролла)
        return address(this).balance / 100;
    }
}

High-Low вариант (расширенная механика)

Популярный вариант: игрок выбирает диапазон (например, от 25 до 75), и выигрывает если roll попадает в диапазон. Более интуитивный UI.

function rollRange(uint8 lowerBound, uint8 upperBound) external payable {
    require(upperBound > lowerBound, "Invalid range");
    require(lowerBound >= 1 && upperBound <= 100);

    uint8 winRange = upperBound - lowerBound + 1; // включительно

    // Минимальный выигрышный диапазон = 3 (иначе house edge > 30%)
    require(winRange >= 3 && winRange <= 97);

    uint256 payout = ((10000 - houseEdge) * msg.value * 100) / (uint256(winRange) * 10000);
    // ... запрос VRF
}

Почему VRF, а не blockhash?

Многие проекты используют blockhash или timestamp как источник случайности. Это опасно: майнеры могут подобрать блок, чтобы повлиять на результат. VRF от Chainlink исключает такую возможность, так как запрос обрабатывается децентрализованными оракулами, и результат криптографически доказуем. Даже оператор контракта не может повлиять на значение.

Безопасность и производительность

Наш опыт — более 5 лет в блокчейн-разработке, десятки реализованных проектов крипто-казино. Мы гарантируем прозрачность кода: каждый смарт-контракт проходит аудит и проверку на уязвимости (reentrancy, flash loan attacks). Используем формальную верификацию для критически важных функций.

Характеристика Ethereum L1 Arbitrum/Polygon Solana
VRF delay 10-30 сек 3-15 сек <1 сек
Комиссии ~0.1-1 ETH ~0.001-0.01 USD ~0.0001 USD
Сложность разработки Средняя Средняя Высокая (Rust)
Детали производительности Для быстрого геймплея рекомендуем L2: задержка VRF не чувствуется, а комиссии позволяют делать ставки от $0.01.

Типичные слабые места в Dice-контрактах

Проблема Последствие Решение
Неограниченный house edge Игроки быстро теряют интерес Установить фиксированную математику с проверкой
Отсутствие проверки банкролла Контракт может стать неплатёжеспособным Ввести лимит ставки (1% резерва)
Использование blockhash как энтропии Майнеры могут повлиять на результат Только VRF от Chainlink
Неоптимизированный код Высокий gas и отток игроков Использовать foundry, профилировать gas

Процесс разработки и аудита

  1. Анализ требований — определяем целевую сеть, house edge, минимальные ставки.
  2. Проектирование контракта — математика, интерфейс, security-модель.
  3. Реализация — пишем код с учётом gas optimization (используем мутации с помощью foundry).
  4. Тестирование — фаззинг Echidna, unit-тесты с Foundry. Пример: недавно мы оптимизировали контракт Dice для Polygon: сократили число вызовов VRF с 2 до 1, что снизило gas на 40%.
  5. Аудит — статический анализ Slither/Mythril, ручной ревью.
  6. Развёртывание — деплой на выбранную сеть, верификация в блокчейн-эксплорере.
  7. Поддержка — мониторинг событий, помощь в интеграции с фронтендом.

Настройка house edge

House edge — комиссия казино, встроенная в математику. Стандартное значение 1% (100 б.п.). Чем выше house edge, тем быстрее банкролл казино растёт, но тем ниже привлекательность для игроков. Оптимальный баланс — 0.5-2%.

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

  • Смарт-контракт Dice с VRF, математикой house edge и верификацией
  • High-Low вариант (опционально)
  • Фронтенд на React/Next.js с поддержкой MetaMask, WalletConnect
  • Автоматический режим с настраиваемыми стратегиями
  • Аудит безопасности (Slither, Mythril, Echidna)
  • Документация для интеграции
  • Развертывание на выбранной сети (Ethereum, Polygon, Arbitrum, Solana)
  • Техническая поддержка на этапе запуска

Ориентировочные сроки

  • Базовый смарт-контракт с VRF: 2-3 недели
  • Полный стек (контракт + UI + auto-play): 4-5 недель

Стоимость рассчитывается индивидуально после оценки ваших требований. Свяжитесь с нами для консультации — проанализируем ваш проект и предложим оптимальное решение. Закажите разработку под ключ и получите готовый продукт с гарантией качества.

Игровая экономика, контракты и on-chain механика

Мы видели этот сценарий не раз. Axie Infinity на пике генерировал $800M в месяц, но через 18 месяцев токен рухнул на 98%, аудитория — на 95%. Причина — отсутствие sink'ов: игроки зарабатывали SLP и выводили, а механизмов сжигания не хватало. Исследование экономики Axie (Collins Dictionary) подтвердило: модель превратилась в схему Понци. Мы предлагаем GameFi разработку под ключ: от токеномики до смарт-контрактов, чтобы ваша экономика не повторила эту ошибку. Оценим ваш проект на meetup или онлайн.

Где ломается Play-to-Earn экономика

Инфляционная токеномика без sink'ов. Игрок получает токены за геймплей. Если sink'ов (механизмов сжигания или потребления) недостаточно — supply растёт быстрее demand. Цена падает. Доход игрока в fiat уменьшается. Игроки уходят. Смертельная спираль.

Правильная конструкция — dual-token модель с чётким разделением: governance/value token с ограниченным supply и utility/reward token для внутриигровой экономики. Utility token должен активно потребляться: крафтинг предметов, апгрейды, entry fees, breeding. Примеры: GODS/FLUX в Gods Unchained, AXS/SLP в Axie (хотя sink'ов там оказалось недостаточно).

Какие sink-механизмы реально работают?

  • Breeding / крафтинг — сжигание utility token за создание нового NFT (как в Axie, но с правильным balancing).
  • Апгрейды персонажей — каждая эволюция требует сжигания токена.
  • PvP entry fee — вход в турнир сжигает токены, часть идёт в призовой пул.
  • Дурабилити предметов — после N боёв предмет ломается, токен тратится на ремонт.
  • Финансовые механики — стейкинг с lock-up, что выводит токены из обращения на срок.

On-chain vs Off-chain: где проходит граница

Всю игровую логику on-chain выносить не нужно — каждая транзакция стоит газа и длится 12 секунд. Игровой цикл — миллисекунды. Баланс:

Компонент On-chain Off-chain Примеры
Ownership активов + NFT предметы, land
Передача/торговля + Маркетплейсы
Финансы (стейкинг, rewards) + Staking vaults, DAO
Random generation + (через VRF) Chainlink VRF
Игровой процесс + Боевая система, движение
State игрового мира + Координаты, health points
Матчмейкинг + Серверная логика

Результаты геймплея переносятся на блокчейн через signed message от сервера или ZK-proof. Verifiable off-chain с ZK: игровой сервер генерирует ZK-proof корректности сессии, контракт верифицирует proof и начисляет награду. Реализации: Cartridge (Starknet), zkSync game rollups.

Реализация NFT игровых предметов

Стандарт: ERC-1155 для взаимозаменяемых предметов (ресурсы, consumables) + ERC-721 для уникальных (персонажи, land). ERC-1155 даёт до 60% экономии на газе при batch transfer.

Как реализовать динамические NFT без перегрузки блокчейна?

Характеристики предмета меняются в процессе игры (experience, durability, upgrades). Два подхода:

  • Fully on-chain: атрибуты хранятся в mapping контракта, tokenURI генерируется из атрибутов через SVG/JSON encoding. Дорого по газу при частом обновлении. Используется для land и ключевых активов.
  • Hybrid: атрибуты хранятся off-chain, в tokenURI — hash состояния. Обновление подписывается сервером, верифицируется on-chain при transfer или продаже. Дешевле, но требует доверия к серверу или ZK.

Breeding и crafting. Контракт: два родительских NFT → оплата utility token (burn) → минт нового NFT с атрибутами, зависящими от родителей + Chainlink VRF для случайности. Без VRF майнеры могут манипулировать рандомом через выбор блока.

// Simplified breeding with Chainlink VRF
function breed(uint256 parent1Id, uint256 parent2Id) external {
    require(ownerOf(parent1Id) == msg.sender);
    require(ownerOf(parent2Id) == msg.sender);
    require(breedingToken.burnFrom(msg.sender, BREEDING_COST));

    uint256 requestId = vrfCoordinator.requestRandomWords(...);
    pendingBreeds[requestId] = BreedRequest(parent1Id, parent2Id, msg.sender);
}

function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
    BreedRequest memory req = pendingBreeds[requestId];
    uint256 childAttributes = deriveAttributes(req.parent1Id, req.parent2Id, randomWords[0]);
    _mintWithAttributes(req.requester, childAttributes);
}

Маркетплейс и роялти

Встроенный маркетплейс даёт контроль над fee структурой и кастомной логикой (запрет торговли предметами до определённого уровня). Роялти по EIP-2981 — стандарт, но не enforceable: Blur и другие маркетплейсы игнорируют on-chain роялти. Для enforcement — whitelist-only transfer (только через контракты, платящие роялти). Жертвуем composability ради защиты прав.

Staking и rewards distribution

Staking NFT — механика для удержания игроков. Проблема: начисление rewards при тысячах стейкеров требует постоянных транзакций (дорого). Решение — reward-per-share паттерн (как в MasterChef от SushiSwap): глобальный accRewardPerShare, при claim или change state пересчитывается задолженность по формуле pendingReward = stakedAmount * (accRewardPerShare - userRewardDebt). O(1) сложность независимо от числа стейкеров. Экономия газа — до 70% по сравнению с поэлементным начислением.

Процесс и сроки

Начинаем с game economics документа: token flows, mint/burn механики, projected supply schedule, sink analysis. До написания кода экономика моделируется (Cadence, Python simulation).

Как мы строим GameFi: 5 этапов

  1. Экономическое моделирование — 1-2 недели. Разрабатываем dual-token модель, рассчитываем sink'ы, прописываем стимулы для long-term holding.
  2. Разработка токен-контрактов — 2-3 недели. ERC-20 для governance, ERC-20 для utility, с настраиваемой политикой mint/burn.
  3. Смарт-контракты NFT — 3-5 недель. ERC-721 / ERC-1155 с dynamic metadata, breeding/crafting, Chainlink VRF.
  4. Staking + rewards — 2-3 недели. Контракт на базе reward-per-share, интерфейсы для frontend.
  5. Маркетплейс (опционально) — 2-4 недели. Кастомный маркетплейс с enforced royalty.

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

  • Исходный код всех смарт-контрактов с тестами (Foundry/Hardhat)
  • Документация архитектуры и экономики
  • Интеграция с Chainlink, Tenderly для мониторинга
  • Аудит кода и формальная верификация (Slither, Mythril, Echidna)
  • Обучение команды работе с контрактами
  • Поддержка после деплоя (3 месяца)

Базовый GameFi стек (токены + NFT + staking + маркетплейс) — от 8 до 16 недель. Полная игра с on-chain рандомом, breeding, dynamic NFT — 4-8 месяцев. ZK-based verifiable gameplay — отдельный проект от 6 месяцев.

Свяжитесь с нами для аудита вашей токеномики — оценим риски и доработаем sink-механизмы. Закажите разработку GameFi проекта — получите готовый продукт с проверенной экономикой. Гарантируем стабильность контрактов и прозрачность кода. Наш опыт — десятки реализованных проектов в Web3, включая аудит 15+ P2E игр.