Chuyển đến nội dung chính
Change page

Tiêu chuẩn đa token ERC-1155

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 duy nhất được triển khai 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ế (NFT) 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à nhằm 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-20ERC-721, và thậm chí là 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, làm cho 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 trước tiên nên đọc về các tiêu chuẩn token, ERC-20ERC-721.

Các chức năng và tính năng của ERC-1155:

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 của ERC-20 thông thường:

Sự khác biệt duy nhất trong ERC-1155 là chúng ta truyền các giá trị dưới dạng một mảng và chúng ta cũng truyền một mảng các id. Ví dụ: với ids=[3, 6, 13]values=[100, 200, 5], các giao dịch chuyển kết quả sẽ là

  1. Chuyển 100 token có id 3 từ _from sang _to.
  2. Chuyển 200 token có id 6 từ _from sang _to.
  3. Chuyển 5 token có id 13 từ _from sang _to.

Trong ERC-1155, chúng ta chỉ có transferFrom, không có transfer. Để sử dụng nó giống như một transfer thông thường, chỉ cần đặt địa chỉ gửi (from) thành địa chỉ đang gọi hàm.

Số dư hàng loạt

Lệnh gọi balanceOf tương ứng của ERC-20 cũng có hàm đối tác của nó với hỗ trợ hàng loạt. Xin nhắc lại, đây là phiên bản ERC-20:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) 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 truyền mảng các chủ sở hữu, theo sau là mảng các id token.

Ví dụ: với _ids=[3, 6, 13]_owners=[0xbeef..., 0x1337..., 0x1111...], giá trị trả về sẽ là

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

Chấp thuận hàng loạt

Việc chấp thuận hơi khác so với ERC-20. Thay vì chấp thuận các số lượng cụ thể, bạn đặt một người vận hành (operator) thành được chấp thuận hoặc không được chấp thuận 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, đây là một thao tác tất-cả-hoặc-không-có-gì. Bạn không thể xác định số lượng token cần chấp thuận hoặc thậm chí là lớp token nào.

Điều này được cố ý thiết kế với mục tiêu đơn giản hóa. Bạn chỉ có thể chấp thuận mọi thứ cho một địa chỉ.

Hook nhận

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

Với sự hỗ trợ của EIP-165 (opens in a new tab), ERC-1155 chỉ hỗ trợ các hook nhận cho các hợp đồng thông minh. Hàm hook phải trả về một giá trị bytes4 ma thuật được xác định trước, được cho là:

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

Khi hợp đồng nhận trả về giá trị này, người ta giả định rằng hợp đồng chấp nhận việc chuyển 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 một 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 này có thể được đọc và sửa đổi bởi các client, 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 quy tắc quan trọng nhất:

  1. Người gọi phải được chấp thuận để chi tiêu các token cho địa chỉ _from hoặc người gọi phải bằng _from.
  2. Lệnh gọi chuyển phải hoàn nguyên nếu
    1. Địa chỉ _to là 0.
    2. độ dài của _ids không giống với độ dài của _values.
    3. bất kỳ số dư nào của (các) chủ sở hữu đối với (các) token trong _ids thấp hơn (các) số lượng tương ứng trong _values được gửi đến người nhận.
    4. bất kỳ lỗi nào khác xảy ra.

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 để tối ưu hóa Gas, xét thấy việc chỉ chuyển một tài sản có thể vẫn là cách được sử dụng phổ biến nhất. Chúng tôi đã bỏ qua chúng để đơn giản hóa trong các giải thích, bao gồm cả các quy tắc chuyển an toàn. Tên của chúng giống hệt nhau, chỉ cần xóa chữ 'Batch'.

Đọc thêm