Аналіз 7 основних порад з розробки контрактів Uniswap для підвищення ефективності проектів Децентралізовані фінанси

robot
Генерація анотацій у процесі

Поради з розробки смартконтрактів, отримані з коду Uniswap

Нещодавно, під час написання посібника з розробки децентралізованих бірж, я звернувся до реалізації коду Uniswap V3 і дізнався багато цікавих технік розробки смартконтрактів. Як новачок у розробці DeFi контрактів, ці техніки будуть дуже корисні для тих, хто хоче навчитися розробці контрактів.

Web3 новачок серії: маленькі поради з розробки контрактів, які я дізнався з коду Uniswap

Прогнозовані адреси смартконтрактів

Зазвичай адреса, отримана після розгортання контракту, виглядає випадковою, оскільки пов'язана з nonce. Але в деяких ситуаціях нам потрібно вивести адресу контракту на основі інформації про транзакцію, наприклад, для визначення прав на транзакцію або отримання адреси пулу.

Uniswap використовує метод CREATE2 для створення смартконтрактів, додаючи параметр salt для прогнозованості адреси. Логіка генерації нової адреси така: hash("0xFF", адреса створювача, salt, initcode). Цей метод дозволяє заздалегідь обчислити адресу контракту.

![Web3 новачка серія: маленькі поради з розробки контрактів, які я дізнався з коду Uniswap](https://img-cdn.gateio.im/webp-social/moments-0aaa61a4d43aba7fdeddbc55e3665305.webp01

Розумне використання функцій зворотного виклику

У Solidity контракти можуть викликати один одного. У певних сценаріях метод A викликає метод B, а B у викликаному методі викликає A, ця модель є дуже корисною.

Наприклад, під час торгівлі методом swap Uniswap, відбудеться виклик swapCallback, в який буде передано фактичну кількість токенів, що потрібно. Викликаюча сторона повинна передати токени у зворотному виклику, а не розділяти swap на два кроки. Це забезпечує повне виконання методу swap без необхідності складного ведення записів змінних для забезпечення безпеки.

Використовуйте винятки для передачі інформації, використовуйте try-catch для оцінки交易

У контракті Quoter Uniswap, метод swap UniswapV3Pool обгорнуто в try-catch. Це зроблено для симуляції swap для оцінки необхідної кількості токенів, але під час оцінки токени не обмінюються насправді, тому виникає помилка.

Uniswap викидає спеціальну помилку під час зворотного виклику交易, після чого ловить цю помилку і аналізує з неї необхідну інформацію. Цей метод уникає необхідності модифікувати метод swap для оцінки попиту, що робить логіку більш простішою.

![Web3 новачок серії: маленькі поради з розробки контрактів, які я навчився з коду Uniswap])https://img-cdn.gateio.im/webp-social/moments-b0c3d4eb7e8ca88cc4cfc9476a34437a.webp(

Великі числові обчислення вирішують проблему точності

У Uniswap залучено велику кількість обчислень, таких як обчислення кількості токенів для обміну на основі ціни та ліквідності. Щоб уникнути втрати точності при діленні, в процесі обчислення часто використовують << FixedPoint96.RESOLUTION операцію, тобто зсув вліво на 96 біт, що еквівалентно множенню на 2^96.

Зміщення вліво, а потім виконання ділення може забезпечити точність за умов, що нормальна торгівля не перевищує межі. Хоча теоретично все ще є невелика втрата точності, вона вже є прийнятною.

Обчислення прибутку за допомогою Share

Uniswap повинен записувати доходи від комісій для постачальника ліквідності ). Очевидно, що не можна фіксувати комісії для кожного LP під час кожної транзакції, це витрачатиме багато газу.

Рішення полягає в тому, щоб зафіксувати загальну комісію та комісію, яка повинна бути розподілена на одиницю ліквідності. При вилученні LP комісія, яку можна вилучити, розраховується на основі утримуваної ліквідності, подібно до дивідендів за акціями.

Web3 новачок серії: маленькі поради з розробки контрактів, які я навчився з коду Uniswap

Розрізнення інформації на блокчейні та поза ним

Зберігання на ланцюгу відносно дороге, не вся інформація потребує зберігання на ланцюгу або отримання з нього. Наприклад, багато інтерфейсів, які викликаються фронтендом Uniswap, є традиційними веб-інтерфейсами Web2.

Список торгових пулів, інформація тощо можуть зберігатися в звичайній базі даних, періодично синхронізуючи з ланцюгом. Не потрібно в реальному часі викликати RPC-інтерфейси для отримання відповідних даних. Звісно, ключові угоди все ще проводяться на ланцюзі.

Розподіл контрактів та повторне використання стандартних контрактів

Проект може містити кілька фактично розгорнуті смартконтракти. Навіть якщо розгорнуто лише один контракт, код можна розділити на кілька контрактів для обслуговування через наслідування.

Як NonfungiblePositionManager контракт Uniswap успадковує кілька контрактів. Серед них ERC721Permit безпосередньо використовує контракт ERC721 від OpenZeppelin, що полегшує управління позиціями через NFT та підвищує ефективність розробки.

Підсумок

Самостійна розробка є більш ефективною, ніж просте читання статей. Спробуйте реалізувати спрощену версію децентралізованої біржі, щоб глибше зрозуміти реалізацію коду Uniswap та навчитися знанням, які використовуються в реальних проектах.

Web3 новачок серії: Я навчився маленьким хитрощам розробки смартконтрактів з коду Uniswap

UNI7.11%
DEFI18.31%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 7
  • Поділіться
Прокоментувати
0/400
PoolJumpervip
· 07-28 02:11
Нульова інфраструктура робить кілька речей
Переглянути оригіналвідповісти на0
OldLeekConfessionvip
· 07-27 04:18
Ти вже будеш крутим, якщо зможеш змусити мене зрозуміти...
Переглянути оригіналвідповісти на0
OnchainGossipervip
· 07-27 03:51
Рекомендується попрактикуватися на практиці~
Переглянути оригіналвідповісти на0
BagHolderTillRetirevip
· 07-25 17:02
Нарешті знайшов вихід із ситуації, в якій я у пастці.
Переглянути оригіналвідповісти на0
PanicSeller69vip
· 07-25 17:00
V3 все еще имеет некоторые вещи! Давай!
Переглянути оригіналвідповісти на0
degenonymousvip
· 07-25 16:58
Євангеліє для кодерів
Переглянути оригіналвідповісти на0
AirdropDreamBreakervip
· 07-25 16:56
Розробка не така хороша, як просто вкрасти код.
Переглянути оригіналвідповісти на0
  • Закріпити