Как устроен стейкинг-контракт на Solidity: архитектура, безопасность, аудит
Разработка стейкинг-контракта на Solidity для Ethereum, BSC, Polygon: пулы, награды, lock-up, reentrancy, flash loan атаки. OpenZeppelin, Foundry, аудит смарт-контрактов перед mainnet.
Стейкинг-контракт — ключевой элемент DeFi, GameFi и tokenomics многих Web3-проектов. Он позволяет держателям токенов блокировать средства в staking pool и получать награды — проценты, governance-токены или NFT. Разработка стейкинг-платформы на Solidity для EVM-сетей (Ethereum, BSC, Polygon, Arbitrum, Base) требует глубокого понимания экономики, математики наград и безопасности смарт-контрактов.
В этой статье разберём типовую архитектуру стейкинг-контракта на Solidity, механизмы начисления наград, угрозы (reentrancy, flash loan), стек разработки и обязательный аудит смарт-контракта перед запуском в mainnet.
Что такое стейкинг в DeFi
Staking (стейкинг) — блокировка токенов в смарт-контракте в обмен на награды. Цели для проекта:
- Удержание токенов — снижение sell pressure, долгосрочные холдеры
- Governance — голосование пропорционально застейканной доле
- Liquidity mining — стимул держать LP-токены
- GameFi — стейкинг in-game assets, NFT
Для пользователя стейкинг — пассивный доход. Для разработчика — баланс между привлекательной APY и устойчивостью токеномики.
Базовые компоненты стейкинг-контракта
1. Staking pool — хранение и учёт долей
Контракт принимает ERC-20 токены (или native ETH через wrapper) и ведёт учёт:
mapping(address => uint256) public stakedBalance;
mapping(address => uint256) public rewardDebt;
uint256 public totalStaked;
IERC20 public stakingToken;
Функции stake() и unstake() изменяют балансы. Перед изменением всегда начисляйте pending rewards — иначе пользователь потеряет награды.
2. Механизм наград: reward per token stored
Самый распространённый паттерн в разработке DeFi-контрактов — модель из OpenZeppelin StakingRewards:
rewardRate— токенов награды в секундуrewardPerTokenStored— накопленная награда на 1 застейканный токенuserRewardPerTokenPaid[account]— snapshot при последнем действии пользователяrewards[account]— накопленные, но не claimed награды
Формула earned:
earned = balance * (rewardPerTokenStored - userRewardPerTokenPaid) / 1e18 + rewards[account]
Пользователь вызывает claim() или getReward() для получения reward token.
3. Lock-up period и vesting
mapping(address => uint256) public unlockTime;
mapping(address => uint256) public lockAmount;
Lock-up блокирует вывод на N дней — защита от pump-and-dump после листинга. Варианты:
- Fixed lock — все стейки на 30/90/180 дней
- Tiered APY — чем дольше lock, тем выше награда
- Early withdrawal penalty — штраф 5–20% при досрочном выводе
Trade-off: жёсткий lock снижает UX, мягкий — слабее удержание.
4. Multi-pool architecture
Крупные стейкинг-платформы используют MasterChef-паттерн (как PancakeSwap):
- Несколько pool с разными staking/reward токенами
allocPoint— распределение reward rate между пулами- Один контракт управляет всеми pool
Подходит для экосистем с несколькими токенами или LP-парами.
Стек разработки стейкинг-контракта
| Инструмент | Назначение |
|---|---|
| Solidity 0.8.x | Язык смарт-контрактов EVM |
| Hardhat / Foundry | Компиляция, тесты, деплой |
| OpenZeppelin | StakingRewards, ERC20, ReentrancyGuard, Ownable |
| Ethers.js / viem | Frontend интеграция |
| Etherscan / BscScan | Верификация исходников |
| Tenderly | Симуляция транзакций, мониторинг |
Foundry предпочитают за скорость тестов и fuzzing — критично для математики наград.
Угрозы безопасности стейкинг-контракта
1. Reentrancy
Классическая атака: злоумышленник вызывает unstake() или claim(), и в fallback снова входит в контракт до обновления баланса.
Защита:
- Паттерн Checks-Effects-Interactions
- ReentrancyGuard от OpenZeppelin
- Pull over push — пользователь сам забирает награды
2. Flash loan attacks
Flash loan позволяет занять миллионы токенов на одну транзакцию. Если награды считаются по мгновенному snapshot баланса — атакующий stake → claim → unstake в одном блоке.
Защита:
- Награды по time-weighted balance, не мгновенному
- Минимальный период между stake и claim
- Audit reward math с fuzzing
3. Centralization risk
Owner может:
- Изменить rewardRate
- Pause контракт
- Withdraw stuck tokens
- Upgrade через proxy
Зaщита:
- Timelock (24–48h) на критичные функции
- Multisig (Gnosis Safe) вместо EOA
- Renounce ownership после стабилизации (осторожно — необратимо)
- Прозрачная документация admin functions
4. Ошибки в математике
- Overflow/underflow (Solidity 0.8+ встроенная защита, но beware casting)
- Rounding — округление в пользу протокола vs пользователя
- Precision loss при делении — используйте 1e18 multiplier
- Dust attacks — минимальный stake amount
5. Token quirks
- Fee-on-transfer tokens — баланс ≠ transfer amount
- Rebasing tokens — баланс меняется без transfer
- ERC777 hooks — reentrancy через tokensReceived
Рекомендация: whitelist только стандартных ERC-20 без fee.
Тестирование перед mainnet
Unit-тесты (Foundry/Hardhat)
- stake / unstake / claim — happy path
- Multiple users, proportional rewards
- Lock-up enforcement
- Zero amount, max amount edge cases
- Only owner functions
Fuzzing
Foundry forge test --fuzz-runs 10000 — случайные amounts, timestamps, порядок операций. Выявляет баги в reward math.
Integration tests
- Fork mainnet — тест с реальным ERC-20
- Gas profiling — оптимизация для пользователей
Testnet deploy
- Sepolia / BSC Testnet / Polygon Amoy
- Public testnet campaign с bug bounty
Аудит смарт-контракта
Аудит стейкинг-контракта — обязателен перед mainnet с реальными средствами.
| Уровень | Стоимость | Срок |
|---|---|---|
| Internal review | — | 1–2 нед. |
| Automated (Slither, Mythril) | $0–500 | 1–3 дня |
| External audit ( boutique ) | $5–15k | 2–4 нед. |
| Top firm (Trail of Bits, OpenZeppelin) | $30–100k+ | 4–8 нед. |
После аудита: fix findings → re-audit critical → bug bounty (Immunefi) post-launch.
Gas optimization
- Pack storage variables (uint128 + uint128 в одном slot)
- Cache storage reads в memory
- Batch operations (stake + claim в одной tx через multicall)
- L2 deploy (Arbitrum, Base, Polygon) — газ в 10–100x ниже Ethereum mainnet
Frontend стейкинг-платформы
Типовой стек разработки стейкинг-платформы:
- Next.js — dashboard
- wagmi + viem — wallet connect (MetaMask, WalletConnect)
- The Graph / subgraph — индексация events для истории
- Real-time APY, TVL, user balance
Когда заказывать разработку стейкинг-контракта
- Запуск токена с utility через staking
- DeFi protocol — liquidity mining, yield farming
- GameFi — stake NFT / in-game tokens
- DAO — stake для governance weight
NexForge разрабатывает стейкинг-контракты на Solidity для Ethereum, BSC, Polygon, TON (Tact/FunC). Стек: Foundry, OpenZeppelin, аудит, frontend dashboard. Опишите токеномику — подготовим архитектуру и смету.
Итог
Стейкинг-контракт — баланс экономики (APY, lock-up) и безопасности (reentrancy, flash loans, centralization). Начните с проверенных шаблонов OpenZeppelin, адаптируйте под tokenomics, покройте fuzzing-тестами и пройдите аудит смарт-контракта перед mainnet.