Standar Multi-Token ERC-1155
Pengantar
Antarmuka standar untuk kontrak yang mengelola beberapa jenis token. Satu kontrak yang diterapkan dapat mencakup kombinasi apa pun dari token sepadan, token non-sepadan, atau konfigurasi lainnya (misalnya, token semi-sepadan).
Apa yang dimaksud dengan Standar Multi-Token?
Idenya sederhana dan bertujuan untuk membuat antarmuka kontrak pintar yang dapat mewakili dan mengontrol sejumlah jenis token sepadan dan non-sepadan. Dengan cara ini, token ERC-1155 dapat melakukan fungsi yang sama seperti token ERC-20 dan ERC-721, dan bahkan keduanya pada saat yang bersamaan. Ini meningkatkan fungsionalitas standar ERC-20 dan ERC-721, membuatnya lebih efisien dan memperbaiki kesalahan implementasi yang jelas.
Token ERC-1155 dijelaskan sepenuhnya dalam EIP-1155 (opens in a new tab).
Prasyarat
Untuk lebih memahami halaman ini, kami sarankan Anda membaca terlebih dahulu tentang standar token, ERC-20, dan ERC-721.
Fungsi dan Fitur ERC-1155:
- Transfer Massal (Batch Transfer): Mentransfer beberapa aset dalam satu panggilan.
- Saldo Massal (Batch Balance): Mendapatkan saldo dari beberapa aset dalam satu panggilan.
- Persetujuan Massal (Batch Approval): Menyetujui semua token ke sebuah alamat.
- Hook: Hook penerimaan token.
- Dukungan NFT: Jika pasokan hanya 1, perlakukan sebagai NFT.
- Aturan Transfer Aman: Serangkaian aturan untuk transfer yang aman.
Transfer Massal
Transfer massal bekerja sangat mirip dengan transfer ERC-20 biasa. Mari kita lihat fungsi transferFrom ERC-20 biasa:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
Satu-satunya perbedaan dalam ERC-1155 adalah kita meneruskan nilai sebagai sebuah array dan kita juga meneruskan array id. Misalnya dengan ids=[3, 6, 13] dan values=[100, 200, 5], transfer yang dihasilkan adalah
- Transfer 100 token dengan id 3 dari
_fromke_to. - Transfer 200 token dengan id 6 dari
_fromke_to. - Transfer 5 token dengan id 13 dari
_fromke_to.
Dalam ERC-1155 kita hanya memiliki transferFrom, tidak ada transfer. Untuk menggunakannya seperti transfer biasa, cukup atur alamat pengirim (from) ke alamat yang memanggil fungsi tersebut.
Saldo Massal
Panggilan balanceOf ERC-20 masing-masing juga memiliki fungsi pasangannya dengan dukungan massal. Sebagai pengingat, ini adalah versi 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);
Bahkan lebih sederhana untuk panggilan saldo, kita dapat mengambil beberapa saldo dalam satu panggilan. Kita meneruskan array pemilik, diikuti oleh array id token.
Misalnya dengan _ids=[3, 6, 13] dan _owners=[0xbeef..., 0x1337..., 0x1111...], nilai yang dikembalikan adalah
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
Persetujuan Massal
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
Persetujuan sedikit berbeda dari ERC-20. Alih-alih menyetujui jumlah tertentu, Anda mengatur operator menjadi disetujui atau tidak disetujui melalui setApprovalForAll.
Membaca status saat ini dapat dilakukan melalui isApprovedForAll. Seperti yang Anda lihat, ini adalah operasi semua-atau-tidak-sama-sekali. Anda tidak dapat menentukan berapa banyak token yang akan disetujui atau bahkan kelas token mana.
Ini sengaja dirancang dengan mempertimbangkan kesederhanaan. Anda hanya dapat menyetujui semuanya untuk satu alamat.
Hook Penerimaan
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
Mengingat dukungan EIP-165 (opens in a new tab), ERC-1155 mendukung hook penerimaan hanya untuk kontrak pintar. Fungsi hook harus mengembalikan nilai bytes4 ajaib yang telah ditentukan sebelumnya yang diberikan sebagai:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
Ketika kontrak penerima mengembalikan nilai ini, diasumsikan bahwa kontrak menerima transfer dan tahu cara menangani token ERC-1155. Hebat, tidak ada lagi token yang tersangkut di dalam kontrak!
Dukungan NFT
Ketika pasokan hanya satu, token tersebut pada dasarnya adalah token non-sepadan (NFT). Dan seperti standar untuk ERC-721, Anda dapat menentukan URL metadata. URL tersebut dapat dibaca dan dimodifikasi oleh klien, lihat di sini (opens in a new tab).
Aturan Transfer Aman
Kita telah menyinggung beberapa aturan transfer aman dalam penjelasan sebelumnya. Namun mari kita lihat aturan yang paling penting:
- Pemanggil harus disetujui untuk membelanjakan token untuk alamat
_fromatau pemanggil harus sama dengan_from. - Panggilan transfer harus mengembalikan (revert) jika
- alamat
_toadalah 0. - panjang
_idstidak sama dengan panjang_values. - salah satu saldo pemegang untuk token di
_idslebih rendah dari jumlah masing-masing di_valuesyang dikirim ke penerima. - terjadi kesalahan lainnya.
- alamat
Catatan: Semua fungsi massal termasuk hook juga ada sebagai versi tanpa massal. Ini dilakukan untuk efisiensi gas, mengingat mentransfer hanya satu aset kemungkinan masih akan menjadi cara yang paling sering digunakan. Kami telah mengabaikannya demi kesederhanaan dalam penjelasan, termasuk aturan transfer aman. Namanya identik, cukup hapus kata 'Batch'.