Ф'ючерси
Сотні безстрокових контрактів
CFD
Золото
Одна платформа для світових активів
Опціони
Hot
Торгівля ванільними опціонами європейського зразка
Єдиний рахунок
Максимізуйте ефективність вашого капіталу
Демо торгівля
Вступ до ф'ючерсної торгівлі
Підготуйтеся до ф’ючерсної торгівлі
Ф'ючерсні події
Заробляйте, беручи участь в подіях
Демо торгівля
Використовуйте віртуальні кошти для безризикової торгівлі
Запуск
CandyDrop
Збирайте цукерки, щоб заробити аірдропи
Launchpool
Швидкий стейкінг, заробляйте нові токени
HODLer Airdrop
Утримуйте GT і отримуйте масові аірдропи безкоштовно
Pre-IPOs
Отримайте повний доступ до глобальних IPO акцій.
Alpha Поінти
Ончейн-торгівля та аірдропи
Ф'ючерсні бали
Заробляйте фʼючерсні бали та отримуйте аірдроп-винагороди
Інвестиції
Simple Earn
Заробляйте відсотки за допомогою неактивних токенів
Автоінвестування
Автоматичне інвестування на регулярній основі
Подвійні інвестиції
Прибуток від волатильності ринку
Soft Staking
Earn rewards with flexible staking
Криптопозика
0 Fees
Заставте одну криптовалюту, щоб позичити іншу
Центр кредитування
Єдиний центр кредитування
Центр багатства VIP
Преміальні плани зростання капіталу
Управління приватним капіталом
Розподіл преміальних активів
Квантовий фонд
Квантові стратегії найвищого рівня
Стейкінг
Стейкайте криптовалюту, щоб заробляти на продуктах PoS
Розумне кредитне плече
Кредитне плече без ліквідації
Випуск GUSD
Мінтинг GUSD для прибутку RWA
Акції
AI
Gate AI
Ваш універсальний AI-помічник для спілкування
Gate AI Bot
Використовуйте Gate AI безпосередньо у своєму соціальному додатку
GateClaw
Gate Блакитний Лобстер — готовий до використання
Gate for AI Agent
AI-інфраструктура, Gate MCP, Skills і CLI
Gate Skills Hub
Понад 10 000 навичок
Від офісу до трейдингу: універсальна база навичок для ефективнішої роботи з AI
GateRouter
Розумний вибір із понад 40 моделей ШІ, без додаткових витрат (0%)
Засвоєні під час читання коди Uniswap та отримані навички розробки контрактів набагато цікавіше за підручники
Останнім часом, коли я займався навчанням розробки децентралізованих бірж, глибоко досліджував реалізацію Uniswap V3 і зрозумів, що деякі підходи дійсно геніальні. Раніше я писав лише прості NFT-контракти, а цього разу вперше серйозно занурився у код DeFi-контрактів і знайшов багато цікавого, що хочу поділитися з тими, хто хоче вивчати уроки по Uniswap.
Почну з найбільш вражаючого — чи можна передбачити адресу контракту?
Зазвичай, при розгортанні контракту адреса здається випадковою, але Uniswap використовує хитрий спосіб. Він через додавання параметра salt при створенні контракту, використовуючи команду CREATE2, робить адресу передбачуваною. Конкретний приклад — «pool = address(new UniswapV3Pool{salt: keccak256(abi.encode(token0, token1, fee))}());». Такий код. Перевага в тому, що, знаючи торгову пару і комісію, можна обчислити адресу пулу ще до його розгортання, що особливо корисно для перевірки прав або швидкого пошуку пулу.
Дизайн колбек-функцій теж дуже продуманий.
У Uniswap, коли викликаєш метод swap для обміну, він викликає функцію swapCallback, передаючи туди обчислену кількість потрібних токенів, а ти у колбеку переводиш ці токени. Це дозволяє виконати всю логіку обміну в одному виклику без розбиття на кілька кроків або складних змінних для безпеки. Простими словами — А викликає Б, а Б у свою чергу викликає А, утворюючи замкнене коло.
Метод оцінки обміну теж досить хитрий — використовує виключення для передачі інформації.
Оскільки при оцінці обміну фактично не відбувається обмін токенами, виникає помилка. У Uniswap у колбеку викидається спеціальна помилка, і за допомогою try-catch її перехоплюють, аналізуючи повідомлення про помилку. Це виглядає трохи грубо, але дуже зручно — не потрібно додатково змінювати метод swap для реалізації оцінки.
Рішення щодо точності обчислень теж варто вивчити.
При обчисленні обміну токенів, якщо просто ділити, втрачається точність. Uniswap робить так: спочатку зсуває число вліво на 96 біт (еквівалент множення на 2^96), потім ділить, і в процесі знову ділить на 2^96, щоб повернути масштаб. Це дозволяє зберегти точність у межах uint256 і уникнути переповнення. У коді це реалізовано через змінні sqrtRatioAX96 і sqrtRatioBX96 — виглядає складно, але логіка зрозуміла.
Ще один цікавий момент — спосіб обчислення доходу від комісій.
Замість того, щоб кожного разу при обміні оновлювати окремі записи для кожного LP і витрачати багато газу, зберігають загальну суму комісій і частки, які мають отримати різні LP. При знятті доходу кожен LP просто множить свою кількість ліквідності на історичний рівень комісій на акцію — аналогічно тому, як акціонери отримують дивіденди пропорційно своїй частці. Такий підхід широко застосовується у багатьох проектах.
Не всі дані потрібно зберігати на ланцюгу — це теж важливо.
Список пулів, базова інформація — цілком можна зберігати у традиційних базах даних і періодично синхронізувати з блокчейном, не викликаючи RPC у реальному часі. Багато сервісів блокчейну вже пропонують високорівневі API для швидкого і дешевшого доступу до даних — це той самий принцип.
І нарешті, організація коду.
Зазвичай складні проекти розбивають контракти на кілька частин для зручності підтримки, і Uniswap теж використовує таку ієрархію. Також важливо використовувати стандартні контракти, наприклад, OpenZeppelin ERC721 для управління позиціями — це підвищує швидкість розробки і якість коду.
Чесно кажучи, читати статті — добре, але краще самому зробити. Реалізуючи просту децентралізовану біржу, ти по-справжньому зрозумієш, чому Uniswap так задуманий. Курси типу WTF-DApp базуються саме на цьому підході — крок за кроком допомагають створити практичний проект за уроками Uniswap, що дуже корисно для розвитку навичок контрактної розробки.