Поради з розробки смартконтрактів, отримані з коду 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 комісія, яку можна вилучити, розраховується на основі утримуваної ліквідності, подібно до дивідендів за акціями.
Розрізнення інформації на блокчейні та поза ним
Зберігання на ланцюгу відносно дороге, не вся інформація потребує зберігання на ланцюгу або отримання з нього. Наприклад, багато інтерфейсів, які викликаються фронтендом 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
Ти вже будеш крутим, якщо зможеш змусити мене зрозуміти...
Переглянути оригіналвідповісти на0
OnchainGossiper
· 07-27 03:51
Рекомендується попрактикуватися на практиці~
Переглянути оригіналвідповісти на0
BagHolderTillRetire
· 07-25 17:02
Нарешті знайшов вихід із ситуації, в якій я у пастці.
Аналіз 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 комісія, яку можна вилучити, розраховується на основі утримуваної ліквідності, подібно до дивідендів за акціями.
Розрізнення інформації на блокчейні та поза ним
Зберігання на ланцюгу відносно дороге, не вся інформація потребує зберігання на ланцюгу або отримання з нього. Наприклад, багато інтерфейсів, які викликаються фронтендом Uniswap, є традиційними веб-інтерфейсами Web2.
Список торгових пулів, інформація тощо можуть зберігатися в звичайній базі даних, періодично синхронізуючи з ланцюгом. Не потрібно в реальному часі викликати RPC-інтерфейси для отримання відповідних даних. Звісно, ключові угоди все ще проводяться на ланцюзі.
Розподіл контрактів та повторне використання стандартних контрактів
Проект може містити кілька фактично розгорнуті смартконтракти. Навіть якщо розгорнуто лише один контракт, код можна розділити на кілька контрактів для обслуговування через наслідування.
Як NonfungiblePositionManager контракт Uniswap успадковує кілька контрактів. Серед них ERC721Permit безпосередньо використовує контракт ERC721 від OpenZeppelin, що полегшує управління позиціями через NFT та підвищує ефективність розробки.
Підсумок
Самостійна розробка є більш ефективною, ніж просте читання статей. Спробуйте реалізувати спрощену версію децентралізованої біржі, щоб глибше зрозуміти реалізацію коду Uniswap та навчитися знанням, які використовуються в реальних проектах.