Разработка 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 токена с гарантией безопасности и аудитом.