7 практических советов по разработке контрактов для поддержки DEX проектов

Сводка небольших советов по разработке контрактов

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

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

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

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

Это можно реализовать с помощью создания контракта с использованием метода CREATE2. Конкретный способ заключается в добавлении параметра salt при создании контракта:

солидность pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());

Таким образом, адрес контракта, созданный таким образом, предсказуем, логика генерации такова:

Новый адрес = hash("0xFF", адрес создателя, salt, initcode)

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

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

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

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

Передача информации с помощью исключений

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

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

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

Решение проблемы точности больших чисел

При расчетах цен и ликвидности, чтобы избежать потери точности при делении, можно использовать операцию сдвига влево (, что эквивалентно умножению на 2^96).

Например:

солидность numerator1 = FullMath.mulDiv(ликвидность << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);

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

Способы расчета дохода

Чтобы избежать учета комиссии для всех LP при каждой сделке, можно использовать способ Share.

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

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

Разумное использование данных вне цепочки

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

Некоторые продвинутые RPC интерфейсы также предоставляют оптимизированные методы получения данных с кешированием, что может повысить производительность и эффективность.

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

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

В то же время можно использовать существующие стандартные контракты, такие как ERC721, что повышает эффективность разработки. Например:

солидность контракт NonfungiblePositionManager является INonfungiblePositionManager, PeripheryImmutableState, Инициализатор пула, Управление ликвидностью, PeripheryValidation, Мультиколл, ERC721Разрешение, ПериферияПлатежи, NFTDescriptor { // ... }

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

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

UNI-6.59%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Репост
  • Поделиться
комментарий
0/400
LayerZeroEnjoyervip
· 08-01 16:48
BTC уже закончился, а вы все еще изучаете DeFi?
Посмотреть ОригиналОтветить0
degenwhisperervip
· 08-01 00:26
Скопируйте код uni напрямую
Посмотреть ОригиналОтветить0
GateUser-40edb63bvip
· 07-29 21:17
Этот смарт-контракт хуки такие продвинутые!
Посмотреть ОригиналОтветить0
PoetryOnChainvip
· 07-29 21:03
На самом деле это просто копирование uni...
Посмотреть ОригиналОтветить0
  • Закрепить