Недавно, в процессе разработки децентрализованной биржи, я обратился к реализации кода Uniswap V3 и узнал много полезных приемов разработки контрактов. Как разработчик, который ранее создавал простые NFT-контракты, эта попытка разработки DeFi-контрактов принесла мне много полезного опыта. Эти приемы, вероятно, будут очень полезны новичкам, желающим изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно при развертывании контракта получается адрес, который выглядит случайным, потому что он зависит от nonce. Но в некоторых сценариях нам необходимо вывести адрес контракта, исходя из информации о сделке, например, для определения прав на сделку или получения адреса пула.
Практическим методом является использование CREATE2 для создания контракта. Добавив параметр salt, можно сделать адрес создаваемого контракта предсказуемым. Логика генерации нового адреса следующая: hash("0xFF", адрес создателя, salt, initcode). Этот способ позволяет нам знать адрес контракта еще до его создания.
Умелое использование функций обратного вызова
В Solidity контракты могут вызывать друг друга. В некоторых сценариях, когда A вызывает метод B, и B вызывает A в своем методе, такая модель оказывается очень полезной.
Например, при торговле контракт пула будет вызывать swapCallback, передавая фактическое количество токенов, необходимых для этой сделки. Вызывающая сторона должна в колбэке перевести токены в контракт пула. Этот метод обеспечивает безопасность и целостность метода swap, избегая сложной записи переменных.
Используйте исключения для передачи информации, используйте блок try-catch для оценки транзакции
При оценке сделки нам нужно смоделировать метод swap, но не осуществлять фактический обмен токенов. Умный подход заключается в том, чтобы выбросить специальную ошибку в обратном вызове сделки, а затем поймать эту ошибку и извлечь из нее необходимую информацию. Этот подход позволяет избежать необходимости специальной модификации метода swap для оценки сделки, делая логику более простой.
Решение проблемы точности больших чисел
При расчете цен и ликвидности, чтобы избежать потери точности при делении, можно использовать операцию сдвига влево, которая эквивалентна умножению на 2^96(. Таким образом, при нормальной торговле без переполнения можно гарантировать точность. Хотя теоретически все еще может быть незначительная потеря точности, это уже приемлемо.
Способ расчета дохода через Share
Для расчета доходов от комиссий LP нельзя регистрировать каждую сделку для каждого LP, так как это потребует много газа. Хорошим решением является регистрация общей комиссии и комиссии, подлежащей распределению на единицу ликвидности. При выводе LP комиссии рассчитываются на основе удерживаемой ликвидности, по аналогии с принципом дивидендов акций.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Сочетание данных на цепочке и вне цепочки
Не вся информация должна быть записана в блокчейн или получена из него. Такие данные, как список торговых пулов и информация о пулах, можно хранить в обычной базе данных, периодически синхронизируя с блокчейном. Это может повысить производительность и эффективность, снизить затраты. Конечно, ключевые транзакции все еще должны проводиться в блокчейне.
Разделение контрактов и повторное использование стандартных контрактов
Проект может содержать несколько фактически развернутых контрактов. Даже если развернут только один контракт, код может быть разделен на несколько контрактов через наследование для облегчения обслуживания.
В то же время использование существующих стандартных контрактов ), таких как ERC721(, может увеличить эффективность разработки. Например, использование ERC721 для управления позициями удобно и позволяет повторно использовать зрелый код.
Резюме
Практическая разработка является лучшим способом обучения. Попробуйте реализовать упрощенную версию децентрализованной биржи, чтобы глубже понять код Uniswap и узнать больше о реальных аспектах проектов. Надеюсь, что этот опыт будет для вас полезен.
![Web3 Новичок Серия: Малые советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
Разработка контрактов: 7 полезных советов для помощи проектам DeFi
Советы и опыт по разработке контрактов
Недавно, в процессе разработки децентрализованной биржи, я обратился к реализации кода Uniswap V3 и узнал много полезных приемов разработки контрактов. Как разработчик, который ранее создавал простые NFT-контракты, эта попытка разработки DeFi-контрактов принесла мне много полезного опыта. Эти приемы, вероятно, будут очень полезны новичкам, желающим изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно при развертывании контракта получается адрес, который выглядит случайным, потому что он зависит от nonce. Но в некоторых сценариях нам необходимо вывести адрес контракта, исходя из информации о сделке, например, для определения прав на сделку или получения адреса пула.
Практическим методом является использование CREATE2 для создания контракта. Добавив параметр salt, можно сделать адрес создаваемого контракта предсказуемым. Логика генерации нового адреса следующая: hash("0xFF", адрес создателя, salt, initcode). Этот способ позволяет нам знать адрес контракта еще до его создания.
Умелое использование функций обратного вызова
В Solidity контракты могут вызывать друг друга. В некоторых сценариях, когда A вызывает метод B, и B вызывает A в своем методе, такая модель оказывается очень полезной.
Например, при торговле контракт пула будет вызывать swapCallback, передавая фактическое количество токенов, необходимых для этой сделки. Вызывающая сторона должна в колбэке перевести токены в контракт пула. Этот метод обеспечивает безопасность и целостность метода swap, избегая сложной записи переменных.
Используйте исключения для передачи информации, используйте блок try-catch для оценки транзакции
При оценке сделки нам нужно смоделировать метод swap, но не осуществлять фактический обмен токенов. Умный подход заключается в том, чтобы выбросить специальную ошибку в обратном вызове сделки, а затем поймать эту ошибку и извлечь из нее необходимую информацию. Этот подход позволяет избежать необходимости специальной модификации метода swap для оценки сделки, делая логику более простой.
Решение проблемы точности больших чисел
При расчете цен и ликвидности, чтобы избежать потери точности при делении, можно использовать операцию сдвига влево, которая эквивалентна умножению на 2^96(. Таким образом, при нормальной торговле без переполнения можно гарантировать точность. Хотя теоретически все еще может быть незначительная потеря точности, это уже приемлемо.
Способ расчета дохода через Share
Для расчета доходов от комиссий LP нельзя регистрировать каждую сделку для каждого LP, так как это потребует много газа. Хорошим решением является регистрация общей комиссии и комиссии, подлежащей распределению на единицу ликвидности. При выводе LP комиссии рассчитываются на основе удерживаемой ликвидности, по аналогии с принципом дивидендов акций.
![Серия для новичков Web3: маленькие советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-45e66af69435e6d4412ae506e77ab893.webp(
Сочетание данных на цепочке и вне цепочки
Не вся информация должна быть записана в блокчейн или получена из него. Такие данные, как список торговых пулов и информация о пулах, можно хранить в обычной базе данных, периодически синхронизируя с блокчейном. Это может повысить производительность и эффективность, снизить затраты. Конечно, ключевые транзакции все еще должны проводиться в блокчейне.
Разделение контрактов и повторное использование стандартных контрактов
Проект может содержать несколько фактически развернутых контрактов. Даже если развернут только один контракт, код может быть разделен на несколько контрактов через наследование для облегчения обслуживания.
В то же время использование существующих стандартных контрактов ), таких как ERC721(, может увеличить эффективность разработки. Например, использование ERC721 для управления позициями удобно и позволяет повторно использовать зрелый код.
Резюме
Практическая разработка является лучшим способом обучения. Попробуйте реализовать упрощенную версию децентрализованной биржи, чтобы глубже понять код Uniswap и узнать больше о реальных аспектах проектов. Надеюсь, что этот опыт будет для вас полезен.
![Web3 Новичок Серия: Малые советы по разработке контрактов, которые я узнал из кода Uniswap])https://img-cdn.gateio.im/webp-social/moments-f95ddc9d89809cf11dbe65b9bafda157.webp(