Memahami kontrak pintar token ERC-20
Salah satu standar kontrak pintar yang paling penting di Ethereum dikenal sebagai ERC-20, yang muncul sebagai standar teknis yang digunakan oleh semua kontrak pintar di blockchain Ethereum untuk implementasi token yang dapat dipertukarkan.
ERC-20 menentukan daftar aturan umum yang harus dipatuhi oleh semua token Ethereum yang dapat dipertukarkan. Konsekuensinya, standar token ini memberdayakan pengembang dari semua golongan untuk memperkirakan secara akurat bagaimana token baru akan berfungsi dalam sistem Ethereum yang lebih besar. Ini menyederhanakan dan mempermudah tugas para pengembang, karena mereka bisa meneruskan pekerjaan, mengetahui bahwa tiap proyek baru tidak akan perlu dikerjakan ulang setiap kali token baru dirilis, asalkan token yang ada mengikuti aturan.
Berikut adalah, yang ditampilkan sebagai antarmuka, fungsi yang harus diimplementasikan ERC-20. Jika Anda tidak yakin tentang apa itu antarmuka: lihat 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 semuaSalin
Berikut adalah penjelasan baris per baris dari peran setiap fungsi. Setelah ini, kita akan mempresentasikan implementasi sederhana dari token ERC-20.
Getter
1function totalSupply() external view returns (uint256);Salin
Mengembalikan jumlah token yang ada. Fungsi ini adalah pengambil dan tidak memodifikasi state kontrak. Ingatlah bahwa tidak ada float dalam Solidity. Oleh karena itu, kebanyakan token mengadopsi 18 desimal dan akan mengembalikan pasokan total dan hasil lainnya sebagai berikut 1000000000000000000 untuk 1 token. Tidak semua token memiliki 18 desimal dan ini adalah sesuatu yang perlu Anda perhatikan saat menangani token.
1function balanceOf(address account) external view returns (uint256);Salin
Mengembalikan jumlah token yang dimiliki oleh satu alamat (account
). Fungsi ini adalah pengambil dan tidak memodifikasi state kontrak.
1function allowance(address owner, address spender) external view returns (uint256);Salin
Standar ERC-20 memungkinkan alamat memberi izin ke alamat lain agar bisa mengambil token darinya. Pemanggil ini mengembalikan jumlah token tersisa yang akan dizinkan untuk dipakai oleh spender
atas nama owner
. Fungsi ini adalah pemanggil dan tidak memodifikasi state kontrak dan akan mengembalikan 0 secara default.
Fungsi
1function transfer(address recipient, uint256 amount) external returns (bool);Salin
Memindahkan amount
token dari alamat pemanggil fungsi (msg.sender
) ke alamat penerima. Fungsi ini memancarkan aksi Transfer
yang ditentukan nanti. Akan mengembalikan nilai true jika transfer memungkinkan.
1function approve(address spender, uint256 amount) external returns (bool);Salin
Tetapkan jumlah allowance
yang diizinkan untuk ditransfer oleh spender
dari saldo pemanggil fungsi (msg.sender
). Fungsi ini memancarkan aksi Persetujuan. Fungsi ini mengembalikan informasi apakah allowancenya berhasil ditetapkan.
1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);Salin
Memindahkan amount
token dari sender
ke recipient
menggunakan mekanisme allowance. jumlah kemudian dikurangi dari allowance pemanggil. Fungsi ini memancarkan aksi Transfer
.
Aksi
1event Transfer(address indexed from, address indexed to, uint256 value);Salin
Aksi ini dipancarkan saat jumlah token (nilai) dikirim dari alamat from
ke alamat to
.
In the case of minting new tokens, the transfer is usually from
the 0x00..0000 address while in the case of burning tokens the transfer is to
0x00..0000.
1event Approval(address indexed owner, address indexed spender, uint256 value);Salin
Aksi ini dipancarkan saat jumlah token (value
) disetujui oleh owner
untuk digunakan oleh spender
.
Implementasi sederhana token ERC-20
Berikut adalah kode paling sederhana sebagai 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 semuaSalin
Implementasi standar token ERC-20 luar biasa lainnya adalah implementasi OpenZeppelin ERC-20(opens in a new tab).
Terakhir diedit: @nhsz(opens in a new tab), 15 Agustus 2023