มาตรฐานโทเค็นหลายชนิด ERC-1155
เรียนรู้มาตรฐานโทเค็นหลายชนิด ERC-1155 ที่ทำให้สัญญาเดียวจัดการโทเค็นที่ใช้แทนกันได้ กึ่งใช้แทนกันได้ และใช้แทนกันไม่ได้ร่วมกัน เพื่อการดำเนินการแบบชุดที่ประหยัดแก๊ส
มาตรฐานโทเค็นหลายชนิด ERC-1155 เป็นบทเรียน Blockchain Smart Contracts with Solidity ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 12
- บทเรียน
- 48
คำถามที่พบบ่อย
บทเรียน “มาตรฐานโทเค็นหลายชนิด ERC-1155” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “มาตรฐานโทเค็นหลายชนิด ERC-1155” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Blockchain Smart Contracts with Solidity ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Blockchain Smart Contracts with Solidity มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “มาตรฐานโทเค็นหลายชนิด ERC-1155”
เรียนรู้มาตรฐานโทเค็นหลายชนิด ERC-1155 ที่ทำให้สัญญาเดียวจัดการโทเค็นที่ใช้แทนกันได้ กึ่งใช้แทนกันได้ และใช้แทนกันไม่ได้ร่วมกัน เพื่อการดำเนินการแบบชุดที่ประหยัดแก๊ส คุณปฏิบัติ Blockchain Smart Contracts with Solidity ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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 (NFTs)
- มาตรฐานโทเค็นหลายชนิด ERC-1155