7 основных приемов анализа смарт-контрактов Uniswap: обязательное чтение для разработчиков Web3

Что должен знать разработчик Web3: ценный опыт, извлеченный из контракта Uniswap

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

Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap

Советы по адресу предсказательных контрактов

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

Uniswap использует метод CREATE2 для создания контрактов, добавляя параметр "salt", чтобы сделать сгенерированный адрес предсказуемым. Логика генерации конкретного адреса следующая: новый адрес = hash("0xFF", адрес создателя, salt, initcode).

Серия для новичков Web3: маленькие советы по разработке контрактов, которые я усвоил из кода Uniswap

Умное использование функций обратного вызова

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

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

Передача информации об исключениях, реализация оценки транзакции с помощью try-catch

В контракте Quoter Uniswap используется конструкция try-catch для выполнения метода swap UniswapV3Pool. Это сделано для имитации swap с целью оценки необходимых токенов для сделки. Поскольку при оценке токены фактически не обмениваются, возникает ошибка. Uniswap выбрасывает специальную ошибку в функции обратного вызова транзакции, а затем ловит эту ошибку и извлекает из неё необходимую информацию.

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

Большие числовые операции решают проблемы точности

В коде Uniswap содержится много вычислительной логики, такой как расчет количества токенов для обмена на основе текущей цены и ликвидности. Чтобы избежать потери точности из-за операций деления, в процессе вычислений часто используется операция "<< FixedPoint96.RESOLUTION", что соответствует сдвигу влево на 96 бит, эквивалентно умножению на 2^96. При условии, что нормальная торговля не приводит к переполнению, ( обычно вычисляется с помощью uint256, этот метод эффективно гарантирует точность.

![Серия для новичков Web3: мелкие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(

Расчет доходов по механизму Share

Uniswap должен записывать доходы от комиссий для поставщика ликвидности ). Очевидно, что нельзя регистрировать комиссии для каждого LP отдельно при каждой сделке, это потребует огромного количества газа.

Решение Uniswap заключается в определении feeGrowthInside0LastX128 и feeGrowthInside1LastX128 в структуре Position, которые фиксируют комиссионные сборы, причитающиеся за единицу ликвидности при последнем извлечении комиссионных для каждой позиции.

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

Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap

Балансировка получения информации в блокчейне

Хранение на блокчейне относительно дорого, и не вся информация должна быть размещена в блокчейне или извлекаться из него. Например, многие интерфейсы, используемые фронтенд-сайтом Uniswap, являются традиционными интерфейсами Web2.

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

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

Разделение контрактов и повторное использование стандартных контрактов

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

Например, контракт NonfungiblePositionManager Uniswap наследует несколько контрактов. Кроме того, контракт ERC721Permit напрямую использует стандартный контракт ERC721 от OpenZeppelin. Это не только упрощает управление позициями с помощью NFT, но и позволяет использовать существующие стандартные контракты для повышения эффективности разработки.

Заключение

Практика приводит к истинному знанию. Личное участие в разработке упрощенной версии децентрализованной биржи позволит вам глубже понять реализацию кода Uniswap, а также изучить больше знаний, применимых в реальных проектах. Если вас интересует разработка проектов в Web3 и DeFi, стоит рассмотреть соответствующие практические курсы, чтобы шаг за шагом создать упрощенную версию биржи. Уверен, это значительно поможет в вашем обучении.

Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap

UNI-3.37%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 4
  • Поделиться
комментарий
0/400
AirdropHunter9000vip
· 08-04 14:09
Defi не является игрой падения до нуля... те, кто понимает, понимают
Посмотреть ОригиналОтветить0
TokenAlchemistvip
· 08-04 14:09
лmao представь, если не знать о CREATE2 для детерминированных адресов... ngmi tbh
Посмотреть ОригиналОтветить0
RugpullAlertOfficervip
· 08-04 14:08
Это точно курс для новичков без базовых знаний.
Посмотреть ОригиналОтветить0
AllTalkLongTradervip
· 08-04 14:02
Не смотреть код, смотреть на адрес — это лень или высота?
Посмотреть ОригиналОтветить0
  • Закрепить