Флеш-займы: мощный инструмент и его обратная сторона

Как взять в долг миллион без залога — и вернуть в той же транзакции.

Флеш-займ (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, агрегированные оракулы, снапшоты прошлого блока.
Проверьте себя
1. Почему флеш-займу не нужен залог?
AКредитор доверяет заёмщику
BЕсли заём не вернут в той же транзакции, она целиком откатывается
CЗалог хранится отдельно
DЗаём очень мал
2. Чем по сути является флеш-займ в атаках?
AСамой уязвимостью
BУсилителем, эксплуатирующим другую слабость протокола
CСпособом украсть приватный ключ
DВидом оракула
3. Какая защита снижает риск флеш-атак на голосование?
AЗапретить голосование
BСчитать вес голоса по снапшоту прошлого блока, а не по мгновенному балансу
CУвеличить комиссию
DУменьшить размер пула