Недавно, разрабатывая децентрализованную биржу, я изучал код реализации известного DEX и научился многим полезным приемам разработки контрактов. Как новичок в разработке Defi-контрактов, эти приемы очень меня вдохновили, и я уверен, что они также помогут другим, кто хочет изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адреса, получаемые при развертывании контрактов, кажутся случайными и труднопредсказуемыми. Однако в некоторых ситуациях нам необходимо вывести адрес контракта на основе информации о сделке, например, для определения прав на транзакции или получения адреса пула.
Это можно реализовать с помощью создания контракта с использованием метода CREATE2. Конкретный способ заключается в добавлении параметра salt при создании контракта:
солидность
pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Таким образом, адрес контракта, созданный таким образом, предсказуем, логика генерации такова:
Новый адрес = hash("0xFF", адрес создателя, salt, initcode)
Использование функции обратного вызова
В некоторых сценариях взаимные вызовы между контрактами очень полезны. Например, A вызывает метод B, а B в вызываемом методе вызывает A.
Например, при сделке, когда вызывается метод swap контракта пула, он вызывает swapCallback, передавая рассчитанное фактическое количество необходимых токенов. Вызывающая сторона должна передать токены в контракт пула в обратном вызове, что обеспечивает полное выполнение метода swap и его безопасность, без необходимости в сложной записи переменных.
Передача информации с помощью исключений
При оценке сделки нам необходимо смоделировать метод swap, но не выполнять фактический обмен токенов. Мы можем выбросить специальную ошибку в функции обратного вызова сделки, а затем поймать эту ошибку и извлечь необходимую информацию.
Этот метод кажется хитрым, но очень практичен. Не нужно специально адаптировать метод свопа для оценки сделок, логика более проста.
Решение проблемы точности больших чисел
При расчетах цен и ликвидности, чтобы избежать потери точности при делении, можно использовать операцию сдвига влево (, что эквивалентно умножению на 2^96).
Таким образом, можно гарантировать точность при нормальной торговле без переполнения. Хотя теоретически все еще существует небольшая потеря точности, это уже приемлемо.
Способы расчета дохода
Чтобы избежать учета комиссии для всех LP при каждой сделке, можно использовать способ Share.
Необходимо лишь зафиксировать общую сумму комиссии и комиссию, которую следует распределить на каждого поставщика ликвидности. При выводе средств LP комиссия, которую можно извлечь, рассчитывается на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
Разумное использование данных вне цепочки
Не вся информация должна быть записана в блокчейн или получать данные из него. Такие данные, как список пула транзакций и основная информация, могут храниться в обычной базе данных и синхронизироваться периодически.
Некоторые продвинутые RPC интерфейсы также предоставляют оптимизированные методы получения данных с кешированием, что может повысить производительность и эффективность.
Разделение и повторное использование контрактов
Крупные проекты могут быть разделены на несколько фактически развернутых контрактов или разделены на несколько контрактов для поддержки через наследование.
В то же время можно использовать существующие стандартные контракты, такие как ERC721, что повышает эффективность разработки. Например:
солидность
контракт NonfungiblePositionManager является
INonfungiblePositionManager,
PeripheryImmutableState,
Инициализатор пула,
Управление ликвидностью,
PeripheryValidation,
Мультиколл,
ERC721Разрешение,
ПериферияПлатежи,
NFTDescriptor
{
// ...
}
Изучение реализации кода выдающихся проектов и попытка самостоятельно разработать что-то поможет вам лучше понять децентрализованные биржи. Надеюсь, эти небольшие советы помогут вам в разработке контрактов!
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
7 практических советов по разработке контрактов для поддержки DEX проектов
Сводка небольших советов по разработке контрактов
Недавно, разрабатывая децентрализованную биржу, я изучал код реализации известного DEX и научился многим полезным приемам разработки контрактов. Как новичок в разработке Defi-контрактов, эти приемы очень меня вдохновили, и я уверен, что они также помогут другим, кто хочет изучить разработку контрактов.
Предсказуемый адрес контракта
Обычно адреса, получаемые при развертывании контрактов, кажутся случайными и труднопредсказуемыми. Однако в некоторых ситуациях нам необходимо вывести адрес контракта на основе информации о сделке, например, для определения прав на транзакции или получения адреса пула.
Это можно реализовать с помощью создания контракта с использованием метода CREATE2. Конкретный способ заключается в добавлении параметра salt при создании контракта:
солидность pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());
Таким образом, адрес контракта, созданный таким образом, предсказуем, логика генерации такова:
Новый адрес = hash("0xFF", адрес создателя, salt, initcode)
Использование функции обратного вызова
В некоторых сценариях взаимные вызовы между контрактами очень полезны. Например, A вызывает метод B, а B в вызываемом методе вызывает A.
Например, при сделке, когда вызывается метод swap контракта пула, он вызывает swapCallback, передавая рассчитанное фактическое количество необходимых токенов. Вызывающая сторона должна передать токены в контракт пула в обратном вызове, что обеспечивает полное выполнение метода swap и его безопасность, без необходимости в сложной записи переменных.
Передача информации с помощью исключений
При оценке сделки нам необходимо смоделировать метод swap, но не выполнять фактический обмен токенов. Мы можем выбросить специальную ошибку в функции обратного вызова сделки, а затем поймать эту ошибку и извлечь необходимую информацию.
Этот метод кажется хитрым, но очень практичен. Не нужно специально адаптировать метод свопа для оценки сделок, логика более проста.
Решение проблемы точности больших чисел
При расчетах цен и ликвидности, чтобы избежать потери точности при делении, можно использовать операцию сдвига влево (, что эквивалентно умножению на 2^96).
Например:
солидность numerator1 = FullMath.mulDiv(ликвидность << FixedPoint96.RESOLUTION, sqrtRatioBX96 - sqrtRatioAX96, sqrtRatioBX96);
Таким образом, можно гарантировать точность при нормальной торговле без переполнения. Хотя теоретически все еще существует небольшая потеря точности, это уже приемлемо.
Способы расчета дохода
Чтобы избежать учета комиссии для всех LP при каждой сделке, можно использовать способ Share.
Необходимо лишь зафиксировать общую сумму комиссии и комиссию, которую следует распределить на каждого поставщика ликвидности. При выводе средств LP комиссия, которую можно извлечь, рассчитывается на основе удерживаемой ликвидности, аналогично дивидендам по акциям.
Разумное использование данных вне цепочки
Не вся информация должна быть записана в блокчейн или получать данные из него. Такие данные, как список пула транзакций и основная информация, могут храниться в обычной базе данных и синхронизироваться периодически.
Некоторые продвинутые RPC интерфейсы также предоставляют оптимизированные методы получения данных с кешированием, что может повысить производительность и эффективность.
Разделение и повторное использование контрактов
Крупные проекты могут быть разделены на несколько фактически развернутых контрактов или разделены на несколько контрактов для поддержки через наследование.
В то же время можно использовать существующие стандартные контракты, такие как ERC721, что повышает эффективность разработки. Например:
солидность контракт NonfungiblePositionManager является INonfungiblePositionManager, PeripheryImmutableState, Инициализатор пула, Управление ликвидностью, PeripheryValidation, Мультиколл, ERC721Разрешение, ПериферияПлатежи, NFTDescriptor { // ... }
Изучение реализации кода выдающихся проектов и попытка самостоятельно разработать что-то поможет вам лучше понять децентрализованные биржи. Надеюсь, эти небольшие советы помогут вам в разработке контрактов!