Чому «схвалення токенів» — це найгірша ідея в DeFi.
ERC-20 правильно вирішив роботу з токенами, але зробив неправильним найскладніший момент. Він стандартизував баланси та перекази, але ніколи не запровадив чіткого способу, щоб контракт міг реально використовувати ваші токени. Простий переказ на контракт навіть не повідомляє йому, що щось прийшло. Тож до цього додали гарячий ремонт: approve + transferFrom.
Подивіться, що цей гарячий ремонт примушує вас робити. Щоб дозволити контракту витрачати ваші токени, ви маєте:
- схвалити йому один раз велику або нескінченну суму, і тепер він може звертатися до вашого гаманця коли завгодно, назавжди, поки ви не згадаєте відкликати дозвіл. Ви довіряєте контракту, який, швидше за все, ніколи не читали.
- АБО схвалювати точну суму прямо перед кожною операцією, що означає другу транзакцію та другу комісію за газ на кожну операцію.
Довіряти незнайомцю чи платити податок за кожен рух. Ось два варіанти, і стандарт не пропонує нічого кращого. Тож усі вибирають двері номер один і натискають «нескінченно», і ланцюг наповнюється гаманцями, що тримають на себе наведені пістолети.
Не теоретично. MEV-бот JaredFromSubway саме так втратив мільйони. Нічого не було взломано. Він видав схвалення, переслідуючи фейкові угоди, і хтось використав transferFrom, щоб забрати кошти.
Найгірше: кращий дизайн існував усюди. transfer-and-call (ERC-223, ERC-1363) переміщує точну суму та сповіщає отримувача в одній транзакції. Немає постійного схвалення, немає додаткової транзакції, немає незнайомця з ключем до вашого акаунту. Він програв ERC-20 через його першочерговий старт, і зараз нескінченні схвалення є основою всього DeFi. Permit, Permit2, абстрагування акаунтів — кожен «виправлення» — це пластир на примітивному рішенні, яке ніколи не мали запускати.
Ми не отримали безпечний варіант. Ми отримали зручний — і платимо за це з того самого моменту.