Привет! Меня зовут Павел Найданов, я блокчейн-разработчик, пишу смарт-контракты на Solidity в MetaLamp. Наша команда занимается разработкой DeFi-приложений на базе платформ Ethereum и Cardano.

Несколько лет практики и углубленного ресерча не прошли даром: нашу команду (меня вместе с Романом Ярлыковым и Алексеем Куценко) приглашают в качестве экспертов к созданию учебного курса по блокчейн. А еще мы начали упаковывать наши наработки в wiki-статьи, для того чтобы начинающим web3-разработчикам было проще пройти наш путь. Кстати, вместе с web3-сообществом стартовали разработку дорожной карты развития по предметке web3, она открытая и бесплатная, кому интересно — welcome!

Получив опыт подготовки материалов для разработчиков, мы решили, что ценная информация заслуживает более широкого внимания. Решили переработать часть материалов, дополнить и перевести с «понятного только посвященным» на общечеловеческий, чтобы сделать web3 более доступным для всех, кому интересно погрузиться в мир криптовалют более предметно.   

Задумано — сделано: мы подготовили цикл статей, которые наглядно показывают и объясняют, как устроены децентрализованные обменники, по каким принципам они работают, какие монстры проблемы и сложности могут поджидать пользователей и программистов в мире web3. Все разбираем по полочкам на конкретных примерах.

DEX

Децентрализованные обменники (DEX) — ключевая составляющая сферы DeFi (децентрализованных финансов). В отличие от централизованных решений (CEX), DEX не верифицируют пользователей, не хранят их средства и не контролируют операции.

Существует два вида DEX: на базе AMM и на базе OrderBook. В этой статье мы рассмотрим устройство первого варианта. 

DEX на базе автоматизированного маркет-мейкера

Благодаря простоте и удобству DEX на базе автоматизированного маркет-мейкера (AMM) заняли заметную нишу в сфере DeFi. В основе работы такого типа обменника лежит автоматическая оценка стоимости активов на основе математической формулы. 

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

Взаимодействие с DEX на AMM — это по сути взаимодействие со смарт-контрактами обменника, которые автоматически обрабатывают сделки по обмену токенами.

Пул ликвидности (LP)

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

Сложно провести параллель с традиционными финансами, поскольку этому явлению из мира крипты там аналогов нет. 

Откуда же берутся токены в пуле ликвидности? 

Токены для обмена не могут взяться из воздуха. Они хранятся в резерве на смарт-контракте. Допустим, пользователь хочет поменять токен USDT на ETH: для успешного обмена ETH уже должен быть в достаточном количестве на смарт-контракте.

Пул ликвидности формируется из токенов пользователей, которые готовы предоставить свою ликвидность за вознаграждение. Любой пользователь протокола может вложить в него свои активы.

Смарт-контракт в DEX называется пулом, поскольку он объединяет вложенные активы сразу множества пользователей. При этом в контракте указывается не количество вложенных активов, а их доля в сопоставлении с  активами других пользователей. Такой подход упрощает расчет вознаграждения.

Активы пользователя DEX — это не то же, что активы клиента на счетах в банке: пользователь может полностью или частично забрать их в любой момент.

Поставщик ликвидности

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

Есть чёткая корреляция: чем больше активов пользователь вносит в пул, тем больше специальных токенов получает. Эти специальные токены называются lp-токенами. И доля каждого поставщика увеличивается в соответствии с ростом общего пула ликвидности. 

Пул ликвидности постоянно растет за счёт взимания комиссии с каждой сделки: комиссия за обмен токенов добавляется к пулу, увеличивая его общую ликвидность. Некоторые DEX дополнительно удерживают часть комиссии в качестве сервисного налога для себя за предоставление децентрализованной площадки для обмена активов.

В целом этот процесс выглядит так:

  1. Пользователь DEX хочет обменять токен А на токен Б.

  2. Он отдаёт в пул ликвидности токен А. Взамен получает возможность забрать токен Б.

  3. Пользователь платит комиссию за обмен токенов и получает немного меньше токенов Б. Комиссия остаётся в пуле.

  4. Собранная комиссия распределяется среди поставщиков ликвидности пропорционально вложенным им активам.

То же самое можно представить схематично.

Математика AMM

Давайте посмотрим, как рассчитывается стоимость актива при обмене. 

Главная особенность АММ — автоматическое определение цены активов. Специальный алгоритм рассчитывает цену актива относительно других активов в пуле по математической формуле. 

Существует несколько формул для расчёта стоимости активов. Но основных переменных в этих формулах всего три: X, Y и K.

X — это суммарная ценность (количество актива * цену актива) первого актива в пуле ликвидности,

Y — это суммарная ценность (количество актива * цену актива) второго актива в пуле ликвидности,

K — это константа, которая всегда сохраняет одно и то же значение, показывая соотношение токенов в пуле ликвидности. Она также называется инвариантой.

Рассмотрим популярные виды AMM, основанные на математических формулах.

  • маркет-мейкер на основе постоянного значения произведения

X * Y = K
  • маркет-мейкер на основе постоянного значения суммы

 X + Y = K
  • маркет-мейкер на основе постоянного среднего значения.

  • гибридный маркет-мейкер.

Для последних двух видов мы не стали приводить формулы. В рамках статьи они нам неважны, да и довольно сложны. Если интересно, подробнее о математических формулах можно почитать в книге «How to DeFi Advanced».

А в этой статье мы сфокусируемся на AMM на основе постоянного значения произведения, поскольку именно такой подход обрел наибольшую популярность.

Bonding curve

Математические формулы можно визуализировать с помощью bonding curve. Графика сделает их наглядными и доступными для понимания. 

Рассмотрим кривые, которые демонстрируют, как меняется цена токена (price) в зависимости от его количества (supply).

 

  • Sigmoid curve (сигмовидная). Вверху слева.

  • Quadratic curve (квадратичная). Вверху справа.

  • Negative exponential curve (отрицательная экспоненциальная). Внизу слева.

  • Linear (non-increasing) curve (линейная, невозрастающая). Внизу справа.

Какую математическую формулу выбрать для проекта?

Математика зависит от того, какие бизнес-процессы должен учитывать проект и каких целей достигать. 

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

Цель проекта: вознаградить первых покупателей.

Используем сигмовидную или квадратичную кривую связи. Это позволит первым покупателям приобрести токен за меньшую стоимость, чем последующим. Дальше цена токена будет расти. Получается, чем раньше пользователь купит токен, тем больше сможет заработать.

Такая модель работает, например, для построения альтернативных вариантов сбора инвестиций: можно создать ажиотаж при запуске. Этот вариант также подходит для организации аукциона и поиска максимально возможной для рынка цены на актив.

Цель проекта: вознаградить первых покупателей, но не препятствовать более поздним покупкам.

Для достижения этой цели применяем экспоненциальную или линейную кривую. Модель отрицательной экспоненциальной кривой так же, как и в первом примере, даёт возможность на старте продаж купить токен по низкой цене и получить прибыль в дальнейшем. С увеличением числа покупок кривая начинает сглаживаться, а рост цены — замедляться. Это говорит о том, что для более поздних приобретений цена будет умеренно высокой.

Эта модель прекрасно работает для классических обменников, где необходимо поддерживать плавное изменение цены в обе стороны: как для покупки, так и для продажи активов.

Цель проекта: поддерживать стабильную цену на покупку актива.

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

Такая модель подходит для обменников, которые оперируют близкими по стоимости активами, например, для обмена стейблкоинов. Если два актива, допустим, равны одному доллару, то пропорциональные изменения цены оказываются не нужны.

Маркет-мейкер на основе постоянного значения произведения

Маркет-мейкер на основе постоянного значения произведения получил наибольшее распространение. Представим формулу X * Y = K на графике. Это будет кривая, которая определяет соотношение между парой токенов в пуле ликвидности.

Эта математическая кривая является гиперболой. График показывает, что данный подход не позволит истощить пул ликвидности. Кривая отчётливо это демонстрирует, поскольку она никогда не пересечется с осями. Это гарантирует, что у пулов AMM всегда будут средства. Они не закончатся, а самое нежелательное, что может произойти — один из токенов достигнет цены, которая приблизится к бесконечности.

Как это работает на практике? Всё достаточно просто. Когда количество X изменяется, количество Y нужно скорректировать, чтобы сохранить постоянную K.

Мы можем представить эту логику в виде следующей формулы:

(X + ΔX) (Y − ΔY) = X * Y

ΔX — количество токена X, которое мы отдаем в пул ликвидности,

ΔY — количество токена Y, которое мы получаем в обмен из пула ликвидности.

Отсюда мы можем высчитать ΔY — количество токенов, которые мы получим, если внесем ΔX токенов в пул:

ΔY = Y - (X * Y) / (X + ΔX)

Пример

У нас есть пул ликвидности для пары токенов X и Y. Напомним, что это смарт-контракт, который еще называют ликвидной парой. В этом пуле 1000 токенов X и 1000 токенов Y. Соотношение равняется 1:1.

Тогда K = X * Y = 1000 * 1000 = 1_000_000.

Мы хотим купить некоторое количество токенов Y, используя наши токены X. Мы готовы использовать 100 токенов X для покупки. Это будет наш ΔX. Теперь нам нужно вычислить, сколько токенов Y мы получим в обмен (это будет наш ΔY).

Согласно формуле:

ΔY = Y - (X * Y) / (X + ΔX),

мы получаем:

ΔY = 1000 - (1000 * 1000) / (1000 + 100) = 1000 - (1_000_000 / 1100) ≈ 91.

Это означает, что мы получим около 91 токена Y в обмен на 100 токенов X. На графике синими точками обозначено количество токенов X и Y до обмена. Зелеными точками обозначено количество токенов X и Y после обмена. Красной линией обозначено количество токенов, которое мы получим за обмен.

На данный момент в пуле 1100 токенов X и 909 токенов Y. Теперь попробуем повторно купить токенов Y. Мы также готовы использовать 100 токенов X для покупки. Это наш ΔX. Вычислим, сколько токенов Y мы получим в обмен(наш ΔY).

Согласно формуле:

ΔY = Y - (X * Y) / (X + ΔX)

мы получаем:

ΔY = 909 - (1100 * 909) / (1100 + 100) = 909 - (999_900 / 1200) ≈ 76.

Это означает, что мы получим около 76 токена Y в обмен на 100 токенов X. В пуле останется 833 токена Y и 1200 токена X. Из этих расчётов можно заметить, что наше округление повлияло на постоянную K и она стала равна 999_900. В рамках примера мы можем позволить себе небольшую погрешность.

Источник баланса для AMM

В первый раз мы получили 91 токен Y. Во второй раз мы получили 76 токенов Y. С каждой такой покупкой мы будем получать меньше токена Y согласно нашей кривой и законам AMM. Чтобы купить одно и то же количество токена Y, нам нужно будет отдавать токена X каждый раз больше. Это означает, что токен Y будет становиться дороже относительно токена X с каждой покупкой. А поскольку механизм рынка всегда  стремится к оптимуму, именно таким образом, AMM гарантирует, что пул ликвидности будет сбалансирован и не будет истощен.

Вывод

Автоматизированные маркет-мейкеры — один из драйверов развития пространства DeFi. Позволяя пользователям создавать эффективные рынки за счет предоставления ликвидности в пул, DEX на AMM существенно повлияли на рост популярности инструментов для обмена криптовалют. Такие обменники позволяют пользователям напрямую взаимодействовать со смарт-контрактом в безопасном пространстве (без контакта с участниками обмена), работают в режиме 24/7 и не требуют поддержки. И хотя у них есть свои ограничения по сравнению с DEX на Orderbook, их ценность для мира DeFi сложно переоценить.

Пользователь знаком с технологией на примере таких решений, как Uniswap, Curve и PancakeSwap. Эффектный дизайн в сочетании с функциональными ограничениями — особенность AMM-решений на данном этапе. 

По сути, AMM все еще находятся в начальной эпохе развития; предстоит немало работы, чтобы догнать классические обменники, которые поддерживают маржинальную торговлю и лимитные ордера. А также ожидается усовершенствование протоколов, которые минимизируют непостоянные потери. 

Можно предположить, что в будущем появится много инновационных решений для AMM. Улучшение функциональности автоматических маркет-мейкеров приведет к снижению комиссий и улучшению ликвидности для всех участников децентрализованных обменов.

А в следующей статье мы рассмотрим альтернативный вариант работы обменников на базе Orderbook. 

Комментарии (2)


  1. mikegordan
    24.07.2023 02:08

    После первого примера в голове сразу появилось постоянное не понимание "ведь теперь К != 1_000_000" и думал дальше это объяснят , но в итоге "В рамках примера мы можем позволить себе небольшую погрешность."

    А как правильно ? Это же не погрешность , не погрешность округления, а довольно большая часть отсутствует.

    Как правильно? Там более сложная формула или после каждой сделки чтото еще происходит для выравнивания К ?


    1. pnaydanovgoo Автор
      24.07.2023 02:08

      Это очень хороший вопрос, спасибо, что подсветили. Здесь, для простоты понимания операций и работы AMM я довольно грубо округлил значения 91 и 76(после первого и второго обмена) до целого. На самом деле мы получаем дробные числа и если не делать округления, то по исходу двух обменов в пуле останется не 833 токена Y, а 833.333333333. Возьмем это значение и подставим в формулу 833.333333333(токена Y) × 1200(токена X) = 1000000. Таким образом постоянная K сохранена.