← Semua pembelajaran / Blockchain Nol → RWA
Fase 2 · Standar Token & Tokenisasi RWA

ERC-1155 — multi-token standard

ERC-20 butuh satu kontrak per jenis token. ERC-721 butuh satu kontrak per koleksi. ERC-1155 menjawab kebutuhan yang muncul begitu kamu punya banyak jenis aset terkait — satu kontrak, ribuan tipe token id, dengan operasi batch yang jauh lebih murah.

Intisari

  • Satu kontrak ERC-1155 bisa mengelola banyak id token sekaligus — dan tiap id bisa bersifat fungible (seperti ERC-20) atau non-fungible (seperti ERC-721, cukup buat supply-nya 1).
  • balanceOf(akun, id) — saldo selalu per pasangan akun+id, bukan cuma per akun seperti ERC-20.
  • Operasi batch (balanceOfBatch, safeBatchTransferFrom) memindahkan banyak jenis token dalam satu transaksi — jauh lebih hemat gas dibanding memanggil kontrak terpisah berkali-kali.
  • Cocok untuk portofolio aset RWA yang beragam dalam satu penerbit: emas 24 karat, emas 22 karat, dan perak — masing-masing id berbeda, satu kontrak custodian yang sama.
  • Sama seperti ERC-721, metadata (uri(id)) tinggal di luar rantai — biasanya IPFS.

Masalah yang diselesaikan: satu kontrak per jenis aset itu boros

Bayangkan platform tokenisasi logam mulia yang menjual emas 24 karat, emas 22 karat, dan perak. Dengan ERC-20, kamu butuh tiga kontrak terpisah — tiga alamat, tiga proses audit, tiga kali biaya deploy. ERC-1155 menyatukannya jadi satu kontrak dengan tiga id berbeda.

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract LogamMulia is ERC1155 {
    uint256 public constant EMAS_24K = 1;
    uint256 public constant EMAS_22K = 2;
    uint256 public constant PERAK    = 3;

    constructor() ERC1155("ipfs://bafybei.../{id}.json") {}

    function mint(address ke, uint256 id, uint256 jumlahGram) external {
        _mint(ke, id, jumlahGram, "");
    }
}

Batch: satu transaksi, banyak jenis token

function belanjaPaket(address dari, address ke) external {
    uint256[] memory ids = new uint256[](2);
    uint256[] memory jumlah = new uint256[](2);
    ids[0] = EMAS_24K; jumlah[0] = 10;   // 10 gram emas 24K
    ids[1] = PERAK;    jumlah[1] = 500;  // 500 gram perak

    safeBatchTransferFrom(dari, ke, ids, jumlah, "");
}

Kenapa batch penting secara ekonomi. Setiap transaksi punya biaya dasar 21.000 gas di luar logika kontraknya (lihat Fase 0). Memindahkan 3 jenis token lewat 3 kontrak ERC-20 terpisah berarti membayar biaya dasar itu 3 kali. safeBatchTransferFrom membayarnya sekali untuk seluruh batch — penghematan yang makin terasa untuk portofolio dengan banyak jenis aset.

Peta pilihan standar token

KebutuhanStandar
Satu jenis aset, sepenuhnya fungibleERC-20
Aset unik satu per satuERC-721
Banyak jenis aset terkait dalam satu penerbitERC-1155
Token fungible dengan kepatuhan KYC/AML wajibERC-3643 / ERC-1400 (materi berikutnya)

Latihan: deploy LogamMulia, mint 100 gram EMAS_24K dan 50 gram PERAK ke satu akun. Panggil balanceOfBatch dengan array akun yang sama diulang dua kali dan array id [EMAS_24K, PERAK] — bandingkan berapa gas yang dipakai satu panggilan balanceOfBatch versus dua panggilan balanceOf terpisah.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.