Bahasa Indonesia

Jelajahi seluk-beluk kontrak pintar ERC-721 untuk NFT. Pelajari tentang arsitektur, implementasi, pertimbangan keamanan, dan aplikasi dunia nyatanya.

Kontrak Pintar NFT: Penyelaman Mendalam ke dalam Implementasi ERC-721

Non-Fungible Token (NFT) telah merevolusi lanskap aset digital, memungkinkan representasi item unik di blockchain. Inti dari sebagian besar NFT adalah standar ERC-721, seperangkat aturan yang mengatur bagaimana token ini dibuat, dikelola, dan ditransfer. Panduan komprehensif ini memberikan eksplorasi mendalam tentang kontrak pintar ERC-721, mencakup arsitektur, detail implementasi, pertimbangan keamanan, dan aplikasi praktisnya.

Apa itu ERC-721?

ERC-721 adalah standar untuk merepresentasikan token non-fungible di blockchain Ethereum. Berbeda dengan token ERC-20, yang bersifat fungible (artinya setiap token identik dengan token lainnya), token ERC-721 bersifat unik. Setiap token memiliki ID yang berbeda, membuatnya cocok untuk merepresentasikan kepemilikan aset digital atau fisik yang unik.

Karakteristik Utama Token ERC-721:

Arsitektur Kontrak Pintar ERC-721

Kontrak pintar ERC-721 adalah program Solidity yang mengimplementasikan standar ERC-721. Biasanya mencakup komponen-komponen berikut:

Fungsi Inti:

Ekstensi Metadata (Opsional):

Ekstensi Enumerasi (Opsional):

Mengimplementasikan Kontrak Pintar ERC-721 dengan OpenZeppelin

OpenZeppelin menyediakan pustaka kontrak pintar yang aman dan telah diaudit yang menyederhanakan pengembangan token ERC-721. Menggunakan implementasi ERC721 dari OpenZeppelin mengurangi risiko memasukkan kerentanan ke dalam kode Anda. Berikut adalah contoh cara mengimplementasikan kontrak pintar ERC-721 menggunakan OpenZeppelin:

Prasyarat:

Langkah-langkah:

  1. Inisialisasi proyek Truffle atau Hardhat:
# Truffle
mkdir proyek-nft-saya
cd proyek-nft-saya
truffle init

# Hardhat
mkdir proyek-nft-saya
cd proyek-nft-saya
npx hardhat
  1. Instal Kontrak OpenZeppelin:
npm install @openzeppelin/contracts
  1. Buat Kontrak Pintar ERC-721: Buat file Solidity baru (misalnya, `MyNFT.sol`) di direktori `contracts` Anda.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    string private _baseURI;

    constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
        _baseURI = baseURI;
    }

    function mintNFT(address recipient) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));

        return newItemId;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        return string(abi.encodePacked(_tokenURI));
    }

    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory baseURI) public {
        _baseURI = baseURI;
    }



    // Fungsi-fungsi berikut adalah override yang diperlukan oleh Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

import "@openzeppelin/contracts/utils/Strings.sol";
  1. Kompilasi Kontrak Pintar: Gunakan Truffle atau Hardhat untuk mengompilasi kontrak pintar Anda.
# Truffle
truffle compile

# Hardhat
npx hardhat compile
  1. Buat Skrip Deployment: Buat file JavaScript baru (misalnya, `deploy.js`) di direktori `migrations` atau `scripts` Anda.
// Contoh Migrasi Truffle
const MyNFT = artifacts.require("MyNFT");

module.exports = async function (deployer) {
  await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://CID_IPFS_ANDA/");
};

// Contoh Skrip Deployment Hardhat
async function main() {
  const MyNFT = await ethers.getContractFactory("MyNFT");
  const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://CID_IPFS_ANDA/");

  await myNFT.deployed();

  console.log("MyNFT deployed to:", myNFT.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. Terapkan Kontrak Pintar: Terapkan kontrak pintar Anda ke blockchain lokal (misalnya, Ganache) atau jaringan uji (misalnya, Ropsten, Rinkeby).
# Truffle
truffle migrate

# Hardhat
npx hardhat run scripts/deploy.js --network localhost

Ingatlah untuk mengganti `ipfs://CID_IPFS_ANDA/` dengan CID (Content Identifier) IPFS Anda yang sebenarnya. URI dasar ini menunjuk ke lokasi tempat file JSON metadata NFT Anda akan disimpan.

Menyimpan Metadata NFT di IPFS

Metadata NFT biasanya disimpan di luar rantai (off-chain) untuk mengurangi biaya penyimpanan data di blockchain. IPFS (InterPlanetary File System) adalah jaringan penyimpanan terdesentralisasi yang umum digunakan untuk menyimpan metadata NFT. Setiap NFT memiliki `tokenURI` yang menunjuk ke file JSON di IPFS yang berisi metadata tentang NFT, seperti nama, deskripsi, URL gambar, dan atribut lainnya.

Contoh Metadata NFT (JSON):

{
  "name": "NFT Keren Saya",
  "description": "Ini adalah NFT yang unik.",
  "image": "ipfs://CID_IPFS_ANDA/gambar.png",
  "attributes": [
    {
      "trait_type": "Latar Belakang",
      "value": "Biru"
    },
    {
      "trait_type": "Karakter",
      "value": "Robot"
    }
  ]
}

Ganti `ipfs://CID_IPFS_ANDA/gambar.png` dengan CID IPFS gambar Anda yang sebenarnya.

Langkah-langkah Mengunggah Metadata ke IPFS:

  1. Pilih Klien IPFS: Pilih klien IPFS seperti IPFS Desktop, Pinata, atau NFT.Storage.
  2. Unggah Metadata Anda: Unggah file JSON metadata NFT dan gambar Anda ke IPFS menggunakan klien yang Anda pilih.
  3. Dapatkan CID IPFS: Setelah mengunggah metadata Anda, Anda akan menerima CID IPFS. Ini adalah pengidentifikasi unik untuk data Anda di IPFS.
  4. Perbarui Kontrak Pintar: Perbarui fungsi `tokenURI` di kontrak pintar Anda untuk menunjuk ke CID IPFS Anda.

Pertimbangan Keamanan untuk Kontrak Pintar ERC-721

Keamanan adalah yang terpenting saat mengembangkan kontrak pintar ERC-721. Berikut adalah beberapa pertimbangan keamanan penting:

Aplikasi Dunia Nyata dari NFT ERC-721

NFT ERC-721 digunakan dalam berbagai aplikasi, termasuk:

Contoh Internasional:

Konsep Lanjutan ERC-721

ERC-721A

ERC-721A adalah implementasi standar ERC-721 yang lebih hemat gas yang mengoptimalkan pencetakan beberapa NFT dalam satu transaksi. Ini mengurangi biaya gas dengan mengamortisasi biaya penyimpanan di beberapa token. Ini bisa bermanfaat untuk proyek yang melibatkan pencetakan NFT dalam jumlah besar.

Lazy Minting

Lazy minting adalah teknik di mana NFT hanya dicetak (minted) saat dibeli. Ini dapat menghemat biaya gas untuk proyek yang memiliki sejumlah besar NFT tetapi tidak mengharapkan semuanya terjual. Metadata NFT disimpan di luar rantai (off-chain) hingga NFT dibeli, pada saat itu token dicetak dan metadata ditambahkan ke blockchain.

Token Soulbound

Token Soulbound adalah NFT yang terikat secara permanen ke alamat tertentu dan tidak dapat ditransfer. Token ini dapat digunakan untuk merepresentasikan kredensial yang tidak dapat dipindahtangankan, seperti gelar pendidikan, sertifikasi profesional, atau keanggotaan dalam suatu komunitas. Ini diaktifkan dengan menghapus atau membatasi fungsi `transferFrom`.

Masa Depan ERC-721 dan NFT

Standar ERC-721 terus berkembang, dengan penelitian dan pengembangan yang sedang berlangsung berfokus pada peningkatan efisiensi, keamanan, dan fungsionalitasnya. Perkembangan di masa depan mungkin termasuk:

Kesimpulan

Kontrak pintar ERC-721 adalah alat yang ampuh untuk merepresentasikan kepemilikan aset digital dan fisik yang unik di blockchain. Dengan memahami arsitektur, detail implementasi, pertimbangan keamanan, dan aplikasi praktis dari ERC-721, pengembang dapat membangun proyek NFT yang inovatif dan berdampak. Seiring ekosistem NFT terus tumbuh dan berkembang, standar ERC-721 akan memainkan peran penting dalam membentuk masa depan kepemilikan digital.

Panduan ini memberikan fondasi yang kokoh untuk memahami dan mengimplementasikan kontrak pintar ERC-721. Ingatlah untuk selalu memprioritaskan keamanan dan mengikuti praktik terbaik saat mengembangkan dan menerapkan proyek NFT Anda sendiri. Semoga berhasil!