Tiêu chuẩn Đa Token ERC-1155
Lần cập nhật trang lần cuối: 22 tháng 10, 2025
Giới thiệu
Một giao diện tiêu chuẩn cho các hợp đồng quản lý nhiều loại token. Một hợp đồng được triển khai duy nhất có thể bao gồm bất kỳ sự kết hợp nào của token có thể thay thế, token không thể thay thế hoặc các cấu hình khác (ví dụ: token bán thay thế).
Tiêu chuẩn Đa Token có nghĩa là gì?
Ý tưởng này rất đơn giản và tìm cách tạo ra một giao diện hợp đồng thông minh có thể đại diện và kiểm soát bất kỳ số lượng loại token có thể thay thế và không thể thay thế nào. Theo cách này, token ERC-1155 có thể thực hiện các chức năng tương tự như token ERC-20 và ERC-721, và thậm chí cả hai cùng một lúc. Nó cải thiện chức năng của cả hai tiêu chuẩn ERC-20 và ERC-721, giúp nó hiệu quả hơn và sửa chữa các lỗi triển khai rõ ràng.
Token ERC-1155 được mô tả đầy đủ trong EIP-1155 (opens in a new tab).
Điều kiện tiên quyết
Để hiểu rõ hơn về trang này, chúng tôi khuyên bạn nên đọc trước về các tiêu chuẩn token, ERC-20 và ERC-721.
Các chức năng và tính năng của ERC-1155:
- Chuyển hàng loạt: Chuyển nhiều tài sản trong một lệnh gọi duy nhất.
- Số dư hàng loạt: Lấy số dư của nhiều tài sản trong một lệnh gọi duy nhất.
- Phê duyệt hàng loạt: Phê duyệt tất cả các token cho một địa chỉ.
- Hook: Hook nhận token.
- Hỗ trợ NFT: Nếu nguồn cung chỉ là 1, hãy coi nó như một NFT.
- Quy tắc chuyển an toàn: Bộ quy tắc để chuyển an toàn.
Chuyển hàng loạt
Việc chuyển hàng loạt hoạt động rất giống với các giao dịch chuyển ERC-20 thông thường. Hãy xem hàm transferFrom ERC-20 thông thường:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Hiện tất cảSự khác biệt duy nhất trong ERC-1155 là chúng ta chuyển các giá trị dưới dạng một mảng và chúng ta cũng chuyển một mảng các id. Ví dụ với ids=[3, 6, 13] và values=[100, 200, 5], các giao dịch chuyển kết quả sẽ là
- Chuyển 100 token có id 3 từ
_fromđến_to. - Chuyển 200 token có id 6 từ
_fromđến_to. - Chuyển 5 token có id 13 từ
_fromđến_to.
Trong ERC-1155, chúng ta chỉ có transferFrom, không có transfer. Để sử dụng nó như một transfer thông thường, chỉ cần đặt địa chỉ người gửi thành địa chỉ đang gọi hàm.
Số dư hàng loạt
Lệnh gọi balanceOf ERC-20 tương ứng cũng có hàm đối tác với sự hỗ trợ hàng loạt. Xin nhắc lại, đây là phiên bản ERC-20:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);Thậm chí còn đơn giản hơn đối với lệnh gọi số dư, chúng ta có thể truy xuất nhiều số dư trong một lệnh gọi duy nhất. Chúng ta chuyển mảng chủ sở hữu, tiếp theo là mảng id token.
Ví dụ với _ids=[3, 6, 13] và _owners=[0xbeef..., 0x1337..., 0x1111...], giá trị trả về sẽ là
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Phê duyệt hàng loạt
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Hiện tất cảViệc phê duyệt hơi khác so với ERC-20. Thay vì phê duyệt các số lượng cụ thể, bạn đặt một nhà điều hành thành được phê duyệt hoặc không được phê duyệt thông qua setApprovalForAll.
Việc đọc trạng thái hiện tại có thể được thực hiện thông qua isApprovedForAll. Như bạn có thể thấy, đó là một hoạt động tất cả hoặc không có gì. Bạn không thể xác định số lượng token cần phê duyệt hoặc thậm chí là lớp token nào.
Điều này được thiết kế có chủ ý với mục tiêu đơn giản. Bạn chỉ có thể phê duyệt mọi thứ cho một địa chỉ.
Hook nhận
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Với sự hỗ trợ của EIP-165 (opens in a new tab), ERC-1155 hỗ trợ các hook nhận chỉ dành cho các hợp đồng thông minh. Hàm hook phải trả về một giá trị bytes4 kỳ diệu được xác định trước, được đưa ra như sau:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Khi hợp đồng nhận trả về giá trị này, nghĩa là hợp đồng chấp nhận việc chuyển giao và biết cách xử lý các token ERC-1155. Tuyệt vời, không còn token bị kẹt trong hợp đồng nữa!
Hỗ trợ NFT
Khi nguồn cung chỉ là một, token về cơ bản là một token không thể thay thế (NFT). Và theo tiêu chuẩn của ERC-721, bạn có thể xác định một URL siêu dữ liệu. URL có thể được đọc và sửa đổi bởi các ứng dụng, xem tại đây (opens in a new tab).
Quy tắc chuyển an toàn
Chúng ta đã đề cập đến một vài quy tắc chuyển an toàn trong các giải thích trước đó. Nhưng hãy xem xét các quy tắc quan trọng nhất:
- Người gọi phải được phê duyệt để chi tiêu các token cho địa chỉ
_fromhoặc người gọi phải bằng_from. - Lệnh gọi chuyển phải hoàn nguyên nếu
- địa chỉ
_tolà 0. - độ dài của
_idskhông giống với độ dài của_values. - bất kỳ số dư nào của người nắm giữ đối với các token trong
_idsthấp hơn số lượng tương ứng trong_valuesđược gửi cho người nhận. - bất kỳ lỗi nào khác xảy ra.
- địa chỉ
Lưu ý: Tất cả các hàm hàng loạt bao gồm cả hook cũng tồn tại dưới dạng các phiên bản không có hàng loạt. Điều này được thực hiện để tiết kiệm gas, vì việc chuyển chỉ một tài sản có thể vẫn sẽ là cách được sử dụng phổ biến nhất. Chúng tôi đã bỏ qua chúng để cho đơn giản trong các giải thích, bao gồm cả các quy tắc chuyển an toàn. Tên giống hệt nhau, chỉ cần xóa 'Batch'.