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

Розуміння смарт-контракту токена ERC-20

смарт-контракти
токени
Solidity
erc-20
Для початківців
jdourlens
5 квітня 2020 р.
4 хвилин на читання

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

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

Нижче у вигляді інтерфейсу представлені функції, які повинен реалізовувати ERC-20. Якщо ви не впевнені, що таке інтерфейс: перегляньте нашу статтю про об'єктно-орієнтоване програмування (ООП) у Solidity (opens in a new tab).

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

Гетери

function totalSupply() external view returns (uint256);

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

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

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

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

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

Функції

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

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

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

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

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

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

Події

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

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

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

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

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

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

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

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