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

Стандарт Токену ERC-20

Останні оновлення сторінки: 14 лютого 2026 р.

Вступ

Що таке токен?

Токен може представляти практично будь-що в Ethereum:

  • бали репутації в онлайн-платформі
  • навички персонажа в грі
  • фінансові активи, такі як частка в компанії
  • фіатна валюта, як от USD
  • унція золота
  • та багато іншого…

Така потужна особливість Ethereum має керуватися надійним стандартом, так? Саме тут на сцену виходить ERC-20! Цей стандарт дозволяє розробникам створювати токен-додатки, які можуть взаємодіяти з іншими продуктами й послугами. Стандарт ERC-20 також використовується для надання додаткової функціональності .

Що таке ERC-20?

ERC-20 - це стандарт взаємно-заміняючих токенів, іншими словами, вони мають властивість, що робить кожен токен таким же (по типу та значенню) як інший токен. Наприклад, токен ERC-20 працює так само, як ETH, що означає, що 1 токен рівний всім іншим токенам.

Передумови

Основна частина

ERC-20 (Ethereum Request for Comments 20), запропонований Фабіаном Фогельстеллером у листопаді 2015 році, є стандартом токенів, який реалізує API для маркерів у Smart-Contract.

Приклад функцій ERC-20:

  • перевести токени з одного рахунку на інший
  • отримати теперішній баланс токену на акаунті
  • отримати загальну кількість токенів у мережі
  • дозволити витратити деяку кількість токенів з Вашого акаунту іншим акаунтом

Якщо Смарт-Контракт реалізує наступні методи і події, він може називатись ERC-20 контракт і, після розгортання, він буде відповідальним за відстеженням створених токенів на Ethereum.

З EIP-20opens in a new tab:

Методи

1function name() public view returns (string)
2function symbol() public view returns (string)
3function decimals() public view returns (uint8)
4function totalSupply() public view returns (uint256)
5function balanceOf(address _owner) public view returns (uint256 balance)
6function transfer(address _to, uint256 _value) public returns (bool success)
7function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
8function approve(address _spender, uint256 _value) public returns (bool success)
9function allowance(address _owner, address _spender) public view returns (uint256 remaining)
Показати все

Події

1event Transfer(address indexed _from, address indexed _to, uint256 _value)
2event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Приклади

Давайте подивимося наскільки є важливим стандарт, щоб спростити нам перевірку будь-якого контракту на токен ERC-20 на Ethereum. Нам потрібен лише контракт Application Binary Interface (ABI), щоб створити інтерфейс до будь-якого ERC-20 токену. Як ви можете побачити нижче, ми використовуємо спрощений ABI, щоб зробити чіткий приклад.

Приклад Web3.py

Спочатку переконайтеся, що ви встановили бібліотеку Python Web3.pyopens in a new tab:

1pip install web3
1from web3 import Web3
2
3
4w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
5
6dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
7weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)
8
9acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
10
11# Це спрощений двійковий інтерфейс програми (ABI) контракту токена ERC-20.
12# Він надає доступ лише до методів: balanceOf(address), decimals(), symbol() і totalSupply()
13simplified_abi = [
14 {
15 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
16 'name': 'balanceOf',
17 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
18 'stateMutability': 'view', 'type': 'function', 'constant': True
19 },
20 {
21 'inputs': [],
22 'name': 'decimals',
23 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
24 'stateMutability': 'view', 'type': 'function', 'constant': True
25 },
26 {
27 'inputs': [],
28 'name': 'symbol',
29 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
30 'stateMutability': 'view', 'type': 'function', 'constant': True
31 },
32 {
33 'inputs': [],
34 'name': 'totalSupply',
35 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
36 'stateMutability': 'view', 'type': 'function', 'constant': True
37 }
38]
39
40dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
41symbol = dai_contract.functions.symbol().call()
42decimals = dai_contract.functions.decimals().call()
43totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
44addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
45
46# DAI
47print("===== %s =====" % symbol)
48print("Total Supply:", totalSupply)
49print("Addr Balance:", addr_balance)
50
51weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
52symbol = weth_contract.functions.symbol().call()
53decimals = weth_contract.functions.decimals().call()
54totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
55addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
56
57# WETH
58print("===== %s =====" % symbol)
59print("Total Supply:", totalSupply)
60print("Addr Balance:", addr_balance)
Показати все

Відомі проблеми

Проблема з отриманням токенів ERC-20

Станом на 20.06.2024 через цю проблему було втрачено токенів ERC-20 на суму щонайменше $83,656,418. Зауважте, що чиста реалізація ERC-20 схильна до цієї проблеми, якщо ви не застосуєте набір додаткових обмежень поверх стандарту, як зазначено нижче.

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

  1. Механізм передачі токенів
  • Токени ERC-20 передаються за допомогою функцій transfer або transferFrom
    • Коли користувач надсилає токени на адресу контракту за допомогою цих функцій, токени передаються незалежно від того, чи призначений контракт-одержувач для їх обробки
  1. Відсутність сповіщення
    • Контракт-одержувач не отримує сповіщення або зворотного виклику про те, що на нього були надіслані токени
    • Якщо в контракті-одержувачі відсутній механізм для обробки токенів (наприклад, резервна функція або спеціальна функція для керування отриманням токенів), токени фактично застрягають на адресі контракту
  2. Немає вбудованої обробки
    • Стандарт ERC-20 не містить обов'язкової функції, яку мають реалізовувати контракти-одержувачі, що призводить до ситуації, коли багато контрактів не можуть належним чином керувати вхідними токенами

Можливі рішення

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

  • Найпоширеніша проблема виникає, коли користувач надсилає токени на адресу самого контракту токена (наприклад, USDT, внесений на адресу контракту токена USDT). Рекомендується обмежити функцію transfer(..) , щоб скасовувати такі спроби переказу. Розгляньте можливість додавання перевірки require(_to != address(this)); у реалізацію функції transfer(..).
  • Функція transfer(..) загалом не призначена для внесення токенів на контракти. approve(..) та transferFrom(..) — патерн, що натомість використовується для депонування токенів ERC-20 на контракти. Можна обмежити функцію переказу, щоб заборонити внесення токенів на будь-які контракти за її допомогою, однак це може порушити сумісність із контрактами, які припускають, що токени можна вносити на контракти за допомогою функції trasnfer(..) (наприклад, пули ліквідності Uniswap).
  • Завжди виходьте з припущення, що токени ERC-20 можуть опинитися у вашому контракті, навіть якщо ваш контракт не повинен їх отримувати. Немає способу запобігти або відхилити випадкові депозити з боку одержувача. Рекомендується реалізувати функцію, яка дозволить витягти випадково внесені токени ERC-20.
  • Розгляньте можливість використання альтернативних стандартів токенів.

Унаслідок цієї проблеми з’явилися деякі альтернативні стандарти, як-от ERC-223 або ERC-1363.

Для подальшого читання

Інші стандарти взаємозамінних токенів

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