Memahami kontrak pintar token ERC-20
Salah satu standar kontrak pintar paling signifikan di Ethereum dikenal sebagai ERC-20, yang telah muncul sebagai standar teknis yang digunakan untuk semua kontrak pintar di blockchain Ethereum untuk implementasi token yang sepadan (fungible).
ERC-20 mendefinisikan daftar aturan umum yang harus dipatuhi oleh semua token Ethereum yang sepadan. Akibatnya, standar token ini memberdayakan semua jenis pengembang untuk memprediksi secara akurat bagaimana token baru akan berfungsi di dalam sistem Ethereum yang lebih besar. Hal ini menyederhanakan dan memudahkan tugas pengembang, karena mereka dapat melanjutkan pekerjaan mereka, dengan mengetahui bahwa setiap proyek baru tidak perlu dikerjakan ulang setiap kali token baru dirilis, selama token tersebut mengikuti aturan.
Berikut ini, disajikan sebagai antarmuka (interface), fungsi-fungsi yang harus diimplementasikan oleh ERC-20. Jika Anda tidak yakin tentang apa itu antarmuka: periksa artikel kami tentang pemrograman OOP di Solidity (opens in a new tab).
1pragma solidity ^0.6.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Tampilkan semuaBerikut adalah penjelasan baris demi baris tentang fungsi dari setiap fungsi tersebut. Setelah ini kami akan menyajikan implementasi sederhana dari token ERC-20.
Getter
1function totalSupply() external view returns (uint256);Mengembalikan jumlah token yang ada. Fungsi ini adalah sebuah getter dan tidak memodifikasi status kontrak. Perlu diingat bahwa tidak ada tipe data float di Solidity. Oleh karena itu, sebagian besar token mengadopsi 18 desimal dan akan mengembalikan total pasokan dan hasil lainnya sebagai berikut 1000000000000000000 untuk 1 token. Tidak setiap token memiliki 18 desimal dan ini adalah sesuatu yang benar-benar perlu Anda perhatikan ketika berurusan dengan token.
1function balanceOf(address account) external view returns (uint256);Mengembalikan jumlah token yang dimiliki oleh sebuah alamat (account). Fungsi ini adalah sebuah getter dan tidak memodifikasi status kontrak.
1function allowance(address owner, address spender) external view returns (uint256);Standar ERC-20 memungkinkan sebuah alamat untuk memberikan jatah (allowance) kepada alamat lain agar dapat mengambil token darinya. Getter ini mengembalikan sisa jumlah token yang diizinkan untuk dihabiskan oleh spender atas nama owner. Fungsi ini adalah sebuah getter dan tidak memodifikasi status kontrak dan seharusnya mengembalikan nilai 0 secara bawaan.
Fungsi
1function transfer(address recipient, uint256 amount) external returns (bool);Memindahkan sejumlah amount token dari alamat pemanggil fungsi (msg.sender) ke alamat penerima. Fungsi ini memancarkan (emit) event Transfer yang didefinisikan nanti. Fungsi ini mengembalikan nilai true jika transfer memungkinkan.
1function approve(address spender, uint256 amount) external returns (bool);Menetapkan jumlah allowance yang diizinkan untuk ditransfer oleh spender dari saldo pemanggil fungsi (msg.sender). Fungsi ini memancarkan event Approval. Fungsi ini mengembalikan nilai apakah jatah tersebut berhasil ditetapkan.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Memindahkan sejumlah amount token dari sender ke recipient menggunakan mekanisme jatah (allowance). Jumlah tersebut kemudian dikurangi dari jatah pemanggil. Fungsi ini memancarkan event Transfer.
Event
1event Transfer(address indexed from, address indexed to, uint256 value);Event ini dipancarkan ketika sejumlah token (value) dikirim dari alamat from ke alamat to.
Dalam kasus melakukan mint token baru, transfer biasanya from (dari) alamat 0x00..0000 sedangkan dalam kasus membakar token, transfernya adalah to (ke) 0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);Event ini dipancarkan ketika sejumlah token (value) disetujui oleh owner untuk digunakan oleh spender.
Implementasi dasar token ERC-20
Berikut adalah kode paling sederhana untuk menjadi dasar token ERC-20 Anda:
1pragma solidity ^0.8.0;23interface IERC20 {45 function totalSupply() external view returns (uint256);6 function balanceOf(address account) external view returns (uint256);7 function allowance(address owner, address spender) external view returns (uint256);89 function transfer(address recipient, uint256 amount) external returns (bool);10 function approve(address spender, uint256 amount) external returns (bool);11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 function transfer(address receiver, uint256 numTokens) public override returns (bool) {46 require(numTokens <= balances[msg.sender]);47 balances[msg.sender] = balances[msg.sender]-numTokens;48 balances[receiver] = balances[receiver]+numTokens;49 emit Transfer(msg.sender, receiver, numTokens);50 return true;51 }5253 function approve(address delegate, uint256 numTokens) public override returns (bool) {54 allowed[msg.sender][delegate] = numTokens;55 emit Approval(msg.sender, delegate, numTokens);56 return true;57 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 balances[owner] = balances[owner]-numTokens;68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;69 balances[buyer] = balances[buyer]+numTokens;70 emit Transfer(owner, buyer, numTokens);71 return true;72 }73}Tampilkan semuaImplementasi standar token ERC-20 lain yang sangat baik adalah implementasi ERC-20 OpenZeppelin (opens in a new tab).
Pembaruan terakhir halaman: 21 Agustus 2025