NexForge

Как устроен стейкинг-контракт на 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Компиляция, тесты, деплой
OpenZeppelinStakingRewards, ERC20, ReentrancyGuard, Ownable
Ethers.js / viemFrontend интеграция
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 review1–2 нед.
Automated (Slither, Mythril)$0–5001–3 дня
External audit ( boutique )$5–15k2–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.