Недавно, когда я писал учебное пособие по разработке децентрализованных бирж, я обратил внимание на реализацию кода Uniswap V3 и узнал много интересных техник разработки смарт-контрактов. Как разработчик, который впервые пытается разработать DeFi контракты, эти техники будут очень полезны для новичков, желающих изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адрес, полученный при развертывании контракта, кажется случайным, потому что он связан с nonce. Но в некоторых случаях нам нужно вывести адрес контракта на основе информации о сделке, например, для определения прав на сделку или получения адреса пула.
Uniswap использует метод CREATE2 для создания смарт-контрактов, добавляя параметр salt для предсказуемости адреса. Логика генерации нового адреса: hash("0xFF", адрес создателя, salt, initcode). Этот метод позволяет заранее вычислить адрес контракта.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Большие числовые операции решают проблемы точности
В Uniswap вовлечено множество вычислений, таких как расчет количества токенов для обмена на основе цены и ликвидности. Чтобы избежать потери точности при делении, в вычислительном процессе часто используется операция << FixedPoint96.RESOLUTION, то есть сдвиг влево на 96 бит, что эквивалентно умножению на 2^96.
Сдвинув влево и затем проведя деление, можно гарантировать точность при нормальной торговле без переполнения. Хотя теоретически все еще есть небольшие потери точности, они уже приемлемы.
Вычисление дохода по способу Share
Uniswap должен записывать доход от комиссий ликвидности для поставщика LP). Очевидно, что нельзя записывать комиссию для каждого LP при каждой сделке, это потребует большого количества Gas.
Решение заключается в записи общего размера комиссий и комиссий, которые должны быть распределены на каждую единицу ликвидности. При выводе LP комиссии для вывода рассчитываются на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
Различие между информацией на блокчейне и вне его
Хранение на цепочке относительно дорого, не вся информация должна быть в цепочке или извлекаться из цепочки. Многие интерфейсы, которые вызывает фронтенд Uniswap, являются традиционными Web2 интерфейсами.
Список торговых пулов, информация и т. д. могут храниться в обычной базе данных, синхронизируясь с блокчейном периодически. Нет необходимости в реальном времени вызывать RPC интерфейс для получения связанных данных. Конечно, ключевые транзакции все еще происходят на блокчейне.
Разделение контрактов и повторное использование стандартных смарт-контрактов
Проект может включать несколько фактически развернутых смарт-контрактов. Даже если развернут только один контракт, код также может быть разделен на несколько контрактов для поддержки через наследование.
Как смарт-контракты NonfungiblePositionManager Uniswap наследуют несколько контрактов. Среди них ERC721Permit напрямую использует контракт ERC721 от OpenZeppelin, что облегчает управление позицией через NFT и повышает эффективность разработки.
Итоги
Самостоятельная разработка более эффективна, чем простое чтение статей. Попробуйте реализовать упрощенную версию децентрализованной биржи, чтобы глубже понять код Uniswap и узнать практические аспекты из реальных проектов.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
21 Лайков
Награда
21
7
Поделиться
комментарий
0/400
PoolJumper
· 07-28 02:11
Ноль инфраструктуры, делаем это.
Посмотреть ОригиналОтветить0
OldLeekConfession
· 07-27 04:18
Ты уже молодец, если сможешь заставить меня понять...
Анализ 7 основных методов разработки контрактов Uniswap для повышения эффективности проектов Децентрализованные финансы
Уроки разработки смарт-контрактов из кода Uniswap
Недавно, когда я писал учебное пособие по разработке децентрализованных бирж, я обратил внимание на реализацию кода Uniswap V3 и узнал много интересных техник разработки смарт-контрактов. Как разработчик, который впервые пытается разработать DeFi контракты, эти техники будут очень полезны для новичков, желающих изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адрес, полученный при развертывании контракта, кажется случайным, потому что он связан с nonce. Но в некоторых случаях нам нужно вывести адрес контракта на основе информации о сделке, например, для определения прав на сделку или получения адреса пула.
Uniswap использует метод CREATE2 для создания смарт-контрактов, добавляя параметр salt для предсказуемости адреса. Логика генерации нового адреса: hash("0xFF", адрес создателя, salt, initcode). Этот метод позволяет заранее вычислить адрес контракта.
https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(
Большие числовые операции решают проблемы точности
В Uniswap вовлечено множество вычислений, таких как расчет количества токенов для обмена на основе цены и ликвидности. Чтобы избежать потери точности при делении, в вычислительном процессе часто используется операция << FixedPoint96.RESOLUTION, то есть сдвиг влево на 96 бит, что эквивалентно умножению на 2^96.
Сдвинув влево и затем проведя деление, можно гарантировать точность при нормальной торговле без переполнения. Хотя теоретически все еще есть небольшие потери точности, они уже приемлемы.
Вычисление дохода по способу Share
Uniswap должен записывать доход от комиссий ликвидности для поставщика LP). Очевидно, что нельзя записывать комиссию для каждого LP при каждой сделке, это потребует большого количества Gas.
Решение заключается в записи общего размера комиссий и комиссий, которые должны быть распределены на каждую единицу ликвидности. При выводе LP комиссии для вывода рассчитываются на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
Различие между информацией на блокчейне и вне его
Хранение на цепочке относительно дорого, не вся информация должна быть в цепочке или извлекаться из цепочки. Многие интерфейсы, которые вызывает фронтенд Uniswap, являются традиционными Web2 интерфейсами.
Список торговых пулов, информация и т. д. могут храниться в обычной базе данных, синхронизируясь с блокчейном периодически. Нет необходимости в реальном времени вызывать RPC интерфейс для получения связанных данных. Конечно, ключевые транзакции все еще происходят на блокчейне.
Разделение контрактов и повторное использование стандартных смарт-контрактов
Проект может включать несколько фактически развернутых смарт-контрактов. Даже если развернут только один контракт, код также может быть разделен на несколько контрактов для поддержки через наследование.
Как смарт-контракты NonfungiblePositionManager Uniswap наследуют несколько контрактов. Среди них ERC721Permit напрямую использует контракт ERC721 от OpenZeppelin, что облегчает управление позицией через NFT и повышает эффективность разработки.
Итоги
Самостоятельная разработка более эффективна, чем простое чтение статей. Попробуйте реализовать упрощенную версию децентрализованной биржи, чтобы глубже понять код Uniswap и узнать практические аспекты из реальных проектов.