Недавно, участвуя в проекте по разработке децентрализованной биржи, я обратился к коду реализации известного DEX и узнал много полезных приемов разработки контрактов. Как разработчик, который ранее в основном занимался разработкой NFT-контрактов, это моя первая попытка разработки Defi-контрактов. Здесь я делюсь несколькими советами, которые могут быть полезны начинающим разработчикам.
Предсказуемый адрес контракта
Обычно адреса, полученные при развертывании контрактов, выглядят случайными, потому что они связаны с nonce. Но в некоторых случаях нам нужно вывести адрес контракта на основе информации о сделке, что полезно для определения прав на сделку или получения адреса пула.
Один из способов заключается в использовании CREATE2 для создания контракта, добавив параметр salt, чтобы сгенерированный адрес был предсказуемым. Формула для расчета нового адреса:
Новый адрес = hash("0xFF", адрес создателя, соль, initcode)
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Проблемы точности обработки больших чисел
При расчетах цен и ликвидности, чтобы избежать потери точности при делении, можно сначала сдвинуть влево на 96 бит ), что эквивалентно умножению на 2^96(, а затем выполнить вычисления. Таким образом, при нормальной торговле, не приводящей к переполнению, можно гарантировать точность.
Вычисление дохода в режиме Share
При регистрации доходов от комиссии LP нельзя записывать каждую транзакцию для каждого LP, так как это потребует много газа. Одно из решений заключается в том, чтобы фиксировать общую комиссию и комиссию, которую следует распределить на каждую единицу ликвидности. Когда LP делает вывод, комиссия, которую можно извлечь, рассчитывается на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Комбинация данных на цепочке и вне ее
Не вся информация должна быть записана в блокчейн или получена из него. Например, такие данные, как список торговых пулов и информация о пулах, могут храниться в обычной базе данных и периодически синхронизироваться с блокчейном. Это может повысить производительность и эффективность. Конечно, ключевые сделки все еще должны выполняться в блокчейне.
Разделение и повторное использование контрактов
Крупные проекты могут содержать несколько реально развернутых контрактов. Даже если развернут только один контракт, его можно разделить на несколько для удобства обслуживания за счет наследования. В то же время, изучение использования существующих стандартных контрактов, таких как ERC721, может повысить эффективность разработки.
Практика — лучший способ обучения. Реализуя простую версию DEX, можно глубже понять код реализации некоторых сложных проектов и узнать больше о практических аспектах проектов. Надеюсь, эти небольшие советы помогут новичкам, желающим изучать разработку контрактов.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
DEX контракт разработка обязательные семь главных советов Новичок обязательно прочитает
Советы по разработке контрактов
Недавно, участвуя в проекте по разработке децентрализованной биржи, я обратился к коду реализации известного DEX и узнал много полезных приемов разработки контрактов. Как разработчик, который ранее в основном занимался разработкой NFT-контрактов, это моя первая попытка разработки Defi-контрактов. Здесь я делюсь несколькими советами, которые могут быть полезны начинающим разработчикам.
Предсказуемый адрес контракта
Обычно адреса, полученные при развертывании контрактов, выглядят случайными, потому что они связаны с nonce. Но в некоторых случаях нам нужно вывести адрес контракта на основе информации о сделке, что полезно для определения прав на сделку или получения адреса пула.
Один из способов заключается в использовании CREATE2 для создания контракта, добавив параметр salt, чтобы сгенерированный адрес был предсказуемым. Формула для расчета нового адреса:
Новый адрес = hash("0xFF", адрес создателя, соль, initcode)
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Проблемы точности обработки больших чисел
При расчетах цен и ликвидности, чтобы избежать потери точности при делении, можно сначала сдвинуть влево на 96 бит ), что эквивалентно умножению на 2^96(, а затем выполнить вычисления. Таким образом, при нормальной торговле, не приводящей к переполнению, можно гарантировать точность.
Вычисление дохода в режиме Share
При регистрации доходов от комиссии LP нельзя записывать каждую транзакцию для каждого LP, так как это потребует много газа. Одно из решений заключается в том, чтобы фиксировать общую комиссию и комиссию, которую следует распределить на каждую единицу ликвидности. Когда LP делает вывод, комиссия, которую можно извлечь, рассчитывается на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Комбинация данных на цепочке и вне ее
Не вся информация должна быть записана в блокчейн или получена из него. Например, такие данные, как список торговых пулов и информация о пулах, могут храниться в обычной базе данных и периодически синхронизироваться с блокчейном. Это может повысить производительность и эффективность. Конечно, ключевые сделки все еще должны выполняться в блокчейне.
Разделение и повторное использование контрактов
Крупные проекты могут содержать несколько реально развернутых контрактов. Даже если развернут только один контракт, его можно разделить на несколько для удобства обслуживания за счет наследования. В то же время, изучение использования существующих стандартных контрактов, таких как ERC721, может повысить эффективность разработки.
Практика — лучший способ обучения. Реализуя простую версию DEX, можно глубже понять код реализации некоторых сложных проектов и узнать больше о практических аспектах проектов. Надеюсь, эти небольшие советы помогут новичкам, желающим изучать разработку контрактов.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(