DeFi. История Uniswap, написанная командой
Перевод
Это вольный перевод: https://web.archive.org/web/20201124230854/https://uniswap.org/blog/uniswap-history/
Краткая история Uniswap.
V0 — Рождение Uniswap
2 ноября 2018 года Uniswap был официально анонсирован и развёрнут в основной сети Ethereum. В этот волнующий и немного тревожный момент я отправил твиты с объявлением своему скромному числу подписчиков (~200 человек):
Рад объявить запуск @UniswapExchange! Это протокол для автоматического обмена токенов ERC20 в сети Ethereum.
https://web.archive.org/web/20201009055620/https://t.co/czTqyRit7u
— Хейден Адамс (@haydenzadams) 2 ноября 2018
Для многих это было первое знакомство с проектом. Для меня — кульминация более чем годовой работы и огромного количества помощи, полученной в процессе.
Uniswap изменил мою жизнь, и сегодня — его день рождения. Чтобы отпраздновать это, я хочу рассказать его историю с самого начала в V0 — первой части серии блога ко дню рождения Uniswap.
Ожидайте V1 и V2, где я расскажу о первом годе Uniswap в мейннете Ethereum и наших планах на будущее.
Принятие Ethereum
6 июля 2017 года меня уволили с моей первой работы после колледжа — я был инженером-механиком в Siemens. Чувствуя себя подавленным и потерянным, я написал своему другу Карлу Флёршу, который в то время работал над Casper FFG в Ethereum Foundation.
- Хейден: Меня только что уволили :(
- Карл: Поздравляю, это лучшее, что могло с тобой случиться!!! Машиностроение — умирающая область. Ethereum — будущее, и ты ещё рано к нему присоединился. Твоё новое предназначение — писать смарт-контракты!
- Хейден: Но мне же надо уметь программировать?
- Карл: Не совсем. Программировать — легко. Никто пока не умеет писать смарт-контракты как следует. Ethereum, proof-of-stake, доверенные вычисления и всё такое.
- Хейден: Ну ладно…
Поймав меня в момент слабости, Карл убедил меня "принять Ethereum в свою жизнь". Я решил попробовать — и следующие два месяца посвятил изучению основ Ethereum, Solidity и JavaScript.
Proof-of-Something
С октября по ноябрь я создал proof-of-concept — демонстрационную версию, включающую смарт-контракт и мой первый в жизни сайт. Контракт поддерживал одного поставщика ликвидности и позволял выполнять простые обмены. Вот он во всей красе:
Примечание: Демоверсия осталась неизменной по сравнению с оригиналом, за исключением одной строки кода window.ethereum.enable()
, которую я добавил, чтобы она работала с MetaMask образца 2019 года.
Создание этого proof-of-concept стало моим первым шагом в "кроличью нору" программируемых денег. Это была самая захватывающая вещь, над которой я когда-либо работал.
Это даже не ощущалось как работа.
Я также начал осознавать, какие возможности для пользовательского опыта (UX) открывают автоматические маркет-мейкеры.
В то время EtherDelta была единственной децентрализованной биржей с какой-то популярностью, но её UX казался запутанным и неинтуитивным. С моей демоверсией почему-то всё ощущалось лучше.
Devcon 3
Во время выступления на Devcon 3 Карл использовал мою демо-версию Uniswap как пример силы крипто-экономики и открытых финансовых приложений с открытым исходным кодом на базе Ethereum:
Я был безработным уже пять месяцев, жил на криптовалюту, которую мне посчастливилось купить ранее в том году.
Uniswap был успешен по единственному критерию, который тогда имел для меня значение: я научился писать смарт-контракты.
Возможно, пришло время двигаться дальше и найти работу (если вообще где-то искали Solidity-разработчиков).
Однако один из участников выступления Карла на Devcon — Паскаль Ван Хек — связался со мной. Он внимательно следил за развитием автоматических маркет-мейкеров на Ethereum и выразил интерес к поддержке моего проекта.
Он даже выделил грант, чтобы я мог провести ещё месяц в исследованиях. Мы начали созваниваться раз в неделю, обсуждая прогресс.
Паскаль привнёс новые идеи. Но, что ещё важнее, наши регулярные созвоны привнесли в мою работу структуру и ощущение ответственности.
На тот момент у Uniswap было две серьёзные технические проблемы, которые я решил устранить с инженерным подходом:
Ценности Ethereum
К тому моменту я был полностью захвачен безграничным потенциалом Ethereum. Вот свойства, которые меня особенно вдохновляли:
- Устойчивость к цензуре. Никто не может остановить его.
- Децентрализация. Никто не управляет им.
- Отсутствие разрешений. Любой может использовать его.
- Безопасность. Любой может проверить выполнение.
Но что-то в атмосфере Ethereum казалось мне неправильным.
Крупные проекты на Ethereum воплощали некоторые из этих принципов, но редко — все.
Централизованные точки отказа, приложения, подверженные цензуре, чрезмерно усложнённая архитектура.
DApp'ы проектировались исключительно вокруг идеи выпуска токена — даже в случаях, где он был совершенно не нужен.
Я начал рассматривать Uniswap не только как обучающий проект для себя, но и как инструмент для других.
Я не мог представить, что он будет конкурировать с "настоящими" проектами — ну, теми, что в лето 2017 года собрали от $20 до $150 миллионов.
Но, возможно, он мог бы стать примером настоящего приложения в духе Ethereum.
NYC Mesh
В декабре я с Карлом посетил митап NYC Mesh, который проходил после публикации антикриптовалютной статьи от основателя этого проекта.
Карл на тот момент уже был известен в Ethereum-среде, и его заметил репортёр CoinDesk, который хотел взять интервью об объединении mesh-сетей и криптовалют.
Карл не захотел давать интервью — и направил репортёра ко мне.
Я начал нести всякую чепуху про Layer 2-решения, в которых едва разбирался — и, в итоге, попал в статью.
"Plan B? Ethereum Innovators Are Reviving the Fight for Net Neutrality" — CoinDesk
Вечерняя встреча в полутёмном баре Нью-Йорка — ничего необычного. Но необычно то, что другие точки доступа в Ист-Виллидже подключены к Wi-Fi-узлу этого бара, позволяя любому в округе не только подключаться к сети, но и заходить на сайты, доступные только внутри этой сети.
Каллил Капуоццо, мой друг со школы (с которым мы не виделись лет шесть), увидел эту статью и написал мне.
С тех пор он успел поработать дизайнером в Microsoft, Google, а в последнее время занялся Ethereum — участвуя в разработке сайта для проекта FOAM.
Uniswap Pre-alpha
К концу января 2018 года все основные проблемы со смарт-контрактами были решены.
Контракты обмена теперь могли поддерживать нескольких поставщиков ликвидности благодаря использованию внутреннего токена ликвидности, отслеживающего долю каждого LP в комиссионных и в залоге.
Контракт-фабрика позволял любому пользователю добавить поддержку токена.
Все токены объединялись в пары с ETH, что делало возможным обмен “любой токен на любой” в одной транзакции, используя ETH как промежуточное звено.
Я снова связался с Каллилом, как раз после того, как завершил обновлённые смарт-контракты Uniswap, и мы подробно обсудили проект.
Он предложил помочь с фронтендом, который теперь сильно отставал от контрактной части. Совмещая с другими своими проектами, Каллил разработал и собрал стильный новый интерфейс Uniswapповерх моего ужасного кода на React.
Через пару недель стало очевидно: мой React-код — катастрофа.
К счастью, я недавно восстановил контакт с другом по колледжу — Усиэлем Вильчисом. Он как раз заканчивал курсы по программированию (на которые пошёл по совету всё того же Карла Флёрша).
"Тебе стоит научиться кодить" — Карл Флёрш
Желая пополнить портфолио и набраться опыта, Усиэль согласился рефакторить фронтенд Uniswap.
Встреча с Виталиком
К апрелю 2018 года я был безработным уже 10 месяцев. Криптовалюта, на которую я жил, упала в цене более чем на 75%, резко сократив мою "взлётную полосу".
Несмотря на это, я на эмоциях в последний момент купил билет в Сеул (Южная Корея). Это была моя первая поездка за пределы Северной Америки за все 24 года жизни.
Поездка была частично личной, но я специально приурочил её к конференции Deconomy 2018.
Я попытался пройти на конференцию без билета — и получил жёсткий отказ.
Но как раз в тот момент Карл прибыл вместе с другими участниками Ethereum Foundation. Он отвёл меня в сторону и познакомил с Виталиком, с которым он ранее уже обсуждал Uniswap. Разговор прошёл примерно так:
- Карл: Это мой друг Хейден, он сделал Uniswap!
- Виталик: Привет, приятно познакомиться! Он open-source?
- Я: Конечно!
- Виталик: Какой URL?
- Я: https://github.com/haydenadams/uniswap
- Виталик: читает весь смарт-контракт на своём телефоне
- Виталик: А ты не думал переписать его на Vyper? И вообще, тебе стоит подать заявку на грант от Ethereum Foundation.
Идеи Виталика ещё ни разу меня не подводили.
Сразу по возвращении из Сеула я провёл две недели, переписывая контракты на Vyper.
Документации или dev-инструментов, как у Solidity, тогда ещё не было, но я использовал оригинальный контракт Casper FFG в качестве ориентира — на тот момент это был единственный настоящий контракт на Vyper, который мне удалось найти (не считая простых примеров в официальном репозитории).
Новые друзья
До этого момента Карл был моим единственным близким другом в криптомире — но это скоро изменилось.
Незадолго до отъезда Карл пригласил меня на небольшую встречу, где я познакомился и подружился с:
Помимо того, что они отличные люди, все трое сыграют ключевую роль в успехе Uniswap и повлияют на его будущее направление.
Через две недели, в мае 2018, я отправился в Торонто на конференцию Edcon 2018. Это была первая Ethereum-конференция, на которую я действительно попал внутрь.
Я провёл 3 дня, посещая доклады, встречаясь с людьми и демонстрируя Uniswap.
Мои четыре друга из крипто были там — и познакомили меня с кучей новых людей. Моя крипто-соцсеть начала расти.
Среди новых друзей, Джинглан Ван заслуживает отдельного упоминания — она с тех пор стала отличным советником.
Я также впервые встретился вживую с Дэвидом Кноттом, бывшим разработчиком Vyper. Я рассказал ему, что переписал Uniswap на Vyper.
На следующее утро в 8 утра мне позвонил Дэвид. Он сообщил, что должен через два часа выступать с докладом о Vyper, включая живую демонстрацию.
Проблема в том, что Uniswap был единственным реальным DApp'ом на Vyper, и он спросил, не хочу ли я выступить вместо него.
Я объяснил, что изучаю Vyper всего две недели, никогда не выступал публично и вообще слабо понимаю, что делаю. Но Дэвид уверил, что всё в порядке — двух недель опыта с Vyper достаточно, чтобы уверенно выступать с докладом.
Так я провёл своё первое публичное выступление.
Возвращение с Edcon
Я летел обратно в Нью-Йорк тем же рейсом, что и Дэн Робинсон. Всю дорогу мы оптимизировали расход газа в Uniswap.
Когда самолёт приземлился, Uniswap стал на 30% эффективнее. Это сделало его самой газоэффективной биржей на Ethereum с большим отрывом.
Edcon 2018 стал поворотной точкой.
Реакция на мою демо-версию Uniswap была гораздо сильнее, чем просто вежливый интерес — люди были реально воодушевлены.
Они, казалось, понимали и разделяли ценности, которые я хотел отразить в проекте.
Я понял, что сообщество Ethereum — это не только ICO: в нём были люди, которые действительно верили в идею разрешённой, децентрализованной финансовой системы.
NYC Blockchain Week 2018
Мой самолёт из Торонто приземлился прямо в разгар Нью-Йоркской блокчейн-недели. Следующую неделю я провёл, посещая бесконечные события и вечеринки.
И тут я увидел твит в своей ленте:
Ты боишься блокчейн-недели? Просыпаешься в поту от мысли, что тебе будут “продавать” очередной бред? Отстаёшь от проектов, которые тебе реально интересны? Ищешь тихое место, где можно поработать и подумать?Добро пожаловать на #BUIDLWEEK — Ричард Бёртон (@ricburton), 10 мая 2018
Я жил в 15 минутах ходьбы и решил зайти.
Знакомство с Balance
Ричард Бёртон — основатель стартапа Balance, Ethereum-кошелька. Я показал ему свою демо-версию Uniswap, и он сразу захотел понять, как это работает. Завязался долгий разговор.
До этого момента я считал свою роль в Uniswap исключительно технической. Когда кто-то спрашивал, как он работает, я начинал с математической формулы. Многие после этого уходили в замешательстве.
Ричард помог мне понять, что если люди не понимают Uniswap — проблема не в них, а во мне. Разработчики — это только часть экосистемы. Если я хочу, чтобы люди использовали мой проект, я должен говорить на их языке, в понятных терминах. Крупнейший нерешённый вызов Uniswap был социальным.
Всё становится по-настоящему
В это время я решил: Uniswap — это то, что я должен довести до конца.
Я составил план, что нужно для запуска в основной сети:
- Завершённые, готовые к продакшену смарт-контракты
- Удобный, отзывчивый интерфейс
- Аудит безопасности смарт-контрактов
- Финализированный whitepaper
- Документация для разработчиков
Мой друг Фил, эксперт по безопасности блокчейна, посоветовал мне обратиться в Runtime Verification (RV), и даже сделал интро. Я получил от них предложение на:
С учётом этого я подал заявку на грант от Ethereum Foundation: $50,000 + стоимость услуг RV.
Лето 2018: Balance
Летом я одержимо переписывал и оптимизировал смарт-контракты Uniswap, работал над whitepaper'ом и посещал криптособытия.
В течение двух месяцев я проходил интервью и ждал ответа по гранту.
Я ежедневно работал в офисе Balance, и команда — Кристиан Барони, Джин Чинг и Майк Демере — была очень гостеприимной. Зная, что у меня почти не осталось денег, Ричард даже дал мне личный грант на поддержку работы.
Whiteboard Wednesday
Я начал регулярно посещать еженедельные митапы Whiteboard Wednesday в офисе Balance. Каждую среду все, кто работал над криптопроектами, собирались и делились прогрессом.
@Balance_io Whiteboard Wednesday начинается с @karl_dot_tech. Наслаждайтесь! — @ricburton, 18 июля 2018
Я приходил почти каждую неделю, снова и снова объясняя Uniswap разным людям. Я научился говорить о нём в разных контекстах — и вскоре мог объяснить его почти любому. Даже начал погружаться в крипто-твиттер.
Как и в случае с моими созвонами с Паскалем, Whiteboard Wednesday давал ощущение ответственности: я не хотел приходить второй раз подряд без заметного прогресса.
Maker
По мере того как лето шло, я стал проводить всё больше времени в офисе MakerDAO в Нью-Йорке, где мой друг Энди был CTO. (Для справки: Maker — это децентрализованный проект стейблкоина, и если вы читаете это, то, скорее всего, уже знаете о нём.)
Я подружился с людьми из Maker, включая Эшли Шапп, которая позже тоже сыграет важную роль в развитии Uniswap.
Работа в офисах Balance и Maker обеспечила непрерывный поток интересных знакомств и проектов. Лето пролетело быстро. Смарт-контракты я оптимизировал до предела своими силами.
И вот, в конце июля, я получил письмо:
Uniswap получает грант от Ethereum Foundation!Ethereum Foundation Grants Update – Wave III. Мы усердно трудились, знакомясь с невероятными людьми и проектами, и рады объявить получателей грантов третьей волны!
Формализованная модель
Получив грант, я немедленно заключил контракт с Runtime Verification (RV) на формализацию и аудит смарт-контрактов Uniswap.
На серии звонков с Дэйджуном Парком, И Чжаном и Сяохонг Чэном из RV я подробно объяснил механизм Uniswap и ключевые свойства протокола.
Они начали с создания формализованной модели Uniswap.
Затем — подготовили спецификацию кода, в которой переработали математические операции для минимизации ошибок округления и чтобы всегда отдавать предпочтение поставщикам ликвидности (LP), а не трейдерам.
Результаты этой работы можно найти в оригинале статье...
Я модифицировал смарт-контракты в соответствии со спецификацией.
Затем RV провела высокоуровневый аудит кода, в ходе которого были предложены:
Список этих улучшений доступен также в оригинале...
Заморозка кода и формальная верификация
После внесения всех изменений, код смарт-контрактов был “заморожен”, и команда RV начала формальную верификацию — проверку соответствия реализации Uniswap ключевым свойствам, определённым в спецификации.
Это был самый долгий этап всего процесса.
Финальный интерфейс
Пока аудит продолжался, я нанял Каллила как подрядчика, чтобы он начал разрабатывать финальную версию интерфейса Uniswap. Демо-версия работала, но выглядела слишком запутанной для настоящего продукта.
RECIPEINT
Uniswap всё ещё не был официально анонсирован, но и секретом его уже назвать было сложно. В сентябре меня пригласили выступить на панели о будущем децентрализованных бирж на конференции ETHIS в Гонконге.
Технически это было не первое выступление на конференции, но первое — по приглашению!
"Было здорово поговорить об @UniswapExchange на панеле ‘Будущее DEX’ на #ETHIS" — Хейден Адамс 🦄 (@haydenzadams), 10 сентября 2018.
В Гонконге мне удалось встретиться с Виталиком, который посмотрел финальный код Uniswap. Он нашёл ошибку, которую даже Runtime Verification не заметила:
я около 20 раз написал "recipeint" вместо "recipient".
Мемный момент
Там же я случайно попал на интервью Ethereum Foundation о ETH 2.0 — и впервые стал героем мема.
После Гонконга
Я провёл три дня на Шанхайской блокчейн-неделе, пользуясь транзитной визой, а затем вернулся в Нью-Йорк.
Подготовка к запуску
Вернувшись в Нью-Йорк, я решил: Uniswap будет запущен на Devcon 4 в Праге — если это вообще физически возможно. Оставалось всего 5 недель — и это были самые напряжённые 5 недель в моей жизни.
Формальная верификация уже шла, а самой сложной оставшейся задачей было:
реализовать последние интерфейсные дизайны Каллила поверх стабильной кодовой базы.
Я начал искать подрядчиков, которые могли бы реализовать интерфейс за месяц, и меня познакомили с Дэном Цуем, CEO студии Kyokan. Спасибо Рику Дадли за интро!
Кодовую базу пришлось почти полностью переписать с нуля.
Я нанял подрядчиков, потому что считал, что создание полноценного интерфейса Uniswap в такие сжатые сроки требует целой команды. Но в итоге получил нечто лучшее — Джеки Чан, вице-президент по инжинирингу в Kyokan.
Поскольку Джеки почти ничего не знал об Uniswap, я написал длинную и подробную техническую спецификацию интерфейса, чтобы ускорить процесс. Каллил тем временем подготовил высокодетализированные дизайн-макеты для всех элементов интерфейса.
За один месяц Джеки построил интерфейс для запуска Uniswap почти полностью самостоятельно. В некоторых мелких деталях ему помогал Кенни Трам из Kyokan.
За неделю до Devcon
Я завершил документацию и whitepaper. Также были готовы результаты формальной верификации от Runtime Verification — уязвимостей не найдено!
Однако команда RV выразила обеспокоенность: Uniswap не был должным образом проверен на уязвимость к повторным вызовам (re-entrancy attacks) — именно та проблема, из-за которой в 2016 году случился DAO-хак.
Я обратился за советом к Филу Дайану.
Он был чрезвычайно занят подготовкой собственного доклада на Devcon 4, но всё равно пообещал лично просмотреть смарт-контракты на наличие re-entrancy-уязвимостей перед запуском.
Поскольку всё было в последнюю минуту — это был внутренний аудит, без отчёта и публичных результатов.
Unishirts V0 — лимитированная серия для Devcon 4
Параллельно я поручил Каллилу разработать футболку Uniswap, которую мы бы раздавали на конференции. Я хотел, чтобы запуск стал событием, в котором люди могли бы поучаствовать. Футболка должна была быть высокого качества — такая, которую действительно хочется носить.
За неделю до Devcon, вместе со своим братом Леандером, Каллил создал вот такой невероятно крутой дизайн:
Чтобы успеть в срок, футболки пришлось изготавливать вручную с помощью технологии, называемой шелкотрафаретная печать (silk screening). Только на создание трафарета уходила почти неделя, а на печать всех футболок — около 8 часов непрерывной работы.
Я прилетел в Прагу за день до конференции и начал проверять, всё ли готово к запуску. Я связался с Филом — он просмотрел большую часть кода, но хотел ещё раз его перепроверить.
Каллил купил билет так, чтобы прилететь прямо в первый день конференции, чтобы оставить максимум времени на производство. В ночь перед Devcon он и Леандер не спали всю ночь, печатая футболки вручную.
Как только футболки были готовы, Каллил упаковал их в коробки, сразу поехал в аэропорт и вылетел в Прагу. Из аэропорта он взял такси прямо до конференц-центра, чтобы раздать футболки вместе со мной.
Devcon 4
День 1
Devcon начался! Я бродил по конференц-центру, раздавая футболки и рассказывая об Uniswap всем, кто готов был слушать, намекая, что запуск вот-вот состоится.
На спине футболок был нанесён математический график, что делало их отличным способом объяснять принципы AMM.
Днём мы с Каллилом впервые лично встретились с Джеки. Немного пообщавшись, мы сели исправлять последние баги и улучшать UX.
День 2
Половину второго дня я провёл на лекциях и в общении. После обеда мы снова собрались втроём (я, Джеки и Каллил) — и поняли важную вещь: Uniswap нужен отдельный лендинг, не связанный напрямую с интерфейсом торговли. В тот же день мы с нуля создали uniswap.io.
День 3
Наконец, на третий день Devcon, я получил ответ от Фила. Он сообщил, что не видит уязвимостей к повторным вызовам (re-entrancy attacks), если только ERC20-токен сам специально не создан для атаки на Uniswap.
Это считалось приемлемым риском: если токен изначально спроектирован как атака — его ликвидность можно украсть. Но все обычные токены были безопасны.
День 4 — 2 ноября 2018
- Развернул смарт-контракты Uniswap в основной сети Ethereum
- Запустил сайт uniswap.io
- Запустил торговый интерфейс app.uniswap.org
Затем я написал всем, кто раньше проявлял интерес к запуску и предоставлению ликвидности.
Один поставщик внёс около $30 000 в три пула. Это позволило обрабатывать свопы примерно на $100. На этом всё было готово.
Я сел на бинбэг в одиночестве, потратил около часа, переписывая и выверяя твиты для запуска. К счастью, мимо проходила Эшли, и помогла мне с формулировками.
Я нажал кнопку публикации. Взволнованный, но вдохновлённый тем, что будет дальше. То, что последовало, — взрыв поддержки, идей и коллабораций, который превзошёл все мои ожидания.
Но это уже история для V1 — следующего поста в серии
БОНУС #1 — Кто придумал название Uniswap?
Виталик. Я изначально хотел назвать проект Unipeg (гибрид единорога и пегаса). Логотип Unipeg (был иным). Когда Карл рассказал Виталику о проекте, тот сказал: "Unipeg? Звучит скорее как… Uniswap."
БОНУС #2 — Кто изобрёл Uniswap?
Алан Лу (Gnosis) — первый, кто придумал AMM x*y=k на Ethereum. Он описал идею в статье Building a Decentralized Exchange in Ethereum.
Мартин Коппельман (Gnosis) рассказал о ней Виталику. Виталик увидел потенциал и начал публично писать об этом:
- на своём сайте: см. On Path Independence
- на Reddit: "Let's run DEXs like prediction markets"
- в комментариях к статье Фила Дайана “Bancor Is Flawed”, после ICO Bancor на $144M
Итог
Я создал Uniswap — первую полноценную реализацию x*y=k AMM в Ethereum. Спасибо Джинглан Ван за поддержку.