Раскрытие кода Uniswap: 7 основных советов по разработке контрактов для помощи новичкам в Defi

Уроки разработки контрактов, полученные из кода Uniswap

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

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

Предсказуемый адрес развертывания контракта

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

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

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

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

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

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

Используйте исключения для передачи информации, реализуйте оценку транзакций с помощью try catch

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

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

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

Использование больших чисел для решения проблемы точности

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

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

Вычисление дохода с помощью Share

Uniswap должен регистрировать комиссионные доходы провайдера ликвидности LP(. Чтобы избежать больших затрат на газ при регистрации комиссий для каждого LP за каждую транзакцию, Uniswap использует хитроумный метод.

Структура Position содержит feeGrowthInside0LastX128 и feeGrowthInside1LastX128, которые фиксируют размер комиссии, которую каждый ликвидный актив должен получить при последнем извлечении комиссии из позиции. Достаточно записать общую сумму комиссии и комиссию, которую должен получить каждый ликвидный актив, а при извлечении LP комиссия рассчитывается на основе удерживаемого ликвидного актива.

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

Стратегия получения информации на блокчейне

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

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

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

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

Например, контракт NonfungiblePositionManager Uniswap наследует несколько контрактов. Используя контракт ERC721 от OpenZeppelin, это удобно для управления позициями через NFT и повышает эффективность разработки.

Заключение

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

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

UNI-7.52%
DEFI0.41%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Репост
  • Поделиться
комментарий
0/400
Нет комментариев
  • Закрепить