Флеш-займы: мощный инструмент и его обратная сторона
Как взять в долг миллион без залога — и вернуть в той же транзакции.
Флеш-займ (flash loan) — заём без залога, который должен быть взят и полностью возвращён в пределах одной транзакции; иначе вся транзакция откатывается, как будто займа не было.
Как это вообще возможно
Атомарность транзакции в блокчейне означает: либо все её операции выполняются, либо ни одна. Флеш-займ опирается на это: протокол выдаёт вам средства, вызывает ваш код, а в конце проверяет, что заём + комиссия возвращены. Если нет — вся транзакция отменяется, и деньги никогда «не уходили». Поэтому залог не нужен: невозврат физически невозможен.
// Концепт флеш-займа (атомарность гарантирует возврат)
function flashLoan(uint amount) external {
uint before = token.balanceOf(address(this));
token.transfer(msg.sender, amount); // выдали
IBorrower(msg.sender).execute(); // ваш код в той же tx
require(token.balanceOf(address(this)) >= before + fee, "not repaid");
// если не вернули -> revert, займа как не было
}Легитимное использование
Флеш-займы — полезный инструмент честной DeFi-механики: арбитраж (выровнять цену между биржами), рефинансирование долга, безболезненная замена залога. Они демократизируют доступ к капиталу: не нужно владеть миллионом, чтобы провести арбитраж на миллион в одну транзакцию.
Почему они опасны для уязвимых протоколов
Обратная сторона: флеш-займ временно даёт атакующему огромный капитал. Если где-то в DeFi решение зависит от мгновенного состояния (например, цена берётся из спота одного пула, или вес голоса = баланс токенов «прямо сейчас»), атакующий за одну транзакцию раздувает это состояние занятыми деньгами, эксплуатирует уязвимую логику и возвращает заём. Важно понимать: флеш-займ — усилитель, а не сама уязвимость. Он опасен ровно настолько, насколько ваш протокол доверяет мгновенным, манипулируемым величинам.
Флеш-займ = рычаг. Он эксплуатирует ДРУГУЮ слабость:
- spot-цену из одного пула как оракул
- голосование по мгновенному балансу токенов
- расчёт, чувствительный к временному дисбалансу пулаКак защищаться
- Не доверяйте мгновенному состоянию. Цены — через TWAP/агрегированные оракулы; вес голоса — через снапшоты на прошлый блок.
- Снапшоты в прошлом. Если величина берётся «на блок назад», флеш-займ (живущий в текущем блоке) её не сдвинет.
- Проектируйте инварианты, устойчивые к временному дисбалансу. Спрашивайте: «что сломается, если на миг появится огромный капитал?»
Частые ошибки
- Винить флеш-займы. Запрет на них не лечит причину — уязвимая логика останется.
- Голосование/цена по мгновенному балансу. Главный магнит для флеш-атак.
Итоги
- Флеш-займ — беззалоговый заём в пределах одной транзакции; атомарность гарантирует возврат.
- Легитимен для арбитража, рефинансирования, замены залога.
- Он усиливает другие уязвимости, давая временный огромный капитал.
- Защита: не доверять мгновенному состоянию — TWAP, агрегированные оракулы, снапшоты прошлого блока.