Standar Non-Fungible Token ERC-721
Pembaruan terakhir halaman: 25 Februari 2026
Pengantar
Apa itu Non-Fungible Token?
Non-Fungible Token (NFT) digunakan untuk mengidentifikasi sesuatu atau seseorang dengan cara yang unik. Jenis Token ini sangat cocok digunakan pada platform yang menawarkan barang koleksi, kunci akses, tiket lotre, kursi bernomor untuk konser dan pertandingan olahraga, dll. Jenis Token khusus ini memiliki kemungkinan yang luar biasa sehingga layak mendapatkan Standar yang tepat, ERC-721 hadir untuk menyelesaikannya!
Apa itu ERC-721?
ERC-721 memperkenalkan standar untuk NFT, dengan kata lain, jenis Token ini unik dan dapat memiliki nilai yang berbeda dari Token lain dari kontrak pintar yang sama, mungkin karena usianya, kelangkaannya, atau bahkan hal lain seperti visualnya. Tunggu, visual?
Ya! Semua NFT memiliki variabel uint256 yang disebut tokenId, jadi untuk Kontrak ERC-721 apa pun, pasangan alamat kontrak, uint256 tokenId harus unik secara global. Oleh karena itu, sebuah dapp dapat memiliki "konverter" yang menggunakan tokenId sebagai input dan menghasilkan gambar sesuatu yang keren, seperti zombi, senjata, keterampilan, atau anak kucing yang luar biasa!
Prasyarat
Isi
ERC-721 (Ethereum Request for Comments 721), yang diusulkan oleh William Entriken, Dieter Shirley, Jacob Evans, Nastassia Sachs pada Januari 2018, adalah Standar Non-Fungible Token yang mengimplementasikan API untuk token di dalam kontrak pintar.
Ini menyediakan fungsionalitas seperti mentransfer token dari satu akun ke akun lain, untuk mendapatkan saldo token saat ini dari sebuah akun, untuk mendapatkan pemilik token tertentu dan juga total pasokan token yang tersedia di jaringan. Selain itu, ini juga memiliki beberapa fungsionalitas lain seperti menyetujui bahwa sejumlah token dari sebuah akun dapat dipindahkan oleh akun pihak ketiga.
Jika sebuah kontrak pintar mengimplementasikan metode dan peristiwa berikut, itu dapat disebut Kontrak Non-Fungible Token ERC-721 dan, setelah diterapkan, ia akan bertanggung jawab untuk melacak token yang dibuat di Ethereum.
Dari EIP-721 (opens in a new tab):
Metode
1 function balanceOf(address _owner) external view returns (uint256);2 function ownerOf(uint256 _tokenId) external view returns (address);3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;6 function approve(address _approved, uint256 _tokenId) external payable;7 function setApprovalForAll(address _operator, bool _approved) external;8 function getApproved(uint256 _tokenId) external view returns (address);9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);Tampilkan semuaPeristiwa
1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);Contoh
Mari kita lihat bagaimana sebuah Standar sangat penting untuk memudahkan kita memeriksa Kontrak Token ERC-721 apa pun di Ethereum. Kita hanya memerlukan Antarmuka Biner Aplikasi (ABI) Kontrak untuk membuat antarmuka ke Token ERC-721 apa pun. Seperti yang dapat Anda lihat di bawah ini, kita akan menggunakan ABI yang disederhanakan, untuk menjadikannya contoh dengan hambatan rendah.
Contoh Web3.py
Pertama, pastikan Anda telah menginstal pustaka Python Web3.py (opens in a new tab):
1pip install web31from web3 import Web32from web3._utils.events import get_event_data345w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))67ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract # Kontrak CryptoKitties89acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction # Lelang Penjualan CryptoKitties1011# This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract. # Ini adalah Contract Application Binary Interface (ABI) yang disederhanakan dari Kontrak NFT ERC-721.12# It will expose only the methods: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() # Ini hanya akan mengekspos metode: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply()13simplified_abi = [14 {15 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],16 'name': 'balanceOf',17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],18 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True19 },20 {21 'inputs': [],22 'name': 'name',23 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],24 'stateMutability': 'view', 'type': 'function', 'constant': True25 },26 {27 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],28 'name': 'ownerOf',29 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],30 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True31 },32 {33 'inputs': [],34 'name': 'symbol',35 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],36 'stateMutability': 'view', 'type': 'function', 'constant': True37 },38 {39 'inputs': [],40 'name': 'totalSupply',41 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],42 'stateMutability': 'view', 'type': 'function', 'constant': True43 },44]4546ck_extra_abi = [47 {48 'inputs': [],49 'name': 'pregnantKitties',50 'outputs': [{'name': '', 'type': 'uint256'}],51 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True52 },53 {54 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],55 'name': 'isPregnant',56 'outputs': [{'name': '', 'type': 'bool'}],57 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True58 }59]6061ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)62name = ck_contract.functions.name().call()63symbol = ck_contract.functions.symbol().call()64kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()65print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")6667pregnant_kitties = ck_contract.functions.pregnantKitties().call()68print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")6970# Using the Transfer Event ABI to get info about transferred Kitties. # Menggunakan ABI Event Transfer untuk mendapatkan info tentang Kitties yang ditransfer.71tx_event_abi = {72 'anonymous': False,73 'inputs': [74 {'indexed': False, 'name': 'from', 'type': 'address'},75 {'indexed': False, 'name': 'to', 'type': 'address'},76 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],77 'name': 'Transfer',78 'type': 'event'79}8081# We need the event's signature to filter the logs # Kita memerlukan tanda tangan event untuk memfilter log82event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()8384logs = w3.eth.get_logs({85 "fromBlock": w3.eth.block_number - 120,86 "address": w3.to_checksum_address(ck_token_addr),87 "topics": [event_signature]88})8990# Notes: # Catatan:91# - Increase the number of blocks up from 120 if no Transfer event is returned. # - Tingkatkan jumlah blok lebih dari 120 jika tidak ada event Transfer yang dikembalikan.92# - If you didn't find any Transfer event you can also try to get a tokenId at: # - Jika Anda tidak menemukan event Transfer apa pun, Anda juga dapat mencoba mendapatkan tokenId di:93# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events # https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events94# Click to expand the event's logs and copy its "tokenId" argument # Klik untuk memperluas log event dan salin argumen "tokenId"-nya95recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]9697if recent_tx:98 kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above # Tempel "tokenId" di sini dari tautan di atas99 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()100 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")Tampilkan semuaKontrak CryptoKitties memiliki beberapa Peristiwa menarik selain yang Standar.
Mari kita periksa dua di antaranya, Pregnant dan Birth.
1# Using the Pregnant and Birth Events ABI to get info about new Kitties. # Menggunakan ABI Event Pregnant dan Birth untuk mendapatkan info tentang Kitties baru.2ck_extra_events_abi = [3 {4 'anonymous': False,5 'inputs': [6 {'indexed': False, 'name': 'owner', 'type': 'address'},7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],10 'name': 'Pregnant',11 'type': 'event'12 },13 {14 'anonymous': False,15 'inputs': [16 {'indexed': False, 'name': 'owner', 'type': 'address'},17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],21 'name': 'Birth',22 'type': 'event'23 }]2425# We need the event's signature to filter the logs # Kita memerlukan tanda tangan event untuk memfilter log26ck_event_signatures = [27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),29]3031# Here is a Pregnant Event: # Berikut adalah Event Pregnant:32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog # - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog33pregnant_logs = w3.eth.get_logs({34 "fromBlock": w3.eth.block_number - 120,35 "address": w3.to_checksum_address(ck_token_addr),36 "topics": [ck_event_signatures[0]]37})3839recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]4041# Here is a Birth Event: # Berikut adalah Event Birth:42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a # - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a43birth_logs = w3.eth.get_logs({44 "fromBlock": w3.eth.block_number - 120,45 "address": w3.to_checksum_address(ck_token_addr),46 "topics": [ck_event_signatures[1]]47})4849recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]Tampilkan semuaNFT Populer
- Etherscan NFT Tracker (opens in a new tab) mencantumkan NFT teratas di Ethereum berdasarkan volume transfer.
- CryptoKitties (opens in a new tab) adalah permainan yang berpusat pada makhluk yang dapat dikembangbiakkan, dikoleksi, dan sangat menggemaskan yang kita sebut CryptoKitties.
- Sorare (opens in a new tab) adalah permainan sepak bola fantasi global di mana Anda dapat mengumpulkan barang koleksi edisi terbatas, mengelola tim Anda, dan bersaing untuk mendapatkan hadiah.
- The Ethereum Name Service (ENS) (opens in a new tab) menawarkan cara yang aman & terdesentralisasi untuk mengalamatkan sumber daya baik di dalam maupun di luar blockchain menggunakan nama yang sederhana dan dapat dibaca manusia.
- POAP (opens in a new tab) memberikan NFT gratis kepada orang-orang yang menghadiri acara atau menyelesaikan tindakan tertentu. POAP gratis untuk dibuat dan didistribusikan.
- Unstoppable Domains (opens in a new tab) adalah perusahaan yang berbasis di San Francisco yang membangun domain di blockchain. Domain blockchain menggantikan alamat mata uang kripto dengan nama yang dapat dibaca manusia dan dapat digunakan untuk mengaktifkan situs web yang tahan sensor.
- Gods Unchained Cards (opens in a new tab) adalah TCG di blockchain Ethereum yang menggunakan NFT untuk membawa kepemilikan nyata pada aset dalam permainan.
- Bored Ape Yacht Club (opens in a new tab) adalah koleksi 10.000 NFT unik, yang, selain menjadi karya seni yang terbukti langka, bertindak sebagai token keanggotaan ke klub, memberikan fasilitas dan manfaat anggota yang meningkat seiring waktu sebagai hasil dari upaya komunitas.
Bacaan lebih lanjut
- EIP-721: Standar Non-Fungible Token ERC-721 (opens in a new tab)
- OpenZeppelin - Dokumen ERC-721 (opens in a new tab)
- OpenZeppelin - Implementasi ERC-721 (opens in a new tab)
- API NFT Alchemy (opens in a new tab)
Tutorial: Membangun dengan non-fungible token (ERC-721) di Ethereum
- Panduan Kontrak ERC-721 Vyper – Panduan beranotasi dari kontrak NFT ERC-721 lengkap yang ditulis dalam Vyper.
- Cara Menulis & Menerapkan NFT (Bagian 1/3) – Panduan langkah demi langkah untuk menulis dan menerapkan kontrak pintar ERC-721 pertama Anda.
- Cara Melakukan Mint NFT (Bagian 2/3) – Cara melakukan mint NFT ERC-721 menggunakan kontrak pintar yang Anda terapkan dan Web3.
- Cara Melihat NFT Anda di Dompet Anda (Bagian 3/3) – Cara menampilkan NFT yang telah di-mint di MetaMask setelah penerapan.
- Tutorial Minter NFT – Membangun dapp minting NFT full-stack dengan frontend React, MetaMask, dan Alchemy.