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