ERC-20 — стандарт взаимозаменяемых токенов в Ethereum

ERC-20 — это базовый стандарт взаимозаменяемых токенов в экосистеме Ethereum и других EVM-совместимых сетях.

Контракт, реализующий ERC-20, описывает единый интерфейс для работы с токенами: как узнать баланс, как перевести токены, как разрешить другому контракту списывать средства от вашего имени и т.д.

Благодаря ERC-20:

  • кошельки могут показывать баланс любых совместимых токенов;
  • DEX, лендинги и другие dApp работают с тысячами активов по одному протоколу;
  • токены легко переносимы между DeFi-протоколами внутри одной сети.

Подробнее о семействе стандартов см. ERC-стандарты в Ethereum.

ERC-20 — базовый стандарт взаимозаменяемых токенов в Ethereum

Ключевые свойства токена ERC-20

  • Взаимозаменяемость (fungible).

Все единицы токена одного контракта эквивалентны. 1 токен A = любой другой токен A.

  • Единый интерфейс.

Набор обязательных функций и событий, которые должны поддерживать все корректные реализации ERC-20.

  • Работа на уровне смарт-контракта.

Токен — это не «запись в протоколе Ethereum», а смарт-контракт (смарт-контракт) в EVM, который ведёт собственный учёт балансов.

  • Широкая поддержка.

ERC-20 стал де-факто стандартом взаимозаменяемых токенов во всех EVM-сетях (Ethereum, Arbitrum, Optimism, BNB Chain, Polygon и т.д.).

Обязательные функции ERC-20

Стандарт определяет минимальный набор методов, которые должен реализовать контракт-токен:

  • totalSupply()

Возвращает общее количество выпущенных токенов (в минимальных единицах, без учёта отображаемых десятичных знаков).

  • balanceOf(address)

Показывает баланс токенов указанного адреса.

  • transfer(to, amount)

Переводит токены от отправителя к получателю напрямую.

Используется пользователем, когда он сам инициирует отправку токенов.

  • approve(spender, amount)

Устанавливает лимит разрешения (allowance) для стороннего адреса (чаще всего — смарт-контракта).

Это «разрешение списывать с меня до amount токенов».

  • allowance(owner, spender)

Показывает текущий лимит разрешения: сколько токенов указанный spender еще может списать у owner.

  • transferFrom(from, to, amount)

Переводит токены от from к to при условии, что вызывающий имеет разрешение (allowance).

Именно так контракты DEX/лендинга списывают ваши токены после approve.

Большинство реализаций дополнительно поддерживают:

  • name() — человекочитаемое имя токена;
  • symbol() — короткий тикер (USDT, DAI, WETH и т.п.);
  • decimals() — количество знаков после запятой (обычно 18).

События ERC-20

Для отслеживания операций стандарт определяет два ключевых события:

  • Transfer(address indexed from, address indexed to, uint256 value)

Логируется при любом переводе токенов: прямом (transfer) и опосредованном (transferFrom).

  • Approval(address indexed owner, address indexed spender, uint256 value)

Логируется при изменении лимита разрешения через approve.

Благодаря событиям:

  • блок-обозреватели и аналитические сервисы могут строить историю переводов и одобрений;
  • кошельки отслеживают обновления балансов и лимитов.

Модель approve/allowance и типичные риски

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

  • Сначала пользователь вызывает approve(contract, amount) для контракта DEX/лендинга.
  • Затем вызывает функцию протокола, которая внутри делает transferFrom(user, ...).

Это защищает от несанкционированного списания без предварительного согласия, но создаёт свои нюансы:

  • Пользователи часто дают слишком большой allowance (amount почти бесконечен), чтобы не платить комиссию за повторные approve.
  • В случае уязвимости в контракте-спендере злоумышленник может списать весь разрешённый лимит.
  • Старые практики смены allowance (approve с новым значением) могут быть уязвимы к «race-condition» атакам; многие приложения рекомендуют:
    • сначала сбросить до 0;
    • затем выставить новое значение.

Лучшие практики для пользователей:

  • регулярно проверять и отзывать лишние разрешения в интерфейсах кошельков и DeFi-панелях;
  • не давать бесконечный allowance незнакомым или рискованным протоколам.

Подробнее про комиссии см. Комиссия за gas в Ethereum.

Роль ERC-20 в DeFi и EVM-экосистеме

ERC-20 — фундамент практически всего DeFi:

  • Стейблкоины (USDT, USDC, DAI и др.) реализованы как ERC-20-контракты.
  • Governance-токены протоколов дают право голоса и распределение доходов.
  • Токены ликвидности и долей (LP-токены, доли в пулах, токенизированные депозиты) тоже часто ERC-20.
  • В большинстве сетей мосты и обёрнутые активы (WETH, wBTC и т.п.) реализованы как ERC-20.

Преимущества:

  • единый интерфейс для кошельков, DEX, лендингов;
  • быстрое добавление новых токенов в протоколы;
  • простота аудита и анализа, когда код преимущественно использует проверенные библиотеки (например, стандартные реализации ERC-20).

Ограничения и эволюция стандарта

При всех плюсах, «чистый» ERC-20 имеет ограничения:

  • нет встроенной логики паузы, заморозки, чёрных списков — это добавляется отдельно (что иногда конфликтует с идеей децентрализации);
  • модель approve/allowance не идеальна с точки зрения UX и безопасности;
  • стандарт не знает о комиссиях внутри токена (tax-tokens, rebasing-модели) — такие реализации могут «ломать» ожидания DeFi-протоколов.

Поэтому вокруг ERC-20 появились:

  • расширения (burnable, mintable, permit, pausable и др.);
  • новые стандарты, учитывающие доп. логики и сценарии;
  • другие типы токенов: ERC-721 для NFT, ERC-1155 для мульти-активов.

Частые вопросы (FAQ) про ERC-20

Токен ERC-20 — это отдельная криптовалюта? С точки зрения протокола Ethereum — да, это отдельный актив, но он живет внутри смарт-контракта, а не на уровне самого протокола. Его безопасность зависит и от Ethereum, и от кода контракта.

Можно ли отправить токен ERC-20 «как ETH» на любой адрес? Да, любой адрес Ethereum может владеть токеном. Важно:

  • не отправлять токены на контракты, которые не умеют ими управлять (они могут там «застрять»);
  • всегда проверять, поддерживает ли целевой сервис нужный токен и сеть.

Чем ERC-20 отличается от «сетевого» ETH? ETH — это нативная монета протокола Ethereum (ей платят за газ). ERC-20-токен — это запись в контракте поверх Ethereum. Он может представлять стейблкоин, акцию, долю в протоколе и т.п., но комиссии за газ всё равно платятся в ETH (или в нативном токене сети-аналог).

Почему мой токен ERC-20 не видно в кошельке? Кошелёк мог:

  • не знать адрес контракта токена;
  • не подтянуть автоматически метаданные.

Обычно достаточно вручную добавить адрес контракта токена в интерфейсе кошелька.

См. также

Task Runner