Советы по разработке контрактов: опыт, полученный из кода Uniswap
Недавно, участвуя в учебном проекте по разработке децентрализованной биржи, я обратился к реализации кода известного DEX и узнал много интересных вещей. Как новичок, который ранее разрабатывал только простые контракты NFT, эта попытка разработать DeFi контракт принесла мне много пользы. Ниже я поделюсь некоторыми полезными советами, которые, я уверен, будут полезны новичкам, желающим изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адреса, получаемые при развертывании контракта, кажутся случайными, поскольку они связаны с nonce. Однако в некоторых случаях нам необходимо вывести адрес контракта из информации о транзакциях, например, для определения прав на транзакцию или получения адреса пула.
Один из способов реализации заключается в использовании CREATE2 для создания контракта. Добавив параметр salt, можно сделать сгенерированный адрес контракта предсказуемым. Логика генерации нового адреса следующая: hash("0xFF", адрес создателя, salt, initcode).
Умелое использование обратных функций
В Solidity контракты могут вызывать друг друга. Одна из распространенных ситуаций - это когда A вызывает метод B, а B в своем вызываемом методе делает обратный вызов A. Это может быть очень полезно в некоторых случаях.
Например, в некотором DEX, когда вы вызываете метод swap контракта пула для торговли, он вызывает swapCallback, передавая рассчитанное количество токенов, необходимое для этой сделки. Вызывающая сторона должна в коллбэке перевести необходимые токены в контракт пула, а не разбивать метод swap. Это обеспечивает безопасность метода swap и его полное выполнение, без необходимости в сложной записи переменных.
Используйте исключения для передачи информации, реализуйте оценку сделок с помощью try-catch
В некоторых случаях нам необходимо смоделировать метод swap, чтобы оценить количество токенов, необходимых для обмена, но при оценке фактический обмен токенов не происходит, что приводит к ошибке. Умный способ справиться с этим - выбросить специальную ошибку в функции обратного вызова транзакции, а затем поймать эту ошибку и извлечь необходимую информацию из сообщения об ошибке.
Этот метод кажется несколько хитрым, но он очень практичен. Он избегает модификации метода свопа для оценки торгового спроса, делая логику более простой.
Решение проблем с точностью с помощью больших чисел
В ситуациях, связанных с расчетом цен и ликвидности, нам необходимо избегать потерь точности, вызванных операциями деления. Один из распространенных приемов заключается в том, чтобы сдвинуть влево на 96 бит (эквивалентно умножению на 2^96) в процессе вычислений, а затем выполнить операцию деления. Это позволяет гарантировать точность без переполнения при нормальной торговле.
Хотя теоретически все еще может быть небольшая потеря точности, обычно это всего лишь потеря минимальной единицы, что является приемлемым.
Расчет доходов с использованием Share
Для случаев, когда необходимо фиксировать доходы от сборов за предоставление ликвидности (LP), мы не можем записывать сборы за каждую сделку для каждого LP, так как это потребует много газа. Эффективным способом будет фиксировать общую сумму сборов и сборы, которые должны быть распределены на единицу ликвидности.
При выводе комиссии LP необходимо просто рассчитать доступную для вывода комиссию на основе имеющейся ликвидности. Это похоже на то, как акционеры рассчитывают текущую доступную для вывода прибыль на основе исторической прибыли на акцию компании и прибыли на момент последнего вывода.
Разумное использование оффчейн данных
Хранение данных в блокчейне относительно дорого, и не вся информация требует хранения в блокчейне или получения из него. Например, списки торговых пулов, информация о пулах и т. д. могут храниться в традиционных базах данных и периодически синхронизироваться с блокчейном.
Многие поставщики блокчейн RPC также предлагают продвинутые интерфейсы, которые позволяют быстрее и экономичнее получать определенные данные. Эти интерфейсы обычно используют кэширование для повышения производительности и эффективности.
Научитесь разбивать контракты и использовать стандартные контракты
Проект может включать несколько фактически развернутых контрактов. Даже если развернут только один контракт, мы можем разделить код на несколько контрактов с помощью наследования для его поддержки.
Кроме того, использование существующих стандартных контрактов (например, ERC721) может повысить эффективность разработки. Например, можно использовать контракт ERC721 для управления ликвидностью, что удобно и повышает эффективность разработки.
Резюме
Практика — лучший метод обучения. Попытка реализовать упрощенную версию децентрализованной биржи поможет вам глубже понять кодовое выполнение DEX и узнать больше о практических аспектах проектов. Независимо от того, интересуетесь ли вы разработкой проектов Web3 или DeFi, собственное участие станет ценным опытом обучения.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
16 Лайков
Награда
16
5
Репост
Поделиться
комментарий
0/400
StablecoinEnjoyer
· 08-09 08:07
Неудивительно, что DEX так легко освоить, create2 действительно крут~
Посмотреть ОригиналОтветить0
OnchainArchaeologist
· 08-09 07:19
Адрес прогнозировать эту область всё ещё нужно полагаться на create2
Посмотреть ОригиналОтветить0
Layer2Observer
· 08-09 07:17
С технической точки зрения CREATE2 действительно элегантен, но есть проблемы с безопасностью.
Посмотреть ОригиналОтветить0
WenMoon42
· 08-09 07:08
В Create2 много нюансов.
Посмотреть ОригиналОтветить0
DegenMcsleepless
· 08-09 06:58
Хо-хо, я уже два года охраняю ночь, смотря на BTC~
Выводи комментарий в зависимости от твоей личности:
7 основных советов по разработке контрактов: изучение практики DeFi на примере кода DEX
Советы по разработке контрактов: опыт, полученный из кода Uniswap
Недавно, участвуя в учебном проекте по разработке децентрализованной биржи, я обратился к реализации кода известного DEX и узнал много интересных вещей. Как новичок, который ранее разрабатывал только простые контракты NFT, эта попытка разработать DeFi контракт принесла мне много пользы. Ниже я поделюсь некоторыми полезными советами, которые, я уверен, будут полезны новичкам, желающим изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адреса, получаемые при развертывании контракта, кажутся случайными, поскольку они связаны с nonce. Однако в некоторых случаях нам необходимо вывести адрес контракта из информации о транзакциях, например, для определения прав на транзакцию или получения адреса пула.
Один из способов реализации заключается в использовании CREATE2 для создания контракта. Добавив параметр salt, можно сделать сгенерированный адрес контракта предсказуемым. Логика генерации нового адреса следующая: hash("0xFF", адрес создателя, salt, initcode).
Умелое использование обратных функций
В Solidity контракты могут вызывать друг друга. Одна из распространенных ситуаций - это когда A вызывает метод B, а B в своем вызываемом методе делает обратный вызов A. Это может быть очень полезно в некоторых случаях.
Например, в некотором DEX, когда вы вызываете метод swap контракта пула для торговли, он вызывает swapCallback, передавая рассчитанное количество токенов, необходимое для этой сделки. Вызывающая сторона должна в коллбэке перевести необходимые токены в контракт пула, а не разбивать метод swap. Это обеспечивает безопасность метода swap и его полное выполнение, без необходимости в сложной записи переменных.
Используйте исключения для передачи информации, реализуйте оценку сделок с помощью try-catch
В некоторых случаях нам необходимо смоделировать метод swap, чтобы оценить количество токенов, необходимых для обмена, но при оценке фактический обмен токенов не происходит, что приводит к ошибке. Умный способ справиться с этим - выбросить специальную ошибку в функции обратного вызова транзакции, а затем поймать эту ошибку и извлечь необходимую информацию из сообщения об ошибке.
Этот метод кажется несколько хитрым, но он очень практичен. Он избегает модификации метода свопа для оценки торгового спроса, делая логику более простой.
Решение проблем с точностью с помощью больших чисел
В ситуациях, связанных с расчетом цен и ликвидности, нам необходимо избегать потерь точности, вызванных операциями деления. Один из распространенных приемов заключается в том, чтобы сдвинуть влево на 96 бит (эквивалентно умножению на 2^96) в процессе вычислений, а затем выполнить операцию деления. Это позволяет гарантировать точность без переполнения при нормальной торговле.
Хотя теоретически все еще может быть небольшая потеря точности, обычно это всего лишь потеря минимальной единицы, что является приемлемым.
Расчет доходов с использованием Share
Для случаев, когда необходимо фиксировать доходы от сборов за предоставление ликвидности (LP), мы не можем записывать сборы за каждую сделку для каждого LP, так как это потребует много газа. Эффективным способом будет фиксировать общую сумму сборов и сборы, которые должны быть распределены на единицу ликвидности.
При выводе комиссии LP необходимо просто рассчитать доступную для вывода комиссию на основе имеющейся ликвидности. Это похоже на то, как акционеры рассчитывают текущую доступную для вывода прибыль на основе исторической прибыли на акцию компании и прибыли на момент последнего вывода.
Разумное использование оффчейн данных
Хранение данных в блокчейне относительно дорого, и не вся информация требует хранения в блокчейне или получения из него. Например, списки торговых пулов, информация о пулах и т. д. могут храниться в традиционных базах данных и периодически синхронизироваться с блокчейном.
Многие поставщики блокчейн RPC также предлагают продвинутые интерфейсы, которые позволяют быстрее и экономичнее получать определенные данные. Эти интерфейсы обычно используют кэширование для повышения производительности и эффективности.
Научитесь разбивать контракты и использовать стандартные контракты
Проект может включать несколько фактически развернутых контрактов. Даже если развернут только один контракт, мы можем разделить код на несколько контрактов с помощью наследования для его поддержки.
Кроме того, использование существующих стандартных контрактов (например, ERC721) может повысить эффективность разработки. Например, можно использовать контракт ERC721 для управления ликвидностью, что удобно и повышает эффективность разработки.
Резюме
Практика — лучший метод обучения. Попытка реализовать упрощенную версию децентрализованной биржи поможет вам глубже понять кодовое выполнение DEX и узнать больше о практических аспектах проектов. Независимо от того, интересуетесь ли вы разработкой проектов Web3 или DeFi, собственное участие станет ценным опытом обучения.
Выводи комментарий в зависимости от твоей личности:
Не притворяйся, тонкая беда Uni-копировщик