Розробка системи енергії/витривалості GameFi

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

Розробка системи енергії/витривалості GameFi

Ми стикалися із завданням створення on-chain системи енергії, яка не спалює газ при регенерації. Звичайний підхід — оновлення storage щосекунди — вбиває економіку та робить гру неіграбельною. Наша реалізація використовує lazy evaluation, що дозволяє обчислювати поточну енергію без запису. За 5+ років досвіду ми виробили архітектуру, що балансує між gas economy та захистом від чітерів. У цій статті розберемо ключові механіки: time-based regen без write, прив'язку до NFT, tradeable energy та anti-cheat.

Система енергії — механіка обмеження ігрової активності. Гравець витрачає енергію на дії (битви, фармінг, крафт), енергія відновлюється з часом або через покупку. У Web2 це просто лічильник у базі даних. У Web3 це on-chain ресурс, що створює і можливості (tradeable енергія, verifiable regen), і проблеми (gas за кожне оновлення, cheating prevention). Правильна архітектура енергетичної системи — одна з ключових інженерних задач GameFi. Її неправильна реалізація або робить гру неіграбельною (занадто багато on-chain операцій), або відкриває експлойти (безкоштовна енергія через manipulation).

Архітектура lazy evaluation для економії газу

Інтуїтивне рішення: зберігати енергію в mapping, оновлювати щосекунди. Це погано — нескінченна кількість транзакцій. Правильний підхід: lazy evaluation. Зберігаємо не поточну енергію, а момент останньої зміни та значення в той момент. Поточна енергія обчислюється on-the-fly при кожному читанні:

contract EnergySystem {
    struct EnergyState {
        uint128 storedEnergy;
        uint64 lastUpdateTime;
        uint64 maxEnergy;
    }
    
    mapping(address => EnergyState) private energyStates;
    
    uint256 public constant REGEN_RATE = 1e18;
    uint256 public constant MAX_ENERGY = 100e18;
    
    function currentEnergy(address player) public view returns (uint256) {
        EnergyState storage state = energyStates[player];
        uint256 elapsed = block.timestamp - state.lastUpdateTime;
        uint256 regenerated = elapsed * REGEN_RATE;
        uint256 total = uint256(state.storedEnergy) + regenerated;
        uint256 max = state.maxEnergy == 0 ? MAX_ENERGY : uint256(state.maxEnergy);
        return total > max ? max : total;
    }
    
    function _updateEnergyState(address player) internal {
        EnergyState storage state = energyStates[player];
        state.storedEnergy = uint128(currentEnergy(player));
        state.lastUpdateTime = uint64(block.timestamp);
    }
    
    function spendEnergy(address player, uint256 amount) internal {
        uint256 current = currentEnergy(player);
        require(current >= amount, "Insufficient energy");
        _updateEnergyState(player);
        energyStates[player].storedEnergy -= uint128(amount);
    }
    
    function addEnergy(address player, uint256 amount) internal {
        _updateEnergyState(player);
        uint256 max = energyStates[player].maxEnergy == 0 
            ? MAX_ENERGY 
            : energyStates[player].maxEnergy;
        uint256 newEnergy = uint256(energyStates[player].storedEnergy) + amount;
        energyStates[player].storedEnergy = uint128(newEnergy > max ? max : newEnergy);
    }
}

Ключовий момент: currentEnergy()view функція, не витрачає gas. Storage оновлюється лише при spendEnergy/addEnergy — тобто при реальній ігровій дії. Lazy evaluation знижує gas consumption у 10 разів порівняно з постійним оновленням storage. Згідно з документацією Solidity, packed structs економлять storage gas.

Параметр Lazy evaluation Постійне оновлення
Write operations 0 у фоні, лише при дії Щосекунди (мільйони TX)
Gas cost за дію ~50 000 gas ~100 000 gas + фонові
Складність імплементації Середня Низька
Підходить для High-traffic GameFi Прості симуляції

Як прив'язати енергію до NFT?

Енергія прив'язана до конкретного NFT, а не до EOA гаманця. Це важливо: гравець може мати кілька персонажів з незалежною енергією, торгувати персонажами разом з їхньою поточною енергією.

contract CharacterEnergySystem {
    struct CharacterEnergy {
        uint128 storedEnergy;
        uint64 lastUpdate;
        uint8 tier;
    }
    
    mapping(uint256 => CharacterEnergy) public characterEnergy;
    
    function regenRateForTier(uint8 tier) public pure returns (uint256) {
        if (tier == 3) return 3e18;
        if (tier == 2) return 2e18;
        return 1e18;
    }
    
    function maxEnergyForTier(uint8 tier) public pure returns (uint256) {
        return 100e18 + uint256(tier) * 50e18;
    }
    
    function currentEnergy(uint256 tokenId) public view returns (uint256) {
        CharacterEnergy storage ce = characterEnergy[tokenId];
        uint8 tier = nftContract.getTier(tokenId);
        uint256 elapsed = block.timestamp - ce.lastUpdate;
        uint256 regen = elapsed * regenRateForTier(tier);
        uint256 total = uint256(ce.storedEnergy) + regen;
        uint256 max = maxEnergyForTier(tier);
        return total > max ? max : total;
    }
}

При трансфері NFT енергія переходить з персонажем автоматично, оскільки зберігається в маппінгу по tokenId.

Чому anti-cheat критичний?

Без захисту гравці можуть маніпулювати регенерацією через re-org або replay атак. Наше рішення використовує signed actions з nonce:

struct GameAction {
    uint256 characterId;
    uint256 actionType;
    uint256 energyCost;
    uint256 nonce;
    uint256 deadline;
}

mapping(address => uint256) public actionNonces;

function executeAction(
    GameAction calldata action,
    bytes calldata serverSignature
) external {
    bytes32 digest = _hashTypedData(action);
    address signer = ECDSA.recover(digest, serverSignature);
    require(signer == GAME_SERVER_SIGNER, "Invalid signature");
    require(action.nonce == actionNonces[msg.sender], "Invalid nonce");
    actionNonces[msg.sender]++;
    require(block.timestamp <= action.deadline, "Expired");
    spendEnergy(action.characterId, action.energyCost);
    _processAction(action);
}

Додатково вводимо cooldown модифікатор для частих дій:

mapping(uint256 => mapping(uint8 => uint256)) public lastActionTime;

uint256 public constant BOSS_FIGHT_COOLDOWN = 4 hours;

modifier withCooldown(uint256 charId, uint8 actionType, uint256 cooldown) {
    require(
        block.timestamp >= lastActionTime[charId][actionType] + cooldown,
        "Action on cooldown"
    );
    _;
    lastActionTime[charId][actionType] = block.timestamp;
}

function fightBoss(uint256 charId) external withCooldown(charId, ACTION_BOSS, BOSS_FIGHT_COOLDOWN) {
    spendEnergy(charId, BOSS_FIGHT_ENERGY_COST);
    // ...
}

Які ризики виникають при використанні ERC-20 енергії?

Більш складна модель: окремий ERC-20 токен як енергія, яку можна купити/продати. Trade-off: гравці можуть купити енергію на DEX → pay-to-win ризик. Якщо це допустимо — ERC-20 енергія дає економічну цінність. Якщо ні — енергія має бути non-transferable (не токен, а internal accounting).

Економічна модель: sink та source

Енергетична система працює як регулятор економіки. Важливо балансувати sources та sinks. Рекомендовані параметри:

Параметр Рекомендації
Regen rate Заповнення з 0 до max за 8–12 годин
Max energy 1–3 ігрових сесії по 2–3 години
Premium refill Не більше 2–3 повних refill на день
Tier multiplier Max 2x–3x, не більше

Орієнтири за термінами та вартістю

Базова система (lazy regen, spend, cooldowns): 2–3 тижні. Повна система (tier-based regen, ERC-20 energy token, DEX інтеграція, anti-cheat signed actions, dashboard аналітики): 5–7 тижнів. Вартість розраховується індивідуально після аналізу вашої механіки.

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

  • Аудит існуючої механіки
  • Проектування смарт-контрактів з урахуванням gas optimization
  • Розробка та unit-тести (Foundry з vm.warp)
  • Розгортання та верифікація контрактів
  • Інтеграція з ігровим бекендом (ethers.js, viem)
  • Документація API та приклади використання
  • Підтримка після релізу (1 місяць)
Приклад тесту регенерації в Foundry ```solidity function test_energyRegenOverTime() public { uint256 tokenId = 1; vm.prank(player); game.spendAllEnergy(tokenId); assertEq(energy.currentEnergy(tokenId), 0); vm.warp(block.timestamp + 50); assertEq(energy.currentEnergy(tokenId), 50e18); vm.warp(block.timestamp + 200); assertEq(energy.currentEnergy(tokenId), 100e18); } ```

Ми гарантуємо відсутність реентерабельності та використання перевірених патернів (OpenZeppelin). Наш досвід — 5+ років у Web3, 30+ реалізованих проєктів. Зв'яжіться з нами для консультації щодо вашої GameFi механіки. Замовте розробку системи енергії під ключ.

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).