Мульти-токенный стандарт ERC-1155
Изучите мульти-токенный стандарт ERC-1155, который позволяет одному контракту совместно управлять взаимозаменяемыми, полу-взаимозаменяемыми и невзаимозаменяемыми токенами для эффективных пакетных операций с небольшим расходом газа.
«Мульти-токенный стандарт ERC-1155» — бесплатный урок Blockchain Smart Contracts with Solidity на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Blockchain Smart Contracts with Solidity, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Blockchain Smart Contracts with Solidity содержит 4 уроков всего.
Части этого урока еще не переведены и отображаются на английском.
Why ERC-1155 Exists
ERC-20 manages one fungible token; ERC-721 manages unique NFTs. But a game may need thousands of item types mixing both. Deploying a separate contract per type is wasteful.
ERC-1155 is a single contract that can manage many token IDs at once, each of which can be fungible or non-fungible.
Token IDs as Categories
In ERC-1155 each token is identified by a numeric id. The same id can have a balance greater than one (fungible) or a supply of exactly one (non-fungible).
id = 1with balance 500 = a fungible gold coinid = 2with balance 1 = a unique sword NFT
Core Balance Mapping
The heart of an ERC-1155 contract is a nested mapping from id to owner to balance.
mapping(uint256 => mapping(address => uint256)) private _balances;
function balanceOf(address account, uint256 id) public view returns (uint256) {
return _balances[id][account];
}Batch Balance Queries
A signature feature is balanceOfBatch, which returns many balances in one call, saving round trips.
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public view returns (uint256[] memory)
{
require(accounts.length == ids.length, 'length mismatch');
uint256[] memory batch = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; i++) {
batch[i] = _balances[ids[i]][accounts[i]];
}
return batch;
}Batch Transfers
ERC-1155 lets you move several token types in a single transaction with safeBatchTransferFrom. This is far cheaper than many separate ERC-20/721 transfers.
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) public {
require(ids.length == amounts.length, 'length mismatch');
for (uint256 i = 0; i < ids.length; i++) {
_balances[ids[i]][from] -= amounts[i];
_balances[ids[i]][to] += amounts[i];
}
}Approval For All
Instead of per-token approvals, ERC-1155 uses a single operator approval: setApprovalForAll grants an address permission to move every token you own.
mapping(address => mapping(address => bool)) private _operatorApprovals;
function setApprovalForAll(address operator, bool approved) public {
_operatorApprovals[msg.sender][operator] = approved;
}
function isApprovedForAll(address owner, address operator) public view returns (bool) {
return _operatorApprovals[owner][operator];
}The Shared Metadata URI
ERC-1155 uses one URI template for all tokens. The placeholder {id} is replaced by the hex token id by clients.
Example: https://game.example/api/{id}.json
string private _uri = 'https://game.example/api/{id}.json';
function uri(uint256) public view returns (string memory) {
return _uri;
}Minting Tokens
Minting increases a balance for an id. The same internal logic works for both fungible (amount > 1) and non-fungible (amount = 1) tokens.
function _mint(address to, uint256 id, uint256 amount) internal {
require(to != address(0), 'mint to zero');
_balances[id][to] += amount;
emit TransferSingle(msg.sender, address(0), to, id, amount);
}
event TransferSingle(address operator, address from, address to, uint256 id, uint256 value);Safe Transfer Receiver Check
Like ERC-721, ERC-1155 protects against tokens being locked in contracts. A receiving contract must implement onERC1155Received and return its magic value, or the transfer reverts.
interface IERC1155Receiver {
function onERC1155Received(
address operator, address from,
uint256 id, uint256 value, bytes calldata data
) external returns (bytes4);
}Using OpenZeppelin
In practice you inherit the audited OpenZeppelin implementation rather than writing it from scratch.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import '@openzeppelin/contracts/token/ERC1155/ERC1155.sol';
contract GameItems is ERC1155 {
uint256 public constant GOLD = 0;
uint256 public constant SWORD = 1;
constructor() ERC1155('https://game.example/api/{id}.json') {
_mint(msg.sender, GOLD, 1000, '');
_mint(msg.sender, SWORD, 1, '');
}
}When To Choose ERC-1155
Pick ERC-1155 when you have many token types, need batch operations, or mix fungible and non-fungible assets. Stick with ERC-20/721 for a single, simple asset where the extra complexity is not justified.
Quick Check
Test your understanding of ERC-1155.
Recap
You learned that ERC-1155 is a multi-token standard managing many IDs in one contract. Key points:
- Nested
id => owner => balancemapping - Batch queries and transfers save gas
- Single operator approval and shared
{id}URI - Safe-transfer receiver checks protect against locked tokens
It is the standard of choice for games and marketplaces with many asset types.
Изучай Blockchain Smart Contracts with Solidity с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 12
- Уроки
- 48
Часто задаваемые вопросы
Урок «Мульти-токенный стандарт ERC-1155» бесплатный?
Да — полный текст урока «Мульти-токенный стандарт ERC-1155» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Blockchain Smart Contracts with Solidity, подпишись на CoddyKit PRO. Курс Blockchain Smart Contracts with Solidity содержит 4 уроков всего.
Чему я научусь в уроке «Мульти-токенный стандарт ERC-1155»?
Изучите мульти-токенный стандарт ERC-1155, который позволяет одному контракту совместно управлять взаимозаменяемыми, полу-взаимозаменяемыми и невзаимозаменяемыми токенами для эффективных пакетных опе… Ты практикуешь Blockchain Smart Contracts with Solidity с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Blockchain Smart Contracts with Solidity?
Предыдущий опыт не требуется. Blockchain Smart Contracts with Solidity на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Мульти-токенный стандарт ERC-1155»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Blockchain Smart Contracts with Solidity?
Да. Каждый урок Blockchain Smart Contracts with Solidity включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Стандарт взаимозаменяемых токенов ERC-20
- Реализация токена ERC-20
- Невзаимозаменяемые токены ERC-721 (NFT)
- Мульти-токенный стандарт ERC-1155