Анализ 7 основных методов разработки контрактов Uniswap для повышения эффективности проектов Децентрализованные финансы

robot
Генерация тезисов в процессе

Уроки разработки смарт-контрактов из кода Uniswap

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

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

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

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

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

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

Умное использование коллбэков

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

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

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

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

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

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

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

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

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

Вычисление дохода по способу Share

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

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

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

Различие между информацией на блокчейне и вне его

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

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

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

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

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

Итоги

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

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

UNI4.72%
DEFI18.3%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 7
  • Поделиться
комментарий
0/400
PoolJumpervip
· 07-28 02:11
Ноль инфраструктуры, делаем это.
Посмотреть ОригиналОтветить0
OldLeekConfessionvip
· 07-27 04:18
Ты уже молодец, если сможешь заставить меня понять...
Посмотреть ОригиналОтветить0
OnchainGossipervip
· 07-27 03:51
Рекомендуется практиковаться на практике~
Посмотреть ОригиналОтветить0
BagHolderTillRetirevip
· 07-25 17:02
Наконец-то я нашел выход из своей ловушки.
Посмотреть ОригиналОтветить0
PanicSeller69vip
· 07-25 17:00
V3 все еще имеет что-то в себе! Давай!
Посмотреть ОригиналОтветить0
degenonymousvip
· 07-25 16:58
Евангелие для кодеров
Посмотреть ОригиналОтветить0
AirdropDreamBreakervip
· 07-25 16:56
Разработка не так важна, как просто украсть код.
Посмотреть ОригиналОтветить0
  • Закрепить