Standar Token Multi ERC-1155
Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 15 Agustus 2023
Pendahuluan
Sebuah antarmuka standar untuk kontrak yang mengelola jenis token multiple. Suatu kontrak tunggal yang disebarkan mungkin memasukkan kombinasi mana pun dari token yang dapat dipertukarkan, token yang tidak dapat dipertukarkan, atau konfigurasi lainnya (contohnya token semi yang dapat dipertukarkan).
Apa yang dimaksud dengan Standar Multitoken?
Idenya sederhana dan bertujuan untuk membuat antarmuka kontrak pintar yang dapat mewakili dan mengontrol berapa pun jumlah tipe token yang dapat dipertukarkan dan tidak dapat dipertukarkan. Dengan cara ini, token ERC-1155 dapat melakukan fungsi yang sama seperti token ERC-20 dan ERC-721, dan bahkan keduanya secara bersamaan. Dan yang terbaik dari semuanya, cara ini meningkatkan fungsionalitas kedua standar, yang membuatnya lebih efisien, dan memperbaiki kesalahan implementasi yang jelas pada standar ERC-20 dan ERC-721.
Token ERC-1155 dideskripsikan secara lengkap di EIP-1155(opens in a new tab).
Prasyarat
Untuk lebih memahami halaman ini, sebaiknya baca terlebih dahulu tentang standar token, ERC-20, dan ERC-721.
Fungsi dan Fitur ERC-1155:
- Transfer Kelompok: Transfer beberapa aset dalam sekali pemanggilan.
- Saldo Kelompok: Dapatkan saldo dari beberapa aset dalam sekali pemanggilan.
- Persetujuan Kelompok: Setujui semua token ke suatu alamat.
- Kaitan: Terima kaitan token.
- Dukungan NFT: Jika persediaan hanya berjumlah 1, anggaplah sebagai NFT.
- Aturan Transfer Aman: Kumpulan aturan untuk transfer yang aman.
Transfer Kelompok
Transfer kelompok bekerja dalam cara yang sangat mirip dengan transfer ERC-20 reguler. Mari kita lihat fungsi transferFrom ERC-20 reguler:
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;Tampilkan semuaSalin
Satu-satunya perbedaan dalam ERC-1155 adalah bahwa kita melewatkan nilai sebagai suatu larik dan kita juga melewatkan suatu larik id. Sebagai contoh, diketahui ids=[3, 6, 13]
dan values=[100, 200, 5]
, transfer yang dihasilkan akan merupakan
- Transfer 100 token dengan id 3 dari
_from
ke_to
. - Transfer 200 token dengan id 6 dari
_from
ke_to
. - Transfer 5 token dengan id 13 dari
_from
ke_to
.
Dalam ERC-1155, kita hanya memiliki transferFrom
, tidak memiliki transfer
. Untuk menggunakannya seperti transfer
reguler, cukup tetapkan alamat from ke alamat yang memanggil fungsi.
Saldo Kelompok
Pemanggilan balanceOf
ERC-20 masing-masing juga memiliki fungsi pasangannya dengan dukungan kelompok. Sebagai pengingat, ini adalah versi 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);Salin
Bahkan lebih sederhana untuk pemanggilan saldo, kita dapat mengambilkan beberapa saldo dalam sekali pemanggilan. Kita melewatkan larik pemilik, yang diikuti dengan larik id token.
Sebagai contoh, diketahui _ids=[3, 6, 13]
dan _owners=[0xbeef..., 0x1337..., 0x1111...]
, nilai pengembaliannya akan merupakan
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]Salin
Persetujuan Kelompok
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);Tampilkan semuaSalin
Persetujuannya sedikit berbeda dengan ERC-20. Alih-alih menyetujui jumlah tertentu, Anda menetapkan suatu operator untuk menyetujui atau tidak menyetujui melalui setApprovalForAll
.
Membaca status saat ini dapat dilakukan melalui isApprovedForAll
. Seperti yang dapat Anda lihat, itu mencakup semuanya atau tidak sama sekali. Anda tidak dapat mendefinisikan berapa banyak token yang akan disetujui atau bahkan kelas token.
Ini dengan sengaja dirancang sedemikian rupa dengan tujuan kemudahan. Anda juga dapat menyetujui semua hal untuk satu alamat.
Terima Kaitan
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);Salin
Dengan dukungan EIP-165(opens in a new tab), ERC-1155 hanya mendukung penerimaan kaitan untuk kontrak pintar. Fungsi kaitan harus mengembalikan nilai magic yang ditentukan sebelumnya dalam bytes4 yang diberikan sebagai:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))Salin
Ketika kontrak yang menerima mengembalikan nilai ini, kontrak dianggap menerima transfer dan mengetahui cara menangani token ERC-1155. Bagus, tidak ada lagi token yang macet dalam kontrak!
Dukungan NFT
Ketika persediaan hanya berjumlah satu, token pada dasarnya merupakan token yang tidak dapat dipertukarkan (NFT). Dan karena ini adalah standar untuk ERC-721, Anda dapat menentukan suatu URL metadata. URL dapat dibaca dan dimodifikasi oleh klien, lihat di sini(opens in a new tab).
Aturan Transfer Aman
Kita telah membahas beberapa aturan transfer yang aman di penjelasan sebelumnya. Tetapi, mari kita lihat pada bagian terpenting dari aturannya:
- Pemanggil harus disetujui untuk menggunakan token untuk alamat
_from
atau pemanggilnya harus sama dengan_from
. - Pemanggilan transfer harus dibalikkan jika
- alamat
_to
adalah 0. - panjang
_ids
tidak sama dengan panjang_values
. - saldo pemilik mana pun untuk token dalam
_ids
lebih rendah dari jumlah masing-masing dalam_values
yang dikirim ke penerima. - kesalahan lain mana pun terjadi.
- alamat
Catatan: Semua fungsi kelompok termasuk kaitan juga hadir sebagai versi tanpa kelompok. Ini semua demi efisiensi gas, dengan pertimbangan untuk mentransfer hanya satu aset mungkin masih menjadi cara yang paling banyak digunakan. Kita telah melewatkannya untuk penjelasan yang sederhana, termasuk untuk aturan transfer yang aman. Namanya mirip, cukup hilangkan 'Batch'.