7 основных советов по разработке контрактов: изучение лучших практик DeFi на примере кода DEX

Удивительные техники разработки контрактов: опыт, извлеченный из кода Uniswap

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

Давайте посмотрим на эти интересные приемы, некоторые из которых можно назвать причудливыми.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Конечно, ключевые сделки определенно проводятся в цепочке.

Научитесь разбивать контракты, используя существующие стандартные контракты

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

Кроме того, можно напрямую использовать стандартные контракты, такие как @openzeppelin/contracts/token/ERC721/ERC721.sol. Это позволит, с одной стороны, управлять позициями с помощью NFT, а с другой стороны, повысить эффективность разработки за счет использования уже существующих стандартных контрактов.

Резюме

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

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

DEFI-9.65%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 6
  • Поделиться
комментарий
0/400
rekt_but_resilientvip
· 07-31 11:05
Какой замечательный адрес контракта!
Посмотреть ОригиналОтветить0
AltcoinMarathonervip
· 07-31 06:49
Глубокое погружение в смарт-контракты
Посмотреть ОригиналОтветить0
ZkSnarkervip
· 07-31 03:30
Стоит поработать над исследованием.
Посмотреть ОригиналОтветить0
LiquidityNinjavip
· 07-28 11:40
Выучил что-то новенькое
Посмотреть ОригиналОтветить0
OldLeekNewSicklevip
· 07-28 11:40
Код — это деньги.
Посмотреть ОригиналОтветить0
WhaleWatchervip
· 07-28 11:38
Детали изложены очень хорошо
Посмотреть ОригиналОтветить0
  • Закрепить