Нещодавно в процесі розробки децентралізованої біржі я звернув увагу на реалізацію коду 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 знімає кошти, комісія, яку можна зняти, розраховується на основі наявної ліквідності, подібно до принципу дивідендів акцій.
Поєднання даних на ланцюзі та поза ним
Не вся інформація повинна бути записана в блокчейн або отримана з нього. Такі дані, як списки торгових пулів, інформація про пули тощо, можна зберігати в звичайних базах даних і періодично синхронізувати з блокчейном. Це може підвищити продуктивність і ефективність, знизити витрати. Звичайно, ключові транзакції все ще повинні здійснюватися в блокчейні.
Розподіл контрактів та повторне використання стандартних контрактів
Проект може містити кілька фактично розгорнутих контрактів. Навіть якщо розгорнуто лише один контракт, код може бути розділений на кілька контрактів за допомогою спадкування.
Водночас, використання вже існуючих стандартних контрактів (, таких як ERC721), може підвищити ефективність розробки. Наприклад, використання ERC721 для управління позиціями є зручним і дозволяє повторно використовувати зрілий код.
Підсумок
Практична розробка є найкращим способом навчання. Спробуйте реалізувати спрощену версію децентралізованої біржі, що дозволить вам глибше зрозуміти код Uniswap і дізнатися більше про практичні аспекти проектів. Сподіваюся, цей досвід буде вам корисним.
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 знімає кошти, комісія, яку можна зняти, розраховується на основі наявної ліквідності, подібно до принципу дивідендів акцій.
Поєднання даних на ланцюзі та поза ним
Не вся інформація повинна бути записана в блокчейн або отримана з нього. Такі дані, як списки торгових пулів, інформація про пули тощо, можна зберігати в звичайних базах даних і періодично синхронізувати з блокчейном. Це може підвищити продуктивність і ефективність, знизити витрати. Звичайно, ключові транзакції все ще повинні здійснюватися в блокчейні.
Розподіл контрактів та повторне використання стандартних контрактів
Проект може містити кілька фактично розгорнутих контрактів. Навіть якщо розгорнуто лише один контракт, код може бути розділений на кілька контрактів за допомогою спадкування.
Водночас, використання вже існуючих стандартних контрактів (, таких як ERC721), може підвищити ефективність розробки. Наприклад, використання ERC721 для управління позиціями є зручним і дозволяє повторно використовувати зрілий код.
Підсумок
Практична розробка є найкращим способом навчання. Спробуйте реалізувати спрощену версію децентралізованої біржі, що дозволить вам глибше зрозуміти код Uniswap і дізнатися більше про практичні аспекти проектів. Сподіваюся, цей досвід буде вам корисним.