Розробка ERC-1155 токена (мульти-токен)

ERC-721 хороший для унікальних активів, ERC-20 — для взаємозамінних. Але що робити, коли вашому проєкту потрібні обидва типи одночасно? Типова ситуація: в ігровому проєкті золото та ресурси — fungible токени, персонажі — NFT, зілля — semi-fungible (100 одиниць одного типу). До появи ERC-1155 для цьо

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

Часті запитання

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

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

ERC-721 хороший для унікальних активів, ERC-20 — для взаємозамінних. Але що робити, коли вашому проєкту потрібні обидва типи одночасно? Типова ситуація: в ігровому проєкті золото та ресурси — fungible токени, персонажі — NFT, зілля — semi-fungible (100 одиниць одного типу). До появи ERC-1155 для цього потрібно було деплоїти кілька контрактів — дорого та незручно. Ми розробляємо єдиний мульти-токен контракт на основі EIP-1155, який вирішує це завдання з суттєво меншим gas overhead. У цій статті розберемо технічні деталі: від проектування ID схеми до інтеграції з OpenSea. Наш досвід показує, що перехід на ERC-1155 знижує витрати на газ на 40–60%, що при активній торгівлі економить тисячі доларів на місяць. Зв'яжіться з нами для консультації — оцінимо ваш проєкт за 1 день.

Порівняння: ERC-1155 vs ERC-20+ERC-721

Критерій ERC-1155 Окремі ERC-20 + ERC-721
Кількість контрактів 1 2+
Gas на batch transfer 1 транзакція N транзакцій
Економія газу 40–60%
Semi-fungible Так Ні
Operator approval Глобальний (всі токени) По кожному контракту
Складність інтеграції Середня Висока

ERC-1155 виконує batch transfers у 3 рази швидше по газу порівняно з окремими ERC-20 та ERC-721 контрактами, що робить його ідеальним для high-volume ігор.

Як працює batch transfer в ERC-1155?

Головна перевага — можливість передавати кілька токенів різного типу за одну транзакцію. Замість N викликів transferFrom:

// ERC-721: N транзакцій for (uint i = 0; i < tokenIds.length; i++) { nft.transferFrom(from, to, tokenIds[i]); // N*gas } // ERC-1155: одна транзакція erc1155.safeBatchTransferFrom(from, to, ids, amounts, data); // ~gas 

Економія газу при batch transfer: 40–60% порівняно з роздільними транзакціями. Це критично для ігор з частими внутрішньоігровими переказами. В одному з кейсів для MMORPG з 10 000 щоденних транзакцій ми скоротили витрати на газ на $2 000 на місяць.

Чому варто використовувати OpenZeppelin для ERC-1155?

OpenZeppelin ERC1155 — перевірений та протестований базовий контракт. Він коректно реалізує callback-безпеку та включає корисні розширення. Ми завжди починаємо з нього:

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol"; contract GameItems is ERC1155, ERC1155Burnable, ERC1155Supply, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); mapping(uint256 => string) private _tokenURIs; constructor() ERC1155("") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); } function mint(address to, uint256 id, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) { _mint(to, id, amount, data); } function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) external onlyRole(MINTER_ROLE) { _mintBatch(to, ids, amounts, data); } } 

OpenZeppelin Contracts are audited by independent security firms and used in thousands of production contracts.

Проектування ID схеми: наш підхід на практиці

Для складних проєктів (наприклад, MMORPG з тисячами предметів) ми використовуємо bit-packed ID — різні частини uint256 кодують категорію, рідкість, тип та екземпляр. Це дозволяє фільтрувати токени без зберігання додаткових даних:

// Приклад: верхні 128 біт = тип, нижні 128 = instance ID uint256 constant TYPE_MASK = uint256(type(uint128).max) << 128; uint256 constant NF_INDEX_MASK = type(uint128).max; function getTokenType(uint256 id) internal pure returns (uint256) { return id & TYPE_MASK; } function isNonFungible(uint256 id) internal pure returns (bool) { return id & TYPE_MASK == id; // instance ID = 0 значить базовий тип } 

Така схема дає гнучкість: всередині одного контракту можна випускати як масові витратні матеріали, так і легендарні мечі з унікальними ID. Для проєктів з простою логікою підходить послідовна нумерація — дешевше на рівні обчислень, але складніше в аналітиці.

ID схема Гнучкість Gas cost Приклад використання
Послідовна Низька Низький Проста колекція токенів
Bit-packed Висока Середній MMORPG з категоріями
Хешування Середня Високий Динамічні властивості

On-chain метадані для простих токенів

Для базових активів (ігрова валюта, ресурси) ми зберігаємо атрибути прямо в контракті, генеруючи JSON через uri():

function uri(uint256 id) public view override returns (string memory) { ItemDefinition memory item = itemDefinitions[id]; return string(abi.encodePacked( 'data:application/json;base64,', Base64.encode(bytes(abi.encodePacked( '{"name":"', item.name, '","description":"', item.description, '","attributes":[{"trait_type":"rarity","value":"', item.rarity, '"}]}' ))) )); } 

Це виключає залежність від зовнішнього API та знижує ризики цензурування.

Типові помилки та як їх уникнути

Supply tracking

Використовуйте ERC1155Supply та явні перевірки в mint. Без цього totalSupply не оновиться автоматично при batch mint.

Reentrancy

_mint викликає onERC1155Received. Обов'язково застосовуйте ReentrancyGuard, щоб запобігти атакам повторного входу.

Callback-безпека

Перевіряйте, що отримувач-контракт реалізує IERC1155Receiver, інакше safeTransferFrom завершиться помилкою.

Operator approvals

В ERC-1155 апрув дається одразу на всі токени. Ми рекомендуємо білий список довірених операторів для мінімізації ризиків.

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

  • Проектування ID схеми під бізнес-логіку
  • Розробка смарт-контракту на Solidity з модульними тестами (Foundry)
  • Розгортання на Ethereum, Polygon, Arbitrum або BNB Chain
  • Інтеграція з OpenSea через EIP-2981 (роялті)
  • Повна документація та підтримка після запуску

Чому обирають нас

Ми займаємося Web3-розробкою з 2018 року, реалізували 30+ проєктів на Ethereum, Polygon та Solana. Кожен контракт проходить внутрішній аудит з використанням Slither та Mythril. Гарантуємо безпеку та відповідність стандартам.

Хочете обговорити розробку мульти-токен контракту? Напишіть нам — оцінимо проєкт за 1 день. Замовте розробку ERC-1155 токена з гарантією безпеки та аудитом.