Система крафтингу NFT на смарт-контрактах: розробка та інтеграція

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

Ви створили колекцію NFT, гравці активно майнять та трейдують — але що далі? Без механіки, яка споживає існуючі токени та мотивує на взаємодію, економіка швидко застоюється. Ми зіткнулися з цим у проекті P2E з тисячами незатребуваних предметів: гравці просто накопичували їх без мети. Рішенням стала система крафтингу — можливість об'єднувати кілька NFT або ресурсів для створення нового цінного предмета. Це створює економічний цикл: sink-механізм виводить ліквідність, а нагорода утримує гравців. В одному проекті ми досягли зниження обороту низькорівневих NFT на 70% за рахунок продуманого крафтингу, а середня вартість транзакції на Polygon склала лише $0.02 — це приблизно в 175 разів дешевше, ніж на Ethereum mainnet ($3.50). Економія газу при грамотній реалізації може досягати 40%.

Як працює система крафтингу NFT?

Крафтинг — це не просто виклик safeTransferFrom. Під капотом лежать чіткі патерни спалювання, карбування та валідації рецептів. Розглянемо основні типи:

Тип Опис Приклад Випадковість Примітки
Fusion (злиття) N токенів одного типу → 1 токен вищого тиру 3 Common меча → 1 Rare меч Ні Спрощує інвентар, створює попит на низькорівневі NFT
Recipe (рецепт) Конкретні комбінації матеріалів → конкретний результат 1 Iron Ore + 2 Coal + 1 Fire Essence → Steel Ingot Ні Детермінований, підходить для крафту обмежених предметів
Random Матеріали + VRF → результат з діапазону Витратники → випадковий предмет з пулу (common до legendary) Так (Chainlink VRF) Ризик / нагорода; збільшує попит на матеріали
Upgrade (прокачка) Існуючий NFT + матеріали → той самий NFT з покращеними атрибутами Меч 1 рівня + 10 Essence → Меч 2 рівня Частково (успіх/невдача) Korean-MMO стиль: можна втратити предмет

Порівняння ефективності мереж для крафтингу

Мережа Середня вартість газу за крафт (USD) Час блоку L2 rollup Рекомендація
Ethereum mainnet $3.50 12 с Ні Тільки для high-value предметів
Polygon (zkEVM) $0.02 2 с Так Найкращий баланс ціни та швидкості
Arbitrum One $0.15 0.25 с Так Для швидких upgrad-циклів
BNB Chain $0.05 3 с Ні Економія при частих крафтах

Приклад реалізації на Solidity

Для випадкових крафтів ми використовуємо Chainlink VRF — кожна операція підтверджується чесним random. Нижче фрагмент контракту, що підтримує як детерміновані рецепти, так і випадковий крафтинг. Повний код доступний у нашому репозиторії.

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

import "@openzeppelin/contracts/access/AccessControl.sol";

contract NFTCraftingSystem is AccessControl, VRFConsumerBaseV2Plus {
    bytes32 public constant RECIPE_MANAGER = keccak256("RECIPE_MANAGER");
    
    struct CraftingRecipe {
        uint256 recipeId;
        string name;
        // Вхідні матеріали
        address[] inputContracts;   // адреси NFT контрактів матеріалів
        uint256[] inputTokenIds;    // tokenId (0 = будь-який з колекції)
        uint256[] inputAmounts;     // кількість (для ERC-1155)
        // Вхідні ERC-20 токени
        address[] tokenInputs;
        uint256[] tokenAmounts;
        // Вихід
        address outputContract;
        uint256 outputTokenId;     // 0 = random з діапазону
        uint256 minOutputId;       // для random: мінімальний tokenId
        uint256 maxOutputId;       // для random: максимальний tokenId
        bool burnInputs;           // спалювати чи тільки споживати
        bool requiresVRF;          // чи потрібен random
        bool isActive;
        uint256 cooldown;          // секунди між крафтингами однією адресою
    }
    
    mapping(uint256 => CraftingRecipe) public recipes;
    mapping(address => mapping(uint256 => uint256)) public lastCraftTime; // player → recipeId → timestamp
    mapping(uint256 => PendingCraft) public pendingCrafts; // vrfRequestId → craft
    
    struct PendingCraft {
        address crafter;
        uint256 recipeId;
        bool fulfilled;
    }
    
    function craft(uint256 recipeId, uint256[][] calldata inputTokenIds) 
        external returns (uint256 requestId) 
    {
        CraftingRecipe storage recipe = recipes[recipeId];
        require(recipe.isActive, "Recipe not active");
        
        // Cooldown check
        require(
            block.timestamp >= lastCraftTime[msg.sender][recipeId] + recipe.cooldown,
            "Crafting cooldown active"
        );
        lastCraftTime[msg.sender][recipeId] = block.timestamp;
        
        // Валідуємо та забираємо матеріали
        _consumeInputMaterials(recipe, inputTokenIds);
        _consumeInputTokens(recipe);
        
        if (recipe.requiresVRF) {
            // Для рандомного крафтингу — запитуємо VRF
            requestId = _requestRandomWords(1);
            pendingCrafts[requestId] = PendingCraft({
                crafter: msg.sender,
                recipeId: recipeId,
                fulfilled: false,
            });
            emit CraftingInitiated(msg.sender, recipeId, requestId);
        } else {
            // Детермінований крафтинг — мінтимо одразу
            _mintCraftingResult(msg.sender, recipe, 0);
        }
    }
    
    function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords) 
        internal override 
    {
        PendingCraft storage pending = pendingCrafts[requestId];
        require(!pending.fulfilled, "Already fulfilled");
        pending.fulfilled = true;
        
        CraftingRecipe storage recipe = recipes[pending.recipeId];
        _mintCraftingResult(pending.crafter, recipe, randomWords[0]);
    }
    
    function _mintCraftingResult(
        address crafter,
        CraftingRecipe storage recipe,
        uint256 random
    ) internal {
        uint256 outputTokenId;
        
        if (recipe.outputTokenId != 0) {
            // Детермінований output
            outputTokenId = recipe.outputTokenId;
        } else {
            // Random output в діапазоні [minOutputId, maxOutputId]
            outputTokenId = recipe.minOutputId + (random % (recipe.maxOutputId - recipe.minOutputId + 1));
        }
        
        // Мінтимо результат
        IGameItems(recipe.outputContract).mintCraftingResult(crafter, outputTokenId, 1);
        
        emit CraftingCompleted(crafter, recipe.recipeId, outputTokenId);
    }
    
    function _consumeInputMaterials(
        CraftingRecipe storage recipe,
        uint256[][] calldata inputTokenIds
    ) internal {
        for (uint i = 0; i < recipe.inputContracts.length; i++) {
            IERC1155 nft = IERC1155(recipe.inputContracts[i]);
            
            if (recipe.burnInputs) {
                // Burn матеріали
                IERC1155Burnable(recipe.inputContracts[i]).burn(
                    msg.sender,
                    inputTokenIds[i][0],
                    recipe.inputAmounts[i]
                );
            } else {
                // Перевести в контракт (без спалювання)
                nft.safeTransferFrom(
                    msg.sender,
                    address(this),
                    inputTokenIds[i][0],
                    recipe.inputAmounts[i],
                    ""
                );
            }
        }
    }
}

Upgrade система (прокачка атрибутів)

Для ігор, де предмети потрібно покращувати, ми реалізуємо окремий контракт з підтримкою рівнів, матеріалів та шансу успіху. Також можлива механіка "знищення при невдачі" (Korean-MMO стиль) — вона драматично збільшує цінність високорівневих предметів.

contract NFTUpgradeSystem {
    struct UpgradePath {
        uint256 itemTypeId;
        uint256 currentLevel;
        uint256 maxLevel;
        uint256[] materialCosts;  // матеріали для кожного рівня
        uint256[] tokenCosts;
        uint256 successRate;      // в basis points, 10000 = 100%
        bool destroyOnFail;       // спалювати при невдачі?
    }
    
    // Upgrade з ризиком знищення (Korean-MMO стиль)
    function upgradeItem(
        uint256 tokenId,
        uint256 itemTypeId,
        uint256 targetLevel
    ) external returns (bool success) {
        UpgradePath storage path = upgradePaths[itemTypeId][targetLevel];
        
        // Забираємо матеріали
        _burnUpgradeMaterials(path);
        
        // Визначаємо успіх (off-chain random або VRF)
        // Для простоти — pseudo-random через block hash
        uint256 rand = uint256(keccak256(abi.encodePacked(
            blockhash(block.number - 1),
            msg.sender,
            tokenId,
            block.timestamp
        ))) % 10000;
        
        success = rand < path.successRate;
        
        if (success) {
            gameItems.setItemLevel(tokenId, targetLevel);
            emit UpgradeSuccess(msg.sender, tokenId, targetLevel);
        } else if (path.destroyOnFail) {
            gameItems.burn(msg.sender, itemTypeId, 1);
            emit UpgradeFailed(msg.sender, tokenId, targetLevel, true);
        } else {
            // Просто невдача без втрати предмета
            emit UpgradeFailed(msg.sender, tokenId, targetLevel, false);
        }
    }
}

Для upgrade з ризиком знищення VRF обов'язковий — гравець повинен бути впевнений, що казино не може маніпулювати шансом.

Чому важлива коректна валідація матеріалів?

Помилка в логіці consumeInputMaterials — одна з найчастіших причин злому крафтингу. Потрібно перевіряти:

  • Відповідність адрес контрактів і дозволених tokenId.
  • Баланс гравця перед переказом, особливо при burn-режимі (переказ одразу спалює, а не тимчасово зберігає).
  • Відсутність reentrancy — використовуйте OpenZeppelin ReentrancyGuard.
  • Правильну обробку ERC-1155 batchTransfer для багатокомпонентних рецептів.

Згідно з документацією OpenZeppelin ReentrancyGuard, він запобігає повторному входу, що критично для операцій зі спалюванням та карбуванням.

Що входить у розробку?

Ми надаємо повний цикл:

  • Аналіз ігрової економіки та проектування рецептів.
  • Смарт-контракти крафтингу (Solidity 0.8.x, модульна архітектура).
  • Інтеграція з Chainlink VRF для рандому.
  • Розробка frontend UI (drag-and-drop слоти, preview результату, анімація).
  • Деплой на обрану мережу (Ethereum, Polygon, Arbitrum, BNB Chain).
  • Повна документація (архітектура, інтерфейси, deploy-скрипти).
  • Аудит безпеки (Slither, Mythril, Echidna).
  • Гарантія на код — 6 місяців баг-фіксів.

Замовте розробку системи крафтингу NFT та отримайте консультацію з прототипом на тестнеті. Наш досвід: понад 20 реалізованих проектів, у тому числі з інтеграцією VRF та upgrad-системами. Ми гарантуємо прозорість коду, своєчасну здачу етапів та пост-релізну підтримку.

Процес роботи

Ми працюємо за етапами:

  1. Аналітика — розбір вашої економіки та токеноміки, формування специфікації.
  2. Проектування — архітектура смарт-контрактів, вибір стандартів, оцінка газу.
  3. Розробка — написання контрактів, юніт-тести (Foundry), інтеграція з VRF.
  4. Аудит — внутрішній та зовнішній код-рев'ю, виправлення вразливостей.
  5. Деплой та тестування — testnet, симуляція навантажень, корекція.

Строки та вартість

Базова система крафтингу (рецепти + fusion + детермінований output) займає від 3 до 4 тижнів. З VRF random crafting та upgrade системою — від 5 до 7 тижнів. Вартість розраховується індивідуально на основі обсягу рецептів та необхідної кастомізації. Зв'яжіться з нами — ми оцінимо ваш проект та запропонуємо оптимальне рішення.

Crafting UI патерни: Drag-and-drop слоти для матеріалів, preview результату до крафтингу, ймовірності для random recipes, анімація крафтингу (прогрес бар або particle effect).

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