ERC-4626 vault принимает базовый актив и выпускает shares, которые отражают долю вкладчика. Количество долей рассчитывается по отношению assets к totalSupply. В пустом или почти пустом vault это отношение легко сдвинуть прямым переводом токенов, а округление способно превратить следующий депозит в ноль shares.
Такой сценарий называют inflation attack или donation attack. Злоумышленник не увеличивает количество своих долей пропорционально переводу. Он раздувает количество assets, приходящихся на одну share, чтобы новый вкладчик получил слишком мало долей. Особенно опасен первый депозит в недавно созданное хранилище.
Как формируется цена доли
Упрощённо vault рассчитывает shares как внесённые assets, умноженные на существующий totalSupply и разделённые на totalAssets. Если хранилище уже крупное, небольшая посторонняя передача мало меняет курс. Когда supply почти нулевой, даже умеренная donation резко сдвигает соотношение.
Стандарт требует определённых направлений округления. При deposit число выдаваемых shares округляется вниз, чтобы vault не отдал больше долей, чем соответствует активам. Обычная погрешность мала, когда пользователь получает много минимальных единиц share. Если расчёт даёт меньше одной единицы, результат становится нулём.
Базовую связь deposit, mint, withdraw, redeem и preview-функций объясняет статья об устройстве ERC-4626. Inflation attack использует не нарушение интерфейса, а сочетание пустого состояния, прямой donation и дискретного округления.
Атака по шагам
Сначала атакующий опережает первую крупную транзакцию и вносит минимальный депозит. Он получает небольшое количество shares и становится основным владельцем supply. Затем он отправляет базовый токен прямо на адрес vault, минуя deposit. Баланс assets растёт, а новые shares не выпускаются.
После donation каждая существующая share представляет намного больше базового актива. Депозит жертвы рассчитывается по новому курсу. Если результат после деления меньше минимальной единицы shares, vault округляет его до нуля. Активы остаются внутри, но вкладчик не получает требования на них.
Когда атакующий погашает свои shares, он забирает долю общего баланса, включая активы жертвы. Для полного обнуления крупного депозита обычно нужна сопоставимая donation, поэтому атака не бесплатна. Однако mempool позволяет увидеть ожидающий deposit и подобрать величину перевода непосредственно перед ним.
Частичное размытие работает по тому же принципу. Злоумышленник может добиться, чтобы пользователь получил несколько shares и потерял заметную долю на округлении. Интерфейс способен показать успешную транзакцию, хотя экономический результат будет намного хуже ожидаемого.
Как virtual shares и assets меняют расчёт
Распространённая защита добавляет в формулу виртуальные assets и virtual shares. Даже у пустого vault расчёт ведётся так, будто в нём уже есть стартовые величины. Первый реальный вкладчик не получает полный контроль над supply, а часть прямой donation экономически достаётся виртуальной доле.
Дополнительный decimals offset повышает точность shares относительно базового токена. За один asset выпускается больше минимальных единиц доли, поэтому округлить честный депозит до нуля сложнее. Чем выше выбранный offset, тем дороже атакующему сдвинуть курс до опасной зоны.
Другая мера – заранее внести стартовую ликвидность и навсегда заблокировать либо сжечь часть shares. Такие dead shares не позволяют первому внешнему вкладчику владеть всем supply. Защита должна учитывать конкретные decimals и ожидаемые размеры депозитов: символическая стартовая сумма может оказаться недостаточной.
Роутер или интерфейс может проверять minimum shares и отменять deposit при плохом курсе. Это защищает пользователя от неожиданного результата, но не исправляет саму бухгалтерию vault. Если контракт deposit не принимает границу slippage, защитный вызов должен быть атомарным и использовать актуальный preview.
Что проверить пользователю
Перед первым депозитом посмотрите totalAssets и totalSupply. Нулевой или микроскопический supply требует особой осторожности. Сравните convertToShares и previewDeposit для своей суммы. Ожидаемое количество shares должно быть далеко от нуля и соответствовать понятному курсу.
Откройте историю событий vault. Deposit создаёт событие и увеличивает supply, тогда как простой Transfer базового токена на адрес vault может изменить assets без выпуска долей. Навык поиска таких операций описан в материале о событиях смарт-контракта.
Проверьте реализацию формулы. У обновляемого vault найдите текущий implementation, admin и историю upgrades по руководству о типах proxy. Наличие виртуальных величин в библиотеке не гарантирует, что проект не переопределил функции conversion собственным кодом.
Симуляция должна показывать фактический прирост shares, а не только успешный расход asset. Но ожидающий депозит может быть frontrun, поэтому результат симуляции не является окончательной гарантией. Ограничения такого предварительного просмотра разобраны в статье о рисках симуляции.
- Не становитесь первым крупным вкладчиком неизвестного пустого vault.
- Проверьте totalAssets, totalSupply, decimals и previewDeposit.
- Убедитесь, что транзакция защищена minimum shares или эквивалентной границей.
- Найдите virtual shares, virtual assets, dead shares или другую документированную защиту.
- Оцените прямые переводы базового токена и историю изменения курса.
- Начните с небольшой суммы и подтвердите полученные shares onchain.
Inflation attack опасна не ростом цены токена, а искусственным изменением обменного курса vault до выпуска долей следующему вкладчику. Надёжная реализация делает donation убыточной, повышает точность share и позволяет ограничить результат депозита. Пользователь со своей стороны должен проверять состояние хранилища и реальное количество shares, а не полагаться на статус success.



