Уроки по разработке контрактов, извлеченные из кода Uniswap
Недавно, когда я писал учебник по разработке децентрализованной биржи, я ссылался на код реализации Uniswap V3 и узнал много ценных аспектов. Для разработчика, который впервые пытается создать Defi-контракты, эти советы будут очень полезны для новичков, желающих изучить разработку контрактов.
Предсказуемый адрес развертывания контракта
Обычно адреса, получаемые при развертывании контрактов, выглядят случайными, поскольку они зависят от nonce. Однако в некоторых случаях нам необходимо вывести адрес контракта, основываясь на информации о торговых парах и связанных данных. Uniswap использует метод CREATE2 для создания контрактов, добавляя параметр salt, что делает сгенерированные адреса предсказуемыми. Логика генерации адреса: новый адрес = hash("0xFF", адрес создателя, salt, initcode).
Умелое использование функций обратного вызова
В некоторых сценариях взаимные вызовы и обратные вызовы между контрактами очень полезны. Например, в методе swap Uniswap будет вызван swapCallback, передав фактическое количество требуемых токенов. Вызывающая сторона должна в обратном вызове перевести требуемые токены в пул, чтобы обеспечить целостность и безопасность всей торговой логики.
Использование исключений для передачи информации и оценка транзакций с помощью try catch
В контракте Quoter Uniswap используется конструкция try catch для выполнения метода swap с целью оценки сделки. Реализована функция оценки сделки путем выбрасывания специальной ошибки в функции обратного вызова, а затем перехвата и анализа информации об ошибке, что позволяет осуществлять оценку без необходимости специально модифицировать метод swap.
Решение проблемы точности с помощью больших чисел
В Uniswap логика вычислений часто использует операцию сдвига влево на 96 бит (что эквивалентно умножению на 2^96). Этот метод обеспечивает нормальные сделки без переполнения, а также гарантирует точность. Хотя теоретически все еще существует незначительная потеря точности, на практике это приемлемо.
Механизм распределения прибыли
Для эффективной записи доходов от комиссий LP Uniswap использует подход, подобный акционерному. Записывая общие комиссии и комиссии, которые должны быть распределены на каждую единицу ликвидности, LP при выводе средств может рассчитывать подлежащие выводу комиссии только на основе удерживаемой ликвидности, что значительно снижает расход газа.
Разумное использование внецепочечной информации
Учитывая высокую стоимость хранения на цепочке, не вся информация должна быть записана в цепь или извлечена из нее. Например, списки пулов сделок, информация о пулах и т.д. могут храниться в традиционной базе данных, регулярно синхронизируясь с данными на цепи. Этот подход может повысить эффективность и снизить затраты.
Разделение контрактов и повторное использование стандартных контрактов
Проект может включать несколько фактически развернутых контрактов, даже если развернут только один контракт, код можно разделить на несколько контрактов для поддержки с помощью наследования. В то же время использование существующих стандартных контрактов (например, ERC721) может повысить эффективность разработки и улучшить надежность контрактов.
Заключение
Практика — лучший способ обучения. Пытаясь реализовать упрощённую версию децентрализованной биржи, можно глубже понять реализацию кода Uniswap и получить ценный опыт в реальных проектах. Для разработчиков, заинтересованных в углублённом изучении разработки проектов Web3 и Defi, участие в практических курсах станет отличным выбором.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
12 Лайков
Награда
12
6
Поделиться
комментарий
0/400
GateUser-9ad11037
· 14ч назад
Учебное пособие для новичков по входу в позицию
Посмотреть ОригиналОтветить0
WalletManager
· 14ч назад
Тщательный аудит перед контрактом - это как фундаментальные работы... учись немного торопиться.
Посмотреть ОригиналОтветить0
SmartContractRebel
· 14ч назад
Разработчик живет на старых заслугах.
Посмотреть ОригиналОтветить0
GateUser-a606bf0c
· 14ч назад
Это всё? Слишком просто, не так ли?
Посмотреть ОригиналОтветить0
BlockchainBouncer
· 14ч назад
Слишком быстро, не понимаю
Посмотреть ОригиналОтветить0
GasGuzzler
· 14ч назад
Я не смогу написать это даже если скажу десять раз.
Разоблачение кода Uniswap: Подробное руководство по 7 основным техникам разработки смарт-контрактов
Уроки по разработке контрактов, извлеченные из кода Uniswap
Недавно, когда я писал учебник по разработке децентрализованной биржи, я ссылался на код реализации Uniswap V3 и узнал много ценных аспектов. Для разработчика, который впервые пытается создать Defi-контракты, эти советы будут очень полезны для новичков, желающих изучить разработку контрактов.
Предсказуемый адрес развертывания контракта
Обычно адреса, получаемые при развертывании контрактов, выглядят случайными, поскольку они зависят от nonce. Однако в некоторых случаях нам необходимо вывести адрес контракта, основываясь на информации о торговых парах и связанных данных. Uniswap использует метод CREATE2 для создания контрактов, добавляя параметр salt, что делает сгенерированные адреса предсказуемыми. Логика генерации адреса: новый адрес = hash("0xFF", адрес создателя, salt, initcode).
Умелое использование функций обратного вызова
В некоторых сценариях взаимные вызовы и обратные вызовы между контрактами очень полезны. Например, в методе swap Uniswap будет вызван swapCallback, передав фактическое количество требуемых токенов. Вызывающая сторона должна в обратном вызове перевести требуемые токены в пул, чтобы обеспечить целостность и безопасность всей торговой логики.
Использование исключений для передачи информации и оценка транзакций с помощью try catch
В контракте Quoter Uniswap используется конструкция try catch для выполнения метода swap с целью оценки сделки. Реализована функция оценки сделки путем выбрасывания специальной ошибки в функции обратного вызова, а затем перехвата и анализа информации об ошибке, что позволяет осуществлять оценку без необходимости специально модифицировать метод swap.
Решение проблемы точности с помощью больших чисел
В Uniswap логика вычислений часто использует операцию сдвига влево на 96 бит (что эквивалентно умножению на 2^96). Этот метод обеспечивает нормальные сделки без переполнения, а также гарантирует точность. Хотя теоретически все еще существует незначительная потеря точности, на практике это приемлемо.
Механизм распределения прибыли
Для эффективной записи доходов от комиссий LP Uniswap использует подход, подобный акционерному. Записывая общие комиссии и комиссии, которые должны быть распределены на каждую единицу ликвидности, LP при выводе средств может рассчитывать подлежащие выводу комиссии только на основе удерживаемой ликвидности, что значительно снижает расход газа.
Разумное использование внецепочечной информации
Учитывая высокую стоимость хранения на цепочке, не вся информация должна быть записана в цепь или извлечена из нее. Например, списки пулов сделок, информация о пулах и т.д. могут храниться в традиционной базе данных, регулярно синхронизируясь с данными на цепи. Этот подход может повысить эффективность и снизить затраты.
Разделение контрактов и повторное использование стандартных контрактов
Проект может включать несколько фактически развернутых контрактов, даже если развернут только один контракт, код можно разделить на несколько контрактов для поддержки с помощью наследования. В то же время использование существующих стандартных контрактов (например, ERC721) может повысить эффективность разработки и улучшить надежность контрактов.
Заключение
Практика — лучший способ обучения. Пытаясь реализовать упрощённую версию децентрализованной биржи, можно глубже понять реализацию кода Uniswap и получить ценный опыт в реальных проектах. Для разработчиков, заинтересованных в углублённом изучении разработки проектов Web3 и Defi, участие в практических курсах станет отличным выбором.