DeFi экосистема
Зачем это блокчейну?
В предыдущих модулях мы научились писать смарт-контракты на Solidity, работать с ERC-20 токенами и развертывать их на Ethereum. Но что делают самые важные контракты в экосистеме? Они создают параллельную финансовую систему — DeFi (Decentralized Finance).
В 2024 году в DeFi-протоколах заблокировано более $100 миллиардов. Биржи без посредников, кредиты без банков, стейблкоины без центральных эмитентов. Все это работает на смарт-контрактах, которые мы уже умеем писать.
В этом модуле мы разберем математику и механизмы, стоящие за каждым типом DeFi-протокола. Начнем с обзора экосистемы, а затем углубимся в формулы AMM, имплементацию Uniswap, механизмы кредитования и оракулы.
7 категорий DeFi-протоколов
DeFi экосистема состоит из семи основных категорий. Каждая решает конкретную финансовую задачу без традиционных посредников:
1. DEXes (Decentralized Exchanges)
Обмен токенов через пулы ликвидности. Вместо ордер-бука (как на Binance) используют математические формулы — Automated Market Makers (AMM). Любой пользователь может стать провайдером ликвидности и получать комиссии.
Ключевые протоколы: Uniswap (xy=k), Curve (оптимизирован для стейблкоинов), Balancer (мульти-токенные пулы).
2. Lending (Кредитование)
Депозит токенов для получения процентов или использование залога для займа. Процентные ставки устанавливаются алгоритмически на основе спроса и предложения — никакой кредитный комитет не принимает решения.
Ключевые протоколы: Aave (flash loans, multi-chain), Compound (пионер алгоритмических ставок), Sky/MakerDAO (эмитент DAI).
3. Stablecoins (Стейблкоины)
Токены с привязкой к доллару. Три типа:
- Фиатные: USDC (Circle), USDT (Tether) — обеспечены долларами на банковском счете
- Крипто-обеспеченные: DAI/USDS (MakerDAO/Sky) — залог в ETH, WBTC, других токенах
- Алгоритмические: привязка через механизмы смарт-контрактов (высокий риск)
4. Derivatives (Деривативы)
Торговля с кредитным плечом (до 50x) без центрального посредника. Бессрочные фьючерсы (perpetuals) — самый популярный инструмент: нет срока экспирации, funding rate привязывает цену к спотовой.
Ключевые протоколы: dYdX, GMX (Arbitrum), Hyperliquid.
5. Oracles (Оракулы)
Смарт-контракты не могут получить данные извне блокчейна. Оракулы доставляют цены активов, погоду, результаты событий. Без оракулов невозможны ликвидации в lending, расчет деривативов, привязка стейблкоинов.
Ключевые протоколы: Chainlink (крупнейшая сеть, тысячи узлов), Pyth (низкая латентность), UMA (оптимистичные оракулы).
6. Aggregators (Агрегаторы)
Разбивают крупные ордера по нескольким DEX для получения лучшей цены. Алгоритмы маршрутизации находят оптимальный путь обмена, минимизируя проскальзывание.
Ключевые протоколы: 1inch (крупнейший), Paraswap, CoW Swap (batch auctions).
7. Yield (Оптимизация доходности)
Автоматически перемещают капитал между протоколами для максимизации доходности. Yearn находит лучшие ставки. Lido предлагает ликвидный стейкинг ETH (stETH). Convex оптимизирует доходность на Curve.
Ключевые протоколы: Yearn, Convex, Lido (liquid staking).
TVL: метрика капитала в DeFi
Total Value Locked (TVL) — суммарная стоимость активов, заблокированных в смарт-контрактах протокола. Это основная метрика для оценки масштаба DeFi-протокола.
Что показывает TVL?
- Доверие: Чем больше TVL, тем больше пользователей доверяют протоколу свои средства
- Ликвидность: Высокий TVL = низкое проскальзывание при обмене
- Зрелость: Протоколы с многолетним TVL прошли проверку временем
Ограничения TVL
- Double-counting: Один и тот же актив может учитываться в нескольких протоколах (например, stETH из Lido депонирован в Aave)
- Leverage: TVL может быть раздут заемным капиталом
- Не учитывает доходность: Высокий TVL не означает высокую прибыльность для LP
Ключевые концепции DeFi
Permissionless (Без разрешений)
Любой человек с криптокошельком может взаимодействовать с DeFi-протоколом. Нет KYC, нет заявок, нет одобрений. Смарт-контракт обрабатывает транзакцию одинаково для всех:
// Никакой проверки личности -- только адрес и подпись
function swap(address tokenIn, uint amountIn, uint amountOutMin) external {
// Любой msg.sender может вызвать
}
Non-custodial (Некастодиальность)
Пользователь контролирует свои средства. Средства хранятся в смарт-контракте, а не на балансе компании. Ключевое отличие от CEX:
- CEX (Binance): Вы доверяете биржи хранить ваши монеты. “Not your keys, not your coins”
- DeFi (Uniswap): Средства в аудированном смарт-контракте. Вы взаимодействуете напрямую со своим кошельком
Composable (Композируемость)
“DeFi Legos” — протоколы комбинируются друг с другом. Пример цепочки:
- Депозит ETH в Lido → получаете stETH
- Депозит stETH в Aave как залог → берете займ в DAI
- Депозит DAI в Yearn → получаете автоматически оптимизированный доход
Каждый шаг — взаимодействие с отдельным смарт-контрактом. Композируемость возможна благодаря стандартам (ERC-20) и открытому коду.
Transparent (Прозрачность)
Все транзакции на блокчейне. Каждый может:
- Прочитать исходный код смарт-контракта
- Проверить состояние пулов ликвидности
- Увидеть все свопы, кредиты и ликвидации
Smart Contract Risk (Риск кода)
Код — это контрагент. В DeFi нет службы поддержки и кнопки “отменить”:
- Баги = потеря средств (Harvest Finance — 130M)
- Аудит снижает, но не устраняет риск
- Timelock и multisig ограничивают damage от компрометации
AMM vs Order Book
Два способа организовать обмен токенов. Традиционные биржи (CEX) используют ордер-бук. DeFi использует AMM:
Ключевой insight: AMM позволяет создать ликвидный рынок для ЛЮБОГО токена без маркет-мейкеров. На CEX для нового токена нужен листинг и маркет-мейкер. На Uniswap любой может создать пул за одну транзакцию.
Десятичные знаки токенов
Это критически важная деталь для DeFi-разработки. Разные токены используют разное количество десятичных знаков. Путаница приводит к катастрофическим ошибкам — отправка 1 USDC вместо 1,000,000 USDC или наоборот.
| Token | Decimals | 1.0 в raw | viem / ethers.js |
|---|---|---|---|
| ETH / WETH | 18 | 1000000000000000000 | parseEther("1") |
| DAI | 18 | 1000000000000000000 | parseUnits("1", 18) |
| USDC | 6 | 1000000 | parseUnits("1", 6) |
| USDT | 6 | 1000000 | parseUnits("1", 6) |
| WBTC | 8 | 100000000 | parseUnits("1", 8) |
Предупреждение: Смешивание decimals без конвертации вызывает катастрофические ошибки. Всегда проверяйте
token.decimals()перед вычислениями. USDC имеет 6 decimals, а ETH — 18. Разница в 10^12 раз!
// ПРАВИЛЬНО: учитываем decimals каждого токена
import { parseUnits, formatUnits } from 'viem';
const usdcAmount = parseUnits("100", 6); // 100_000_000n (100 USDC)
const ethAmount = parseUnits("0.05", 18); // 50_000_000_000_000_000n (0.05 ETH)
const wbtcAmount = parseUnits("0.001", 8); // 100_000n (0.001 WBTC)
// НЕПРАВИЛЬНО: использование parseEther для USDC
// const wrong = parseEther("100"); // Это 100 * 10^18 -- КАТАСТРОФА для USDC
Паттерн Approve + Interact
Для взаимодействия с любым DeFi-протоколом необходим двухшаговый паттерн (из ERC-20, урок ETH-08):
- Approve: Дать протоколу разрешение тратить ваши токены
- Interact: Вызвать функцию протокола (swap, deposit, borrow)
import { getContract, parseUnits } from 'viem';
// Шаг 1: Approve -- разрешить Uniswap Router тратить USDC
const usdc = getContract({ address: USDC_ADDRESS, abi: erc20Abi, client: walletClient });
await usdc.write.approve([UNISWAP_ROUTER, parseUnits("1000", 6)]);
// Шаг 2: Swap -- вызвать функцию обмена
const router = getContract({ address: UNISWAP_ROUTER, abi: routerAbi, client: walletClient });
await router.write.swapExactTokensForTokens([
parseUnits("100", 6), // amountIn: 100 USDC
parseUnits("0.04", 18), // amountOutMin: минимум 0.04 ETH
[USDC_ADDRESS, WETH_ADDRESS], // path
myAddress, // to
BigInt(Math.floor(Date.now() / 1000) + 1800), // deadline: 30 минут
]);
Без approve протокол не сможет забрать ваши токены — это защитный механизм ERC-20. Каждый DeFi-протокол требует approve перед первым взаимодействием.
Структура модуля DeFi
Этот модуль состоит из следующих уроков:
| # | Тема | Содержание |
|---|---|---|
| 1 | DeFi экосистема | Категории, TVL, ключевые концепции (этот урок) |
| 2 | AMM: xy = k | Формула постоянного произведения, расчет свопов, комиссии |
| 3 | Uniswap V2 | Имплементация, LP-токены, flash swaps, fork-тестирование |
| 4 | Uniswap V3/V4 | Концентрированная ликвидность, hooks, singleton |
| 5 | Impermanent Loss | Математика IL, стратегии минимизации |
| 6 | Lending: Aave | Модель кредитования, процентные ставки, ликвидации |
| 7 | Flash Loans | Атомарные займы, арбитраж, fork-тестирование |
| 8 | Chainlink Oracles | Price feeds, VRF, автоматизация |
| 9 | Oracle Design | Oracle problem, TWAP, манипуляции |
| 10 | Stablecoins | Механизмы привязки, CDP, алгоритмические |
| 11 | Derivatives | Perpetuals, funding rate, синтетические активы |
| 12 | Tokenomics | Governance, ve-модель, token design |
Связь с предыдущими модулями
DeFi опирается на все, что мы изучили ранее:
- ERC-20 (ETH-08): Все DeFi-протоколы работают с ERC-20 токенами. Approve/transferFrom — фундаментальный паттерн взаимодействия
- Solidity (ETH-06/07): DeFi-контракты написаны на Solidity. Паттерны из ETH-07 (ReentrancyGuard, AccessControl) критичны для безопасности
- Gas (ETH-05): DeFi-транзакции могут быть дорогими. Swap на Uniswap V3 стоит ~150,000 gas. Оптимизация газа — реальная экономия
- EVM (ETH-04): Понимание storage layout помогает при fork-тестировании (slot manipulation)
Практика: DeFi Fork Lab
В этом модуле мы будем тестировать DeFi-протоколы на форке мейннета — копии реального состояния Ethereum с настоящими балансами, пулами и контрактами.
Настройка
MAINNET_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY_HERE
- Запустите форк-ноду:
# Docker Compose (Anvil fork)
docker compose --profile fork up -d
# Или через Hardhat (EDR fork)
npx hardhat test --network mainnetFork
- Проверьте работу форка:
cast chain-id --rpc-url http://localhost:8546
# Должен вернуть 1 (Ethereum mainnet)
Fork позволяет тестировать взаимодействие с реальными контрактами Uniswap, Aave, Chainlink без реальных средств. Мы будем активно использовать это в следующих уроках.
Finished the lesson?
Mark it as complete to track your progress