Все статьи
Гайды

Что такое флеш-кредит в Solana и как он работает

Флеш-кредит в Solana: заём без залога, который возвращается в той же транзакции. Как кредитор это проверяет, сколько это стоит и где предел.

8 минут чтения J Tools Editorial
Панель «Как это работает» Флеш-объёма показывает флеш-кредит: заём 100 SOL, покупка, продажа и возврат в одной транзакции, а кошелёк всё так же на 2,41 SOL

Флеш-кредит в Solana даёт токены взаймы без залога и без проверки кредитной истории при одном условии: деньги должны вернуться до конца транзакции. Если возврата нет или он не проходит, сеть отклоняет всю транзакцию, и займа словно никогда не было. Непогашенного долга не остаётся ни при каком исходе, поэтому протокол кредитования может выдать такой заём любому кошельку.

Звучит как лазейка. На деле это два обычных правила, которые работают вместе: транзакция выполняется целиком или никак, а программа может прочитать остальные инструкции той транзакции, внутри которой запущена. Всё, что делает флеш-кредит, включая то, как он ломается, вытекает из этих двух фактов.

Как флеш-кредит работает внутри одной транзакции

Solana выполняет транзакцию как список инструкций, строго по порядку. Документация Solana о транзакциях формулирует правило прямо: если падает любая инструкция, падает вся транзакция, а все изменения состояния откатываются. Флеш-кредит это список, построенный вокруг этого правила.

  1. Заём. Программа кредитования переводит токены из своего хранилища на ваш токен-счёт.
  2. Использование. Ваши собственные инструкции их тратят: своп, ликвидация, депозит в другом протоколе.
  3. Возврат. Программа кредитования забирает ту же сумму обратно, плюс свою комиссию, если она её берёт.

Если третий шаг выполнить нельзя, скажем, своп вернул меньше, чем планировалось, первый шаг отменяется вместе со всем остальным, и хранилище остаётся там же, где было. По той же причине не нужен залог. Обычному кредиту он нужен, потому что между выдачей и возвратом проходит время, а здесь не проходит нисколько.

Флеш-объём в момент открытия транзакции: отмечен только заём 100 SOL, цена J Token стоит ровно, в кошельке 2,41 SOL

Откуда кредитор знает, что возврат будет

Заём выполняется первым, значит, решать ему приходится до того, как возврат случился. Поэтому он читает вперёд. Solana делает каждую инструкцию верхнего уровня текущей транзакции доступной через особый аккаунт, instructions sysvar (системную переменную инструкций), а руководство Solana по интроспекции инструкций называет именно такое применение: проверить, что нужная инструкция стоит в той же транзакции.

Kamino Lend публикует исходный код своей программы, и проверка там видна целиком. Инструкция займа у Kamino просматривает все инструкции после себя и отказывается выдавать деньги, пока не найдёт ровно один подходящий возврат:

  • возврат называет ту же сумму;
  • в нём те же аккаунты, в том же порядке;
  • он ссылается на позицию займа в транзакции;
  • после него не идёт второй флеш-кредит.

Как и два других кредитора ниже, Kamino отклоняет заём, вызванный изнутри другой программы (через CPI), потому что sysvar перечисляет только инструкции верхнего уровня. У marginfi схема другая: стартовая инструкция проверяет, что дальше в транзакции стоит завершающая, а завершающая запускает проверку здоровья счёта.

Мелочи здесь решают. Возврат у Kamino хранит позицию займа в виде номера, поэтому если кошелёк вставляет перед займом собственную защитную инструкцию, возврат указывает не на ту инструкцию, и его отклоняют. Возврат у Jupiter Lend позицию не хранит, и это одна из причин, по которым инструмент Флеш-объём занимает именно там.

Какие кредиторы Solana дают флеш-кредиты

Три протокола кредитования описывают флеш-кредиты Solana в собственной документации для разработчиков.

Кредитор Комиссия кредитора
Jupiter Lend Нет, согласно его документации, хотя у администратора есть настройка комиссии
Kamino Lend Задаётся для каждого резерва; резерв может отключить флеш-кредиты
marginfi (документация теперь под именем Project 0) Нет, согласно его документации

Для чего используют флеш-кредиты

Каждой из этих задач нужна крупная сумма на несколько инструкций и ничего после.

  • Арбитраж. Купить токен там, где он дешевле, продать там, где дороже, вернуть заём. Если разница успела закрыться, продажа не покрывает возврат, и транзакция откатывается.
  • Ликвидации. Заём гасит долг заёмщика с нездоровой позицией, а залог, полученный со скидкой и обменянный обратно, покрывает возврат займа.
  • Замена залога и рефинансирование. Погасить кредит заёмными токенами, вывести залог, обменять его или перенести к другому кредитору, занять снова, вернуть заём.
  • Самоликвидация. Если гасить долг собственным залогом, вы сохраняете премию, которую забрал бы ликвидатор. Так работает функция Kamino для погашения долга залогом.
  • Лупинг. Занять, обменять на залоговый актив, внести его, занять под него, вернуть. На этом построен Multiply от Kamino.
  • Торговый объём. Купить токен и продать его обратно в том же пуле ликвидности; кошелёк платит только за этот круг.

Последний случай и выполняет инструмент Флеш-объём. Он занимает SOL у Jupiter Lend, покупает ваш токен в одном пуле ликвидности на PumpSwap, Raydium, Orca или Meteora, продаёт его обратно, возвращает заём и платит свою комиссию под одной подписью, а полную цену сделки показывает до того, как откроется кошелёк. Любой, кто читает транзакцию, видит заём, покупку и продажу с одного кошелька. Если токены нужно оставить себе, используйте вместо этого обмен токенов через маршруты Jupiter.

Сколько стоит флеш-кредит в Solana

Основная сумма займа расходом не является: она возвращается в той же транзакции. Платите вы за всё, что вокруг неё.

Комиссия кредитора. Jupiter Lend и marginfi описывают в документации флеш-кредиты без комиссии, а Kamino задаёт комиссию для каждого резерва. Администратор Jupiter Lend всё же может изменить настройку комиссии, поэтому Флеш-объём читает её перед каждым займом и отказывается собирать транзакцию, если она не равна нулю.

Комиссии свопов и влияние на цену. Каждый своп внутри займа платит комиссию своего пула ликвидности, а крупная сумма против тонкого пула ликвидности двигает цену против вас дважды, на входе и на выходе. Почему так, показывает разбор как устроена глубина пула ликвидности. Задайте минимальную сумму на выходе для каждого свопа, ведь возврат, которому не хватило суммы, топит всё; компромисс описан в статье как выбрать проскальзывание в Solana.

Комиссии сети. Базовая комиссия составляет 5000 лампортов за подпись. К ней добавляется приоритетная комиссия, которая считается за каждую запрошенную вычислительную единицу (compute unit), а флеш-кредит запрашивает вычислений намного больше, чем простой перевод. Как её подобрать, объясняет материал сколько платить приоритетной комиссии.

Неудачный заём обходится дёшево, но не бесплатно: транзакция, которая попала в блок и откатилась, всё равно платит комиссию сети. Так пишут и документация Solana, и руководство Jupiter по флеш-кредитам. Транзакция, которая не прошла симуляцию и не была отправлена, не стоит ничего.

До начала Флеш-объём показывает кошелёк с 2,41 SOL, ровную цену J Token и кнопку покупки и продажи на 100 SOL

Симулируйте перед подписью. Флеш-кредит, который провалился бы, покажет это неудачной симуляцией, и на этом этапе он вам ещё ничего не стоил.

Лимиты: размер транзакции, вычисления и запасы кредитора

Флеш-кредит не может перерасти одну транзакцию: v0-транзакции, которыми пользуются такие займы, вмещают максимум 1232 байта и 1 400 000 вычислительных единиц. Заём, возврат, свопы и все их аккаунты должны уместиться, поэтому разработчики опираются на таблицы поиска адресов (address lookup tables).

Растянуться на две транзакции он тоже не может. Sysvar перечисляет только текущую транзакцию, поэтому возврат во второй транзакции для займа невидим, даже внутри одного Jito bundle. А что гарантирует Jito bundle, это отдельный вопрос.

Остаётся то, что есть у самого кредитора. Заём берётся из его хранилища, некоторые кредиторы добавляют лимит на один заём, а выдачу могут приостановить, так что максимальный размер займа это текущее показание, а не константа. Kamino и marginfi к тому же допускают только один флеш-кредит на транзакцию.

Риски: предупреждения кошелька и атаки на оракулы

Будьте готовы к предупреждению кошелька. Phantom предупреждает, когда не может корректно просимулировать транзакцию, и среди причин называет размер у самого предела и транзакции, которые падают. Флеш-кредит большой по размеру и за один раз обращается и к кредитору, и к DEX. Когда цена ушла слишком далеко, его симуляция падает, и так кошелёк сообщает вам, что заём не будет возвращён.

К тому же каждый флеш-кредит публичен. Любой может открыть транзакцию в обозревателе блоков, а массовый анализ кошельков Wallet Scope показывает сделки и PnL кошельков, которые за ней стоят.

Тёмные страницы этой истории касаются других протоколов. Атака с флеш-кредитом искажает цену внутри одной транзакции: заёмная сумма сдвигает тонкий пул ликвидности, а протокол, который читает этот пул как источник цены, действует по искажённому числу. В качестве защиты документация Kamino описывает цены, усреднённые по времени, и ценовые коридоры. Ваши собственные минимальные суммы на выходе вдобавок ограничивают сэндвич-атаки вокруг крупного свопа.

Флеш-кредит, обычный кредит и маржа

Флеш-кредит Кредит под залог Маржа
Залог Нет Стоит больше самого кредита Ваш депозит плюс позиция
Срок Одна транзакция Пока не вернёте Пока счёт остаётся здоровым
Если не вернуть Транзакция откатывается Залог ликвидируют Позицию ликвидируют
Вы платите Комиссию кредитора, если она есть, комиссии свопов и сети Проценты, пока кредит открыт Проценты и торговые комиссии

Кредит под залог и маржа несут риск во времени, потому что цены двигаются, пока позиция открыта. У флеш-кредита в Solana никакого «пока» нет: потерять можно комиссию откатившейся транзакции плюс торговый убыток, который покрывает ваш собственный баланс.

Статья объясняет, как работают флеш-кредиты, и не является финансовой, инвестиционной, юридической или налоговой консультацией. Сделки внутри займа могут приносить убыток, а кредиторы могут менять условия или приостанавливать выдачу.

Частые вопросы о флеш-кредитах

Флеш-кредит в Solana бесплатный?

Сам заём может быть бесплатным: Jupiter Lend и marginfi описывают в документации флеш-кредиты без комиссии, а Kamino задаёт комиссию для каждого резерва. Комиссии свопов, комиссию сети и комиссию инструмента, которым вы пользуетесь, вы платите всё равно.

Нужны ли залог или проверка кредитной истории?

Нет. Возврат должен лишь стоять в той же транзакции и пройти успешно. Но в кошельке всё равно нужен SOL на комиссию сети и на любую недостачу, которую оставят сделки.

Что будет, если заём нельзя вернуть?

Вся транзакция отклоняется, и каждое изменение внутри неё отменяется, включая сам заём. Транзакция, включённая в блок, всё равно платит комиссию сети; та, что не прошла симуляцию и не была отправлена, не платит ничего.

Может ли флеш-кредит охватить две транзакции или Jito bundle?

Нет. Кредитор находит возврат через instructions sysvar, а он перечисляет только текущую транзакцию. Возврат в другом месте поэтому не засчитывается, даже внутри того же бандла транзакций.

Почему флеш-кредиты появляются в отчётах о взломах?

Они позволяют любому распоряжаться крупной суммой в пределах одной транзакции. Взломы били по протоколам, которые доверяли спотовой цене из тонкого пула ликвидности, а заёмная сумма могла эту цену сдвинуть. Цены, усреднённые по времени, делают такое намного сложнее.

J
Автор
J Tools Editorial

Материал команды J Tools.

Все материалы автора J Tools Editorial →

Похожие статьи