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







