Lanjut ke konten utama

Memahami kontrak pintar token ERC-20

kontrak pintartokensoliditymemulaierc-20
Pemula
jdourlens
EthereumDev(opens in a new tab)
5 April 2020
4 bacaan singkat minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
Tampilkan semua
Salin

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;
2
3interface IERC20 {
4
5 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);
8
9 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);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
17
18
19contract ERC20Basic is IERC20 {
20
21 string public constant name = "ERC20Basic";
22 string public constant symbol = "ERC";
23 uint8 public constant decimals = 18;
24
25
26 mapping(address => uint256) balances;
27
28 mapping(address => mapping (address => uint256)) allowed;
29
30 uint256 totalSupply_ = 10 ether;
31
32
33 constructor() {
34 balances[msg.sender] = totalSupply_;
35 }
36
37 function totalSupply() public override view returns (uint256) {
38 return totalSupply_;
39 }
40
41 function balanceOf(address tokenOwner) public override view returns (uint256) {
42 return balances[tokenOwner];
43 }
44
45 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 }
52
53 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 }
58
59 function allowance(address owner, address delegate) public override view returns (uint) {
60 return allowed[owner][delegate];
61 }
62
63 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
64 require(numTokens <= balances[owner]);
65 require(numTokens <= allowed[owner][msg.sender]);
66
67 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 semua
Salin

Implementasi standar token ERC-20 luar biasa lainnya adalah implementasi OpenZeppelin ERC-20(opens in a new tab).

Terakhir diedit: @yeremiaryangunadi(opens in a new tab), 15 Agustus 2023

Apakah tutorial ini membantu?