Перейти до основного контенту

Зрозумійте смарт-контракт токена ERC-20

Смарт-контракти
токени, лексеми
мова програмування
erc-20
Початківець
jdourlens
5 квітня 2020 р.
4 читається за хвилину

Одним із найважливіших стандартів смарт-контрактів на Ethereum є ERC-20, який став технічним стандартом, що використовується для всіх смарт-контрактів на блокчейні Ethereum для реалізації взаємозамінних токенів.

ERC-20 визначає загальний перелік правил, яких повинні дотримуватися всі взаємозамінні токени Ethereum. Отже, цей стандарт токенів надає розробникам усіх типів можливість точно передбачити, як нові токени працюватимуть у більшій системі Ethereum. Це спрощує та полегшує завдання розробників, оскільки вони можуть продовжувати свою роботу, знаючи, що кожен новий проєкт не потрібно буде переробляти щоразу, коли випускається новий токен, якщо він відповідає правилам.

Ось функції, які має реалізовувати ERC-20, представлені у вигляді інтерфейсу. Якщо ви не впевнені, що таке інтерфейс, перегляньте нашу статтю про ООП-програмування на Solidityopens 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}
Показати все

Ось порядкове пояснення того, для чого призначена кожна функція. Після цього ми представимо просту реалізацію токену ERC-20.

Гетери

1function totalSupply() external view returns (uint256);

Повертає кількість токенів в обігу. Ця функція є гетером і не змінює стан контракту. Майте на увазі, що в Solidity немає значень із рухомою комою. Тому більшість токенів використовують 18 десяткових розрядів і повертають загальну пропозицію та інші результати, наприклад 1000000000000000000 для 1 токена. Не кожен токен має 18 десяткових розрядів, і на це справді потрібно зважати, працюючи з токенами.

1function balanceOf(address account) external view returns (uint256);

Повертає кількість токенів, що належать адресі (account). Ця функція є гетером і не змінює стан контракту.

1function allowance(address owner, address spender) external view returns (uint256);

Стандарт ERC-20 дозволяє одній адресі надавати дозвіл іншій адресі на отримання токенів з неї. Цей гетер повертає залишкову кількість токенів, які spender зможе витратити від імені owner. Ця функція є гетером, не змінює стан контракту і за замовчуванням має повертати 0.

Функції

1function transfer(address recipient, uint256 amount) external returns (bool);

Переміщує кількість (amount) токенів з адреси, що викликала функцію (msg.sender), на адресу одержувача. Ця функція генерує подію Transfer, яка визначена нижче. Функція повертає true, якщо переказ був можливий.

1function approve(address spender, uint256 amount) external returns (bool);

Встановлює allowance (ліміт) — кількість токенів, яку spender може переказати з балансу адреси, що викликала функцію (msg.sender). Ця функція генерує подію Approval. Функція повертає true, якщо ліміт було успішно встановлено.

1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

Переміщує кількість (amount) токенів від sender до recipient за допомогою механізму лімітів. Потім amount вираховується з ліміту, наданого тому, хто викликає функцію. Ця функція генерує подію Transfer.

Події

1event Transfer(address indexed from, address indexed to, uint256 value);

Ця подія генерується, коли кількість токенів (value) надсилається з адреси from на адресу to.

У разі карбування нових токенів переказ зазвичай відбувається з адреси from 0x00..0000, а в разі спалювання токенів — на адресу to 0x00..0000.

1event Approval(address indexed owner, address indexed spender, uint256 value);

Ця подія генерується, коли owner схвалює використання кількості токенів (value) для spender.

Базова реалізація токенів ERC-20

Ось найпростіший код, який можна взяти за основу для вашого токена ERC-20:

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}
Показати все

Ще однією чудовою реалізацією стандарту токенів ERC-20 є реалізація ERC-20 від OpenZeppelinopens in a new tab.

Останні оновлення сторінки: 21 серпня 2025 р.

Чи була ця інструкція корисною?