Недавно я изучал процесс разработки децентрализованных бирж и ссылался на код известных проектов, узнав много интересных моментов. Для разработчика, который впервые пытается создать DeFi-контракт, эти маленькие советы будут очень полезны для новичков, желающих изучить разработку контрактов.
Давайте вместе рассмотрим эти хитрые приемы, некоторые из которых можно назвать изощренными трюками.
Предсказуемый адрес развертывания контракта
Обычно адрес, получаемый при развертывании контракта, кажется случайным, поскольку он связан с nonce. Однако в некоторых случаях нам нужно сделать вывод о адресе контракта на основе информации о сделках, например, для определения прав на сделку или получения адреса пула.
Один из способов - использовать CREATE2 для создания контракта, добавив параметр salt: pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); Таким образом, адрес созданного контракта предсказуем, логика генерации следующая: новый адрес = hash("0xFF", адрес создателя, salt, initcode).
Умное использование функций обратного вызова
Контракты в Solidity могут вызывать друг друга. Один из паттернов заключается в том, что A вызывает метод B, а B в вызываемом методе вызывает A, что является полезным в некоторых сценариях.
Например, при вызове метода swap контракта UniswapV3Pool для выполнения сделки, он вызовет swapCallback, передав рассчитанный токен, необходимый для данной сделки. Вызывающая сторона должна передать необходимый токен в UniswapV3Pool в колбэке, а не разделять метод swap на две части. Это обеспечивает безопасность метода swap и полное выполнение, без необходимости в сложной записи переменных.
Используйте исключения для передачи информации, реализуйте оценку транзакций с помощью try catch
В некоторых контрактах оценка сделки осуществляется путем выбрасывания специальной ошибки в функции обратного вызова сделки, а затем захвата этой ошибки и извлечения необходимой информации из сообщения об ошибке. Этот метод кажется хитрым, но он очень практичен, не требует модификации метода swap для оценки потребностей в сделках и имеет более простую логику.
Большие числа решают проблему точности
В сценариях, связанных с большими вычислениями, таких как расчет токенов, обмениваемых по текущей цене и ликвидности, необходимо избегать потерь точности, вызванных операциями деления. Один из способов - использовать операцию сдвига влево, например, << 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 или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
18 Лайков
Награда
18
6
Репост
Поделиться
комментарий
0/400
ServantOfSatoshi
· 08-12 16:04
Умелые трюки, разве это не означает хитрые манипуляции?
Посмотреть ОригиналОтветить0
mev_me_maybe
· 08-11 22:32
Новички в кофе нашли какую-то большую тайну, но это всего лишь старые разговоры.
Посмотреть ОригиналОтветить0
CommunityLurker
· 08-11 16:39
Новичок, верно? Рекомендую сначала попробовать сделать hello world.
Посмотреть ОригиналОтветить0
Blockwatcher9000
· 08-10 12:50
Говоря красиво, это技巧, на самом деле это всевозможные хитрые операции.
Посмотреть ОригиналОтветить0
OnChainDetective
· 08-10 12:46
Изучал развертывание create2 долгое время. Этот метод, похоже, используется для закладки мин... Понимающие поймут.
Посмотреть ОригиналОтветить0
ContractExplorer
· 08-10 12:42
Обнаружить новую уязвимость — это самое приятное, когда соревнуешься с уязвимостями.
7 полезных советов, которые помогут вам освоить разработку смарт-контрактов
Умные приемы в разработке контрактов
Недавно я изучал процесс разработки децентрализованных бирж и ссылался на код известных проектов, узнав много интересных моментов. Для разработчика, который впервые пытается создать DeFi-контракт, эти маленькие советы будут очень полезны для новичков, желающих изучить разработку контрактов.
Давайте вместе рассмотрим эти хитрые приемы, некоторые из которых можно назвать изощренными трюками.
Предсказуемый адрес развертывания контракта
Обычно адрес, получаемый при развертывании контракта, кажется случайным, поскольку он связан с nonce. Однако в некоторых случаях нам нужно сделать вывод о адресе контракта на основе информации о сделках, например, для определения прав на сделку или получения адреса пула.
Один из способов - использовать CREATE2 для создания контракта, добавив параметр salt: pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}()); Таким образом, адрес созданного контракта предсказуем, логика генерации следующая: новый адрес = hash("0xFF", адрес создателя, salt, initcode).
Умное использование функций обратного вызова
Контракты в Solidity могут вызывать друг друга. Один из паттернов заключается в том, что A вызывает метод B, а B в вызываемом методе вызывает A, что является полезным в некоторых сценариях.
Например, при вызове метода swap контракта UniswapV3Pool для выполнения сделки, он вызовет swapCallback, передав рассчитанный токен, необходимый для данной сделки. Вызывающая сторона должна передать необходимый токен в UniswapV3Pool в колбэке, а не разделять метод swap на две части. Это обеспечивает безопасность метода swap и полное выполнение, без необходимости в сложной записи переменных.
Используйте исключения для передачи информации, реализуйте оценку транзакций с помощью try catch
В некоторых контрактах оценка сделки осуществляется путем выбрасывания специальной ошибки в функции обратного вызова сделки, а затем захвата этой ошибки и извлечения необходимой информации из сообщения об ошибке. Этот метод кажется хитрым, но он очень практичен, не требует модификации метода swap для оценки потребностей в сделках и имеет более простую логику.
Большие числа решают проблему точности
В сценариях, связанных с большими вычислениями, таких как расчет токенов, обмениваемых по текущей цене и ликвидности, необходимо избегать потерь точности, вызванных операциями деления. Один из способов - использовать операцию сдвига влево, например, << 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(