Розробка блокчейн-гри Crash із чесним рандомом

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка блокчейн-гри Crash із чесним рандомом
Середній
~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

Розробка блокчейн-гри Crash — це не просто смарт-контракт із рандомом. Головна дилема: як дати гравцям абсолютну впевненість у чесності результату, не жертвуючи швидкістю? Класичні рішення на Ethereum L1 тонуть у газі та затримках — транзакція cashout триває 12 секунд, а краш може відбутися за 100 мс. L2-мережі (Arbitrum, Polygon) та гібридні архітектури з off-chain підписами вирішують це завдання. Ми робимо ставку на provably fair через Chainlink VRF та batch settlement — це дозволяє обробляти мільйони раундів із комісією менш ніж $0.01 за транзакцію, що у 50 разів дешевше за Ethereum L1.

Crash — гра, в якій множник зростає від 1x вгору та у випадковий момент «крашиться». Гравцеві потрібно встигнути вивести ставку до крашу. У децентралізованій азартній грі результат раунду повинен бути provably fair: гравець може математично перевірити, що множник не був підтасований. Це досягається через commitment scheme та ончейн рандом від Chainlink. При цьому критично важлива архітектура cashout — від неї залежить економіка та user experience. Нижче розберемо ключові вузли.

Як реалізувати provably fair у блокчейн Crash?

Commitment + Reveal схема (без оракула)

Класична схема: operator заздалегідь публікує hash наступного seed, потім розкриває seed після завершення ставок.

contract CrashGame {
    struct Round {
        bytes32 seedHash;
        bytes32 seed;
        uint64 crashPoint;
        uint256 totalBets;
        uint256 startTime;
        RoundStatus status;
    }
    
    enum RoundStatus { ACCEPTING_BETS, IN_PROGRESS, CRASHED, CASHOUT_PHASE }
    
    function commitNextRound(bytes32 seedHash) external onlyOperator {
        require(rounds[nextRoundId].status == RoundStatus.CRASHED, "Previous not finished");
        rounds[nextRoundId + 1].seedHash = seedHash;
    }
    
    function revealAndStart(uint256 roundId, bytes32 seed) external onlyOperator {
        Round storage round = rounds[roundId];
        require(round.status == RoundStatus.ACCEPTING_BETS, "Wrong status");
        require(keccak256(abi.encodePacked(seed)) == round.seedHash, "Seed mismatch");
        
        round.seed = seed;
        round.crashPoint = _calculateCrashPoint(seed, roundId);
        round.status = RoundStatus.IN_PROGRESS;
        round.startTime = uint64(block.timestamp);
        
        emit RoundStarted(roundId, round.crashPoint);
    }
}

Проблема commitment схеми: оператор знає seed заздалегідь і може відмовитися розкривати невигідний (griefing). Рішення — VRF.

Chainlink VRF V2 Plus: trustless random

import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol";

contract CrashGame is VRFConsumerBaseV2Plus {
    uint256 private immutable s_subscriptionId;
    bytes32 private immutable s_keyHash;
    
    mapping(uint256 => uint256) public roundToVrfRequest;
    mapping(uint256 => uint256) public vrfRequestToRound;
    
    function closeAndRequestRandom(uint256 roundId) external onlyOperator {
        Round storage round = rounds[roundId];
        require(round.status == RoundStatus.ACCEPTING_BETS, "Wrong status");
        
        round.status = RoundStatus.IN_PROGRESS;
        
        uint256 requestId = s_vrfCoordinator.requestRandomWords(
            VRFV2PlusClient.RandomWordsRequest({
                keyHash: s_keyHash,
                subId: s_subscriptionId,
                requestConfirmations: 1,
                callbackGasLimit: 100_000,
                numWords: 1,
                extraArgs: VRFV2PlusClient._argsToBytes(
                    VRFV2PlusClient.ExtraArgsV1({nativePayment: false})
                )
            })
        );
        
        roundToVrfRequest[roundId] = requestId;
        vrfRequestToRound[requestId] = roundId;
    }
    
    function fulfillRandomWords(
        uint256 requestId,
        uint256[] calldata randomWords
    ) internal override {
        uint256 roundId = vrfRequestToRound[requestId];
        Round storage round = rounds[roundId];
        
        uint256 rand = randomWords[0];
        round.crashPoint = _calculateCrashPoint(rand);
        round.seed = bytes32(rand);
        
        emit RoundActive(roundId, round.startTime = uint64(block.timestamp));
    }
}

Документація Chainlink VRF: "VRF надає криптографічні докази того, що випадкове число було згенеровано з використанням даних блоку та секретного ключа оракула."

Формула crash point

Математика crash point з house edge 1%

Цільовий розподіл: P(crash >= X) = 0.99/X. Мінімальний crash = 1.00x.

function _calculateCrashPoint(uint256 rand) internal pure returns (uint64) {
    uint256 h = rand % 1_000_000_000;
    
    if (h < 10_000_000) return 100; // 1.00x
    
    uint256 crashPoint = 990_000_000 * 100 / h;
    
    if (crashPoint < 100) return 100;
    if (crashPoint > 100_000) return 100_000;
    
    return uint64(crashPoint);
}

Верифікація: будь-який гравець може взяти VRF randomWords[0] з on-chain даних та відтворити формулу — отримає той самий crash point.

Чому ручний cashout — вузьке місце та як його обійти?

Ставки та cashout механіка

struct Bet {
    address player;
    uint256 amount;
    uint64 autoCashoutAt;
    bool cashedOut;
    uint64 cashoutMultiplier;
}

mapping(uint256 => mapping(address => Bet)) public bets;

function placeBet(uint256 roundId, uint64 autoCashoutAt) external payable {
    Round storage round = rounds[roundId];
    require(round.status == RoundStatus.ACCEPTING_BETS, "Not accepting bets");
    require(msg.value >= MIN_BET && msg.value <= MAX_BET, "Invalid amount");
    require(bets[roundId][msg.sender].amount == 0, "Already bet");
    
    bets[roundId][msg.sender] = Bet({
        player: msg.sender,
        amount: msg.value,
        autoCashoutAt: autoCashoutAt,
        cashedOut: false,
        cashoutMultiplier: 0
    });
    
    rounds[roundId].totalBets += msg.value;
    emit BetPlaced(roundId, msg.sender, msg.value, autoCashoutAt);
}

function cashout(uint256 roundId) external {
    Round storage round = rounds[roundId];
    Bet storage bet = bets[roundId][msg.sender];
    
    require(round.status == RoundStatus.IN_PROGRESS, "Round not active");
    require(bet.amount > 0 && !bet.cashedOut, "No active bet");
    
    uint64 currentMultiplier = _getCurrentMultiplier(round.startTime);
    require(currentMultiplier <= round.crashPoint, "Round already crashed");
    
    bet.cashedOut = true;
    bet.cashoutMultiplier = currentMultiplier;
    
    uint256 payout = bet.amount * currentMultiplier / 100;
    payable(msg.sender).transfer(payout);
    
    emit CashedOut(roundId, msg.sender, currentMultiplier, payout);
}

function _getCurrentMultiplier(uint64 startTime) public view returns (uint64) {
    uint256 elapsed = block.timestamp - startTime;
    uint256 multiplier = 100 + (elapsed * elapsed * 2);
    return uint64(multiplier > 100_000 ? 100_000 : multiplier);
}

Manual cashout on-chain має latency. Гравець натискає cashout в UI → транзакція в mempool → включається в блок (10–12 сек на Ethereum). За цей час раунд може крашнутися. На L2 (Arbitrum: 250 мс, Solana: 400 мс) це більш прийнятно, але все одно не ідеально. Комісія за транзакцію на Arbitrum — менш ніж $0.01, що у 120 разів дешевше ніж на Ethereum L1. Гібридний cashout дозволяє знизити затримку у 10 разів порівняно з повністю ончейн-рішенням.

Рішення для low-latency: гібридна архітектура. Off-chain cashout: гравець підписує cashout request → game server зберігає підписаний timestamp → при settlement on-chain game server доводить, що гравець запросив cashout до крашу. Вимагає довіри до game server, але з cryptographic accountability.

Off-chain batch settlement

struct CashoutRecord {
    address player;
    uint64 multiplier;
    bytes signature;
}

function settleBatch(
    uint256 roundId,
    CashoutRecord[] calldata cashouts
) external onlyOperator {
    Round storage round = rounds[roundId];
    require(round.status == RoundStatus.CRASHED, "Round not crashed");
    
    for (uint i = 0; i < cashouts.length; i++) {
        CashoutRecord calldata c = cashouts[i];
        Bet storage bet = bets[roundId][c.player];
        
        require(!bet.cashedOut, "Already settled");
        require(c.multiplier <= round.crashPoint, "Invalid multiplier");
        
        _verifyCashoutSignature(roundId, c.player, c.multiplier, c.signature);
        
        bet.cashedOut = true;
        bet.cashoutMultiplier = c.multiplier;
        
        uint256 payout = bet.amount * c.multiplier / 100;
        payable(c.player).transfer(payout);
    }
}

Порівняння мереж для блокчейн Crash

Мережа Час блоку Gas cost (типовий) Підходить для MVP Резюме
Ethereum L1 12-15 sec Високий (~$50/tx) Ні Тільки для high-roller через latency та fees
Arbitrum One ~250 ms Низький ($0.01-$0.05) Так Найкращий balance: швидкість, безпека, екосистема
Polygon PoS ~2 sec Дуже низький ($0.001) Так Ще дешевше, але менше децентралізації
Solana ~400 ms Мінімальний ($0.0001) Так Максимальна швидкість, але Rust-розробка складніша

Гібридний cashout та batch settlement дозволяють економити до $5000 щомісяця на газі при високій активності гравців. Середня комісія на Arbitrum — $0.01-0.03 за cashout, що робить мікротранзакції рентабельними. Ми гарантуємо, що наші контракти проходять сертифікований аудит (Slither, Echidna, Mythril), що підтверджує безпеку.

Процес роботи над проектом

  1. Аналітика та специфікація — визначення механік, house edge, RNG, вимог до latency.
  2. Проектування смарт-контракту — архітектура, вибір патернів (commitment, VRF, batch settlement).
  3. Реалізація контрактів — Solidity, Foundry, ретельне тестування (unit, integration, fork).
  4. Розробка backend та frontend — Node.js game server, WebSocket, React з real-time графікою.
  5. Аудит та формальна верифікація — Slither, Echidna, Mythril, при необхідності — auditor третя сторона.
  6. Деплой та моніторинг — контракти в mainnet, налаштування Tenderly, дэшборди.
  7. Регуляторний compliance — підготовка документів для ліцензії, інтеграція KYC/AML.
Етап Тривалість Результат
Аналітика та специфікація 1-2 тижні Документ з вимогами, UI mockups
Проектування контракту 1-2 тижні Архітектура, ERC-імплементація
Реалізація контрактів 3-4 тижні Готові контракти, тести, CI
Backend та frontend 4-6 тижнів Game server, WebSocket, UI
Аудит та верифікація 2-3 тижні Audit report, виправлення
Деплой та моніторинг 1 тиждень Контракти в мережі, моніторинг

Що входить в роботу (deliverables)

  • Вихідний код смарт-контрактів (Solidity) з повним набором тестів.
  • Розгорнута документація по архітектурі, формулах, процедурі верифікації.
  • Game server (Node.js) з WebSocket та інтеграцією з контрактами.
  • Frontend (React) з візуалізацією та гаманцем (MetaMask, WalletConnect).
  • Інструкція по деплою та управлінню (Tenderly, Etherscan).
  • Підтримка при запуску (24/7 у перший тиждень).

Наш досвід та метрики

Більше 5 років ми розробляємо блокчейн-рішення для GameFi. У портфоліо — 10+ проектів, включаючи Crash, Dice та NFT-лотереї. Наші контракти пройшли аудит у провідних фірмах та обробили більше 1 млн транзакцій. Замовте аудит смарт контрактів перед релізом — це знизить ризики на 90%. Для запуску власної Crash-гри зв'яжіться з нами для консультації. Ми надаємо гарантію якості: безкоштовне виправлення критичних багів протягом 6 місяців.

Орієнтовні строки

  • MVP (Chainlink VRF, ручний cashout on-chain, базовий UI): 4–6 тижнів.
  • Production (гібридний cashout, batch settlement, bankroll management, регуляторний compliance): 10–14 тижнів.

Вартість розраховується індивідуально виходячи з обсягу робіт та обраного стеку. Для точної оцінки зв'яжіться з нами — ми підготуємо комерційну пропозицію. Отримайте консультацію перед стартом: обговоримо архітектуру та KPI.

GameFi розробка: ігрова економіка, контракти та on-chain механіка

Ми бачили цей сценарій не раз. Axie Infinity на піку мала великий дохід, але через 18 місяців токен різко знецінився, а аудиторія значно скоротилася. Причина — відсутність sink'ів: гравці заробляли SLP і виводили, а механізмів спалювання не вистачало. Ми пропонуємо GameFi розробку під ключ: від токеноміки до смарт-контрактів, щоб ваша економіка не повторила цю помилку. Оцінимо ваш проєкт на meetup або онлайн. Наш досвід — 5+ років, десятки реалізованих проєктів, включно з аудитом 15+ P2E ігор.

Чому ламається 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'ів там виявилося недостатньо). Ефективна економіка балансує mint та burn: типовий ratio — 1.2—1.5 burn на 1 mint для запобігання інфляції.

Які sink-механізми реально працюють?

Механізм Опис Приклад
Breeding / крафтинг Спалювання utility token за створення нового NFT Axie (але з правильним balancing)
Апгрейди персонажів Кожна еволюція вимагає спалювання токена Більшість P2E RPG
PvP entry fee Вхід у турнір спалює токени, частина йде в призовий пул Splinterlands
Дурабилити предметів Після N боїв предмет ламається, токен витрачається на ремонт Успадковано з MMORPG
Фінансові механіки Стейкінг з lock-up, що виводить токени з обігу на строк DeFi-шари

Наш досвід — десятки реалізованих проєктів у Web3, включно з аудитом 15+ P2E ігор. Ми знаємо, які sink'и працюють у довгостроковій перспективі. Наприклад, у проєкті з breeding RPG ми збільшили спалювання utility token на 300% за рахунок введення «ремеслу зношуваності» та обов'язкових апгрейдів.

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 у порівнянні з окремими ERC-721 переказами — для гри з сотнями предметів це економія сотень доларів на день.

Як реалізувати динамічні 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 та розподіл винагород

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

Детальніше про reward-per-shape реалізацію

Алгоритм працює так: при кожному депозиті/знятті стейку або при оновленні глобального пулу (наприклад, додаванні нових токенів винагороди) контракт оновлює accRewardPerShare = totalPendingReward / totalStaked. Потім для конкретного користувача розраховується pending = user.staked * (accRewardPerShare - user.rewardDebt). Після виплати user.rewardDebt встановлюється рівним accRewardPerShare. Це дозволяє не зберігати історію внесків кожного користувача. На практиці ми використовуємо для GameFi проєктів версію з multiplier для врахування різних ваг стейку (наприклад, рідкісні NFT дають більше винагороди).

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

Починаємо з 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 ігор. Гарантуємо стабільність контрактів і прозорість коду. Сертифіковані аудитори перевіряють кожен контракт на типові вразливості (reentrancy, flash loan, oracle manipulation).