Что не так с Ethereum: проблемы токенов стандарта ERC20
Прошлый год стал прорывным не только для рынка криптовалют, но и для организаторов ICO — к декабрю 2017 года было проведено 234 кампании, собравших $3.75 миллиарда. Абсолютное большинство ICO прошло и по сей день проходят на базе блокчейна Ethereum, а для привлечения средств чаще всего используются токены стандарта ERC20. Однако, по мнению некоторых блокчейн-разработчиков, данный стандарт имеет один критичный недостаток, о котором знают далеко не все пользователи, но который уже привел к существенным потерям, исчисляемым в миллионах долларов.
Как работает ERC20
ERC20 — первый и самый широко используемый стандарт токенов, выпускаемых на базе блокчейна Ethereum. Данный стандарт был впервые представлен в 2015 году и в переводе с английского (Ethereum Request for Comments) означает «запрос на комментарии в Ethereum».
Именно благодаря внедрению ERC20 на крипторынке был отмечен массовый рост числа ICO-кампаний, поскольку в нем описан конкретный список спецификаций и правил, которым должны соответствовать будущие токены. Проще говоря, ERC20 токены — это специализированные смарт-контракты, которые работают на базе блокчейна Ethereum. Данный стандарт существенно облегчил работу разработчиков, которые до этого должны были сами вырабатывать стандарты совместимости токенов с блокчейном, кошельками, биржами и DApps. На сегодняшний день в сети Ethereum было запущено 67,507 ERC20 токенов-контрактов. А среди самых популярных ERC20 токенов можно отметить EOS, Tron, Binance Coin, ICON, KuCoin, OmiseGO и SingularDTV.
Код стандарта ERC20 предусматривает 6 функций:
Функция totalSupply определяет общее количество токенов.
Функция balance0f показывает баланс на счету определенного адреса, заданного параметром address _owner, где _owner — интересующий адрес.
Функция transfer реализует передачу токенов с первичного адреса на адрес индивидуального пользователя, к примеру, участника ICO.
Функция transferFrom используется для пересылки токенов от одного пользователя к другому.
Функция approve проверяет, остались ли токены у смарт-контракта и предусматривает вывод средств со счета вплоть до максимально допустимой суммы, которая указывается в качестве параметра функции.
Функция allowance гарантирует, что на адресе кошелька-отправителя достаточно токенов для их пересылки на адрес кошелька-получателя.
ERC20 также предусматривает два вида событий:
transfer — событие перевода токенов между счетами;
approval — событие инициируется при успешном выполнении функции approve, описанной выше.
Данные функции и события лежат в основе того, как ERC20 токены пересылаются между адресами и каким образом их держатели могут получить сведения о своих токенах. Также они служат гарантией того, что новые монеты будут полностью функционировать на платформе Ethereum.
Проблемы ERC20
Стандарт ERC20 является первым стандартом, разработанным в сети Ethereum, в связи с чем он имеет существенные недоработки. Блокчейн-разработчик, известный лишь как Dexaran, подробно описал баг, из-за которого при транзакциях пользователи могут потерять свои средства.
Согласно анализу разработчика, ключевая проблема встречается при работе со смарт-контрактами. Транзакция считается выполненной, когда происходит успешный перевод средств. При возникновении ошибки перевод средств должен быть отклонен. При переводе средств в эфире именно это и происходит: если отправить эфир на контракт, который не предусматривает работу с данной криптовалютой, то транзакция будет отклонена смарт-контрактом со стороны получателя и перевод средств не произойдет. Однако, в случае с токенами ERC20, все происходит иначе: смарт-контракт, не поддерживающий данный стандарт, не отклоняет транзакцию, в результате чего токены замораживаются и теряются.
Это происходит из-за того, что для перевода токенов ERC20 необходимо задействовать одну из двух функции. Первая — функция transfer, позволит отправить токены на определенный адрес. Вторая используется для того чтобы внести депозит токенов в смарт-контракт, для чего необходимо использовать комбинацию функций approve + transferFrom. Благодаря функции approve, пользователь дает разрешение смарт-контракту на вывод собственных средств, который осуществляется при помощи функции transferFrom.
Но что если по ошибке пользователь внесет депозит в смарт-контракт с помощью первой функции transfer? Транзакция будет считаться успешной, и сеть ее признает, однако сам смарт-контракт эту транзакцию не увидит, а значит и не зачтет. Например, если таким образом отправить токены на контракт децентрализованного обменника, то контракт эти средства получит, но на балансе они не отобразятся. Более того, если такой контракт не сможет реализовать функцию экстренного вывода токенов, то в таком случае вернуть отправленные средства будет невозможно. Именно из-за этого бага экосистема Ethereum уже потеряла миллионы долларов. Как отметил Dexaran, в сети Ethereum только на следующих семи крупных контрактах было потеряно более $1.3 миллиона:
EOS — $684,987
GNT — $68,300
ZRX — $77,331
Tronix — $189,995
DGD — $173,335
OMG — $101,647
STORJ — $51,095
Также известно, что токены были заморожены в следующих контрактах:
В контракте Golem утеряно 310,067 токенов GNT
В контракте Augur 242 токена REP
В контракте Digix DAO 814 токенов DGD
В контракте FirstBlood 14,506 токенов 1ST
Возможные решения
Как отметил Майкл Малдерс, блокчейн-разработчик в компании The Ledger, для борьбы с данной проблемой члены сообщества Ethereum выпустили альтернативные стандарты токенов, которые могут заменить ERC20 в будущем.
Стандарт ERC223
ERC223 был разработан пользователем Dexaran, который детально проанализировал работу токенов стандарта ERC20 и выпустил свой, как альтернативу, в марте 2017 года. ERC223 позволяет транзакциям с токенами вести себя так же, как и в случае с эфиром — в случае ошибки функции transfer транзакция отменяется, и средства остаются у отправителя. Для этого стандарт ERC223 вводит новые функции, которых нет в ERC20, а именно:
Единую функцию transfer (вместо transfer и transferFrom) с тремя параметрами address _to, uint _value, bytes data.
Функцию tokenFallBack для принимающего контракта, которая определяет тип отправленных монет.
Таким образом, если будет допущена ошибка в одном из трех параметров функции transfer, или же контракт не будет поддерживать tokenFallBack, то транзакция не состоится и средства вернутся на адрес отправителя.
Стандарт ERC777
ERC777 был выпущен в ноябре прошлого года и его главная цель — решить проблемы ERC20 в виде отсутствия механизмов обработки транзакций. В связи с чем данный стандарт токенов предлагает широкий выбор инструментов для обработки транзакций токенов. Для этого стандарт ERC777 использует новый набор функций:
Вместо функции transfer предусмотрена единая функция send;
Вместо approve используется authoriseOperator;
Вместо tokenFallback существует tokensReceived.
Данный подход гарантирует, что эти функции не будут препятствовать, блокировать или пересекаться с функциями других стандартов токенов. Из недостатков, однако, разработчики отмечают, что новые функции токенов стандарта ERC777 могут косвенно перенять баги токенов ERC20, поскольку они не будут блокировать их.
Также стандарт ERC777 использует новый метод распознавания интерфейса контракта, который предусматривает наличие в сети Ethereum центрального реестра контрактов. Любой пользователь может обратиться к такому реестру, чтобы узнать поддерживает ли адрес необходимый набор функций, другими словами, проверяет его интерфейс. Таким образом, также решается проблема Ethereum, где невозможно узнать какие именно функции поддерживает тот или иной контракт.
Другие стандарты
Также разработчиками были представлены такие стандарты, как ERC827, который объединяет в себе преимущества ERC223 с функциями ERC20. Или стандарт ERC664, который позволяет обновлять контракты токенов, однако несет в себе критичный баг ERC20.
Внедрение нового стандарта токенов — трудоемкий процесс, в котором должны участвовать не только члены криптосообщетсва Ethereum, но и биржи, кошельки и разработчики DApps, планирующие работу с новыми токенами. Тем не менее работа над решением проблем и багов ERC20 уже начата, а это значит, что изменения в экосистеме Ethereum неизбежны.