7 полезных советов, которые помогут вам освоить разработку смарт-контрактов

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

Умные приемы в разработке контрактов

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

Давайте вместе рассмотрим эти хитрые приемы, некоторые из которых можно назвать изощренными трюками.

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

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

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

Один из способов - использовать CREATE2 для создания контракта, добавив параметр salt: pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); Таким образом, адрес созданного контракта предсказуем, логика генерации следующая: новый адрес = hash("0xFF", адрес создателя, salt, initcode).

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

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

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

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

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

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

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

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

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

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

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

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

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

) Баланс получения информации в цепочке и вне цепочки

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

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

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

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

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

Резюме

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

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

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 6
  • Репост
  • Поделиться
комментарий
0/400
ServantOfSatoshivip
· 08-12 16:04
Умелые трюки, разве это не означает хитрые манипуляции?
Посмотреть ОригиналОтветить0
mev_me_maybevip
· 08-11 22:32
Новички в кофе нашли какую-то большую тайну, но это всего лишь старые разговоры.
Посмотреть ОригиналОтветить0
CommunityLurkervip
· 08-11 16:39
Новичок, верно? Рекомендую сначала попробовать сделать hello world.
Посмотреть ОригиналОтветить0
Blockwatcher9000vip
· 08-10 12:50
Говоря красиво, это技巧, на самом деле это всевозможные хитрые операции.
Посмотреть ОригиналОтветить0
OnChainDetectivevip
· 08-10 12:46
Изучал развертывание create2 долгое время. Этот метод, похоже, используется для закладки мин... Понимающие поймут.
Посмотреть ОригиналОтветить0
ContractExplorervip
· 08-10 12:42
Обнаружить новую уязвимость — это самое приятное, когда соревнуешься с уязвимостями.
Посмотреть ОригиналОтветить0
  • Закрепить