Привет! С вами снова Гарри. Сегодня поговорим о бирже Uniswap. Если после доклада у тебя останутся какие-либо вопросы — не стесняйся задавать их в комментариях, на все обязательно отвечу!
Доклад я делал, опираясь на ветки форума cp0x.com. Огромное спасибо ребятам, очень много полезной информации! Советую почекать.
Ну, как говорится, let’s go!
Uniswap — один из самых интересных проектов, запущенных на Ethereum за последнее время. Это протокол для децентрализованного обмена токенами, сильно отличающийся от других традиционных протоколов, популярных сегодня.
Вдохновленный несколько лет назад одним из постов Виталика Бутерина на Reddit, Хайден Адамс всего лишь хотел получить опыт программирования на Solidity. Однако, вскоре учеба обернулась получением гранта от фонда Ethereum.
Uniswap — это набор смарт-контрактов, развернутых в сети Ethereum. Это означает, что весь процесс обмена производится на блокчейне. Нет ни токена, ни централизации, ни платы основателю сервиса. К механике Uniswap нужно немного привыкнуть, но позже мы увидим, что у протокола есть удивительные преимущества по сравнению с традиционными DEX.
Уникальная архитектура Uniswap полностью исключает книгу заказов. Как ни странно, маркет-мейкеры больше не указывают цену при предоставлении ликвидности. Вместо этого они просто поставляют средства, а Uniswap заботится обо всем остальном.
На типичной традиционной бирже, такой как Coinbase, маркет-мейкеры обычно предоставляют ликвидность в различных ценовых точках. Например, трейдер имеет в своем распоряжении 1000 долларов и 10 ETH. Тогда он может поставить ордер на покупку по цене $80 на 5 ETH, и еще один ордер на покупку по цене $60 на 10 ETH. Что касается продажи ETH, то он может поставить ордер на 4 ETH по 120 долларов и ордер на 6 ETH по 140 долларов. Coinbase решили делать рынки с различными ценовыми точками, что им успешно удается. В совокупности все ордера трейдеров составляют книгу заказов (ордеров). Поскольку рынки движутся вверх или вниз, заказы могут заполняться или не заполняться в зависимости от указанных цен. Как правило, «цена» ETH указывается как середина рынка между самой высокой ставкой на покупку и самой низкой ценой на продажу.
Теперь представьте гипотетически, что Coinbase должен был принимать все заявки и предложения и объединять их в две гигантские корзины. Трейдеру наверняка не слишком понравится эта идея. Они не хотели бы, чтобы их заказы смешивались с другими людьми, или чтобы Coinbase совершал сделки от их имени по произвольной цене.
Но именно так по своей сути работает Uniswap. Маркет-мейкер больше не определяет по каким ценам они готовы покупать или продавать ETH. Вместо этого Uniswap объединяет ликвидность каждого и создает рынки в соответствии с определенным алгоритмом. Этот алгоритм, известный как автоматизированный маркет-мейкер (AMM), устанавливает цены для пользователя в соответствии с некоторым заранее заданным набором правил. Примером очень простого AMM является стратегия бота, которая выставляет заявки на покупку и продажу ровно на один доллар соответственно ниже и выше, чем средняя цена рынка и постоянно пересматривает размещение заказов по мере движения рынка.
Не все AMM одинаковы, и разные стратегии имеют свои собственные компромиссы. Uniswap использует вариант, который они называют «Модель маркет-мейкера постоянного результата». Этот AMM обладает очень приятной особенностью, заключающейся в возможности всегда обеспечить ликвидность, независимо от того, насколько велик размер заявки или насколько мал размер пула ликвидности. Хитрость заключается в том, чтобы асимптотически увеличивать цену монеты по мере увеличения желаемого количества покупки или продажи. Несмотря на то, что крупные заказы находятся в этой системе в невыгодном положении (как мы увидим чуть позже), зато системе никогда не нужно беспокоиться о нехватке ликвидности. Ликвидность будет буквально всегда.
Для трейдеров
Давайте рассмотрим простой пример с использованием торговой пары ETH / DAI. Предположим, что маркет-мейкеры совместно профинансировали пул в размере 100 000 DAI и 1000 ETH. Uniswap берет эти две величины и перемножает их (100 000 x 1000 = 100 000 000).
Цель Uniswap для этой конкретной торговой пары — сохранить результат, т.е. умножение этих двух величин, равных 100 миллионам, независимо от того, сколько торговых операций происходит. Ключевая формула, которую нужно иметь в виду: x * y = k, где x и y — количество монет в пуле ликвидности, а и k — результат. Чтобы сохранить постоянную k, x и y должны быть обратно зависимы, т.е. если x повышается, то y — понижается, и наоборот. Когда трейдер совершает покупку ETH по этому контракту, он увеличивает x (поскольку они добавляют DAI в пул ликвидности) и уменьшает y (когда они удаляют ETH из пула ликвидности). Но данная схема не масштабируется линейно. Попытка купить 100 ETH вместо 10 ETH не требует просто в 10 раз больше DAI. На самом деле он увеличивается асимптотически. Самый простой способ убедиться в этом — построить кривую x * y = k.
Как видите, если вы хотите купить > 2% от пула ликвидности, то это выйдет достаточно дорого. Однако стоит понимать, что переплаты основаны на текущем размере пула ликвидности. Если бы пул был в 100 раз больше (т. е. 10 миллионов DAI и 100 000 ETH), купить 50 ETH было бы не так дорого. В конечном счете, уплаченная цена отражает, насколько размер сделки меняет соотношение x / y. Когда пул ликвидности больше, гораздо проще обрабатывать крупные заказы.
Одна из проблем, о которой не стоит забывать — это фронтенд атака, которая является сегодня проблемой для всех DEX-ов на Ethereum. Чтобы помочь смягчить эту проблему, Uniswap позволяет указать максимальную цену при оформлении заказа. Поэтому, если атака будет осуществлена, и транзакция атакующего будет принята в блок раньше, чем ваша, то пользователь не будет обязан покупать по худшей цене. Да, сделка может быть не осуществлена, но это будет максимальная потеря, платить больше, чем вы собирались, не придётся. Еще одна функция, которую реализует Uniswap — это истекающие ордера, что мешает майнерам удерживать подписанные транзакции и обрабатывать их позже, когда цена переместится, защищая пользователя обмена.
Обмены с ERC-20 на ERC-20 также возможны без отдельного пула ликвидности. Например, заказ на REP <> ZRX будет проходить через пару REP / ETH, а затем автоматически через пару ZRX / ETH.
Для поставщиков ликвидности
Поставщики ликвидности имеют еще более сложную задачу. Давайте посмотрим на создание рынка ETH / DAI. Первое, на что следует обратить внимание поставщикам ликвидности (и трейдерам тоже), является то, что отношение x / y представляет цену торговой пары. В нашем случае x / y = 100 000 DAI / 1000 ETH = 100. Предположим также, что цена ETH на основе Coinbase составляет 100 долларов. Если бы х / у не равнялся 100, между Uniswap и Coinbase была бы возможность арбитража.
Когда поставщик ликвидности добавляет ликвидность в пул, он не может предоставить ликвидность только одной стороне пары. В противном случае он будет менять соотношение и, по сути, устанавливать новую цену (что опасно, так как очень быстро налетят арбитражники, и человек потеряет деньги). Например, если поставщик ликвидности добавляет только 1000 ETH и 0 DAI, то новое соотношение контракта равно 100 000/2000 = 50. Арбитражники будут выкупать ETH до тех пор, пока соотношение снова не станет 100: 1. Поэтому поставщики ликвидности должны предоставить равное количество обеих сторон торговой пары (а интерфейс Uniswap помогает избежать ошибок в этом процессе).
Итак, давайте предположим, что после добавления 10 000 DAI и 100 ETH (общая рыночная стоимость 20 000 долл. США) пул ликвидности теперь составляет 100 000 DAI и 1000 ETH. Поскольку предоставленная сумма равна 10% от общей ликвидности, контракт чеканит и отправляет маркет-мейкеру «токены ликвидности», которые дают ему право на 10% ликвидности, доступной в пуле. Это не спекулятивные токены, которыми можно торговать. Они являются всего лишь инструментом бухгалтерского учета, чтобы отслеживать, сколько должны получить поставщики ликвидности. Если другие участники рынка впоследствии добавляют или снимают монеты, новые жетоны ликвидности соответственно чеканятся или сжигаются так, что относительная процентная доля каждого в пуле ликвидности остается неизменной.
Теперь давайте предположим, что цена на Coinbase изменилась с 100 до 150 долларов. Контракт Uniswap должен также прийти к похожим значениям после некоторого арбитража. Трейдеры будут добавлять DAI и удалять ETH до тех пор, пока новое соотношение не станет 150:1. Что происходит с поставщиком ликвидности? Контракт будет содержать около 122 400 DAI и 817 ETH (чтобы убедиться, что эти цифры точны, 122 400 * 817 = 100 000 000 (наш постоянный результат) и 122 400/817 = 150, наша новая цена). Выводя 10%, на которые мы имеем право, получаем 12 240 DAI и 81,7 ETH. Общая рыночная стоимость суммы этих двух активов составляет 24 500 долларов, что приводит нас к потере 500 долларов в результате создания рынка.
Очевидно, что никто не хочет обеспечивать ликвидность и ещё и платить за это, и доход не зависит от способности совершать хорошие сделки (так как нет возможности совершать сделки, только добавлять ликвидность). Поэтому 0,3% всего объема торговли распределяется пропорционально между всеми поставщиками ликвидности. По умолчанию эти комиссии возвращаются в пул ликвидности, но могут быть получены в любое время. Трудно понять, каково отношение между доходами от комиссий и убытками от изменений рынка, не зная количества промежуточных сделок. Чем больше курс ходит туда-сюда, тем лучше для поставщиков ликвидности.
Не забывай подписываться на нас в социальных сетях: Twitter & Telegram. Вставай в наш вейтлист, получишь бонусы :)
Всем до скорого!