Разработка Layer 2 решения
"Нам нужен свой L2" — фраза, которую я слышу всё чаще. Иногда это обоснованно: проект с тысячами транзакций в секунду, который не хочет платить Ethereum gas и не хочет зависеть от чужой инфраструктуры. Чаще — это избыточно, и достаточно существующего L2. Прежде чем строить собственный L2, нужно честно ответить: нужен вам application-specific rollup или вы просто хотите дёшевые транзакции? Во втором случае — деплой на Arbitrum или OP Stack займёт дни, а не месяцы.
Типология L2: что именно строим
Optimistic Rollup
Транзакции выполняются off-chain, результат (state root) публикуется в L1. Предполагается, что всё честно — если кто-то нашёл мошенничество, он подаёт fraud proof в течение challenge window (7 дней для Arbitrum, 7 дней для OP Stack).
Плюсы: EVM-эквивалентность или близость к ней, зрелые фреймворки (OP Stack, Arbitrum Orbit). Минусы: 7-дневный withdrawal period для вывода на L1. Нативно решается через liquidity providers (мосты типа Hop, Across).
Готовые фреймворки:
- OP Stack — используется Base, Mode, Zora, десятки других. Открытый код, Superchain концепция от Optimism.
- Arbitrum Orbit — для создания L3 поверх Arbitrum One/Nova.
ZK Rollup
Каждый батч транзакций сопровождается zero-knowledge proof — математическим доказательством корректности. L1 верифицирует proof, а не выполняет транзакции заново.
Плюсы: Мгновенный withdrawal finality (нет challenge window), криптографические гарантии вместо экономических. Минусы: Complexity — ZK proof generation требует специализированных схем. Не все EVM opcode'ы эффективно доказуемы.
Готовые фреймворки:
- Polygon CDK (Chain Development Kit) — для zkEVM-compatible цепей
- zkSync ZK Stack — на базе zkSync Era infrastructure
- Scroll SDK — если нужна максимальная EVM-эквивалентность
Validium
Как ZK Rollup, но данные хранятся off-chain (Data Availability Committee или IPFS), не в L1. Дешевле, но слабее гарантии доступности данных.
Application-specific chain (не rollup)
Иногда нужен не L2 как rollup, а отдельная цепь с собственным консенсусом. Cosmos SDK для этого — стандартный выбор: Inter-Blockchain Communication (IBC) для межсетевых переводов, полный контроль над governance и gas token.
Разработка на OP Stack: детальный разбор
OP Stack — наиболее зрелый выбор для EVM-совместимого Optimistic Rollup. Рассмотрим ключевые компоненты.
Компоненты системы
L1 (Ethereum)
├── OptimismPortal.sol — депозиты L1→L2, withdrawals L2→L1
├── L2OutputOracle.sol — хранит L2 state roots
├── DisputeGameFactory.sol — fault proof games (Cannon)
└── SystemConfig.sol — параметры цепи
L2 (OP Stack chain)
├── op-node — consensus (читает L1, управляет sequencer)
├── op-geth — execution (форк Geth)
├── op-batcher — публикует L2 транзакции в L1 calldata/blobs
└── op-proposer — публикует L2 output roots в L1
Деплой OP Stack цепи
# Клонирование Optimism monorepo
git clone https://github.com/ethereum-optimism/optimism.git
cd optimism
git checkout op-contracts/v1.6.0
# Установка зависимостей
pnpm install
make op-node op-batcher op-proposer
Конфигурация цепи через deploy-config.json:
{
"l1ChainID": 1,
"l2ChainID": 42069,
"l2BlockTime": 2,
"l1BlockTime": 12,
"maxSequencerDrift": 600,
"sequencerWindowSize": 3600,
"channelTimeout": 300,
"p2pSequencerAddress": "0x...",
"batchInboxAddress": "0xff00000000000000000000000000000000042069",
"batchSenderAddress": "0x...",
"l2OutputOracleSubmissionInterval": 120,
"l2OutputOracleStartingBlockNumber": 0,
"l2OutputOracleStartingTimestamp": ...,
"l2OutputOracleProposer": "0x...",
"l2OutputOracleChallenger": "0x...",
"finalizationPeriodSeconds": 604800,
"proxyAdminOwner": "0x...",
"baseFeeVaultRecipient": "0x...",
"l1FeeVaultRecipient": "0x...",
"sequencerFeeVaultRecipient": "0x...",
"enableGovernance": false,
"governanceTokenSymbol": "OP",
"governanceTokenName": "Optimism",
"eip1559Denominator": 50,
"eip1559Elasticity": 6,
"l2GenesisBlockGasLimit": "0x2faf080",
"l2GenesisBlockBaseFeePerGas": "0x3B9ACA00"
}
Деплой L1 контрактов:
cd packages/contracts-bedrock
forge script scripts/deploy/Deploy.s.sol:Deploy \
--rpc-url $L1_RPC_URL \
--broadcast \
--private-key $DEPLOYER_PRIVATE_KEY \
--slow
Data Availability: calldata vs EIP-4844 blobs
До EIP-4844 (Dencun upgrade, март 2024) L2 публиковал данные в L1 calldata — дорого (~$1–5 за batch). После Dencun — через blobs (EIP-4844): специальный тип данных в блоке с отдельным рынком газа. Blobs удешевляют публикацию данных в ~10–100x.
// op-batcher использует blobs автоматически если L1 их поддерживает
// Конфиг в op-batcher:
--data-availability-type blobs // или 'calldata' для принудительного fallback
--max-channel-duration 1800 // максимум 1800 блоков L2 в одном канале
Для высоконагруженных L2: если blob пространства не хватает (blob gas market перегружен) — настройте fallback на EigenDA или Celestia как внешний DA layer. Это validium-подход, но с лучшими гарантиями чем pure off-chain.
Sequencer: централизация и её последствия
Классический OP Stack имеет единственный sequencer — доверенный, централизованный. Это acknowledge'd tradeoff: удобство в обмен на централизацию.
Для продакшн-проектов — рассмотрите shared sequencer варианты:
- Espresso Systems — decentralized sequencer для OP Stack цепей
- Based rollup — sequencer-free, блоки предлагаются L1 validators напрямую
Или минимально: sequencer за multisig с мониторингом и автоматическим force-include для пользователей, которых sequencer игнорирует.
Мост: стандарт и безопасность
L1StandardBridge и L2StandardBridge — встроенные мосты OP Stack. Для кастомных токенов:
// Кастомный ERC-20 с поддержкой стандартного моста
contract MyL2Token is OptimismMintableERC20 {
constructor(
address _bridge,
address _remoteToken
) OptimismMintableERC20(_bridge, _remoteToken, "MyToken", "MTK") {}
}
Никогда не деплойте кастомный мост без тщательного аудита. Большинство громких взломов в Web3 — именно мосты: Ronin ($625M), Wormhole ($320M), Nomad ($190M). Используйте стандартный мост, добавляйте кастомную логику только когда абсолютно необходимо.
Sequencer economics
L2 сеть зарабатывает:
- L2 gas fees — пользователи платят за исполнение на L2
- L1 data cost — sequencer тратит на публикацию данных в L1
Маржа = L2 fees − L1 publishing cost. EIP-4844 blobs резко снизили L1 cost, что позволяет устанавливать low gas price на L2 и всё равно быть прибыльными.
L2 Transaction Fee = L2 Base Fee × Gas Used + L1 Data Fee
L1 Data Fee = (tx data size × 16) × L1 Base Fee × overhead_scalar
Калькулятор для вашей цепи: l2fees.info — полезная референсная точка.
ZK путь: zkSync ZK Stack
Если выбрали ZK Rollup — ZK Stack от Matter Labs:
# ZK Stack CLI
curl -L https://raw.githubusercontent.com/matter-labs/zksync-era/main/zkstack_cli/zkstackup/install | bash
zkstackup
# Создание новой цепи
zkstack ecosystem create
zkstack chain create --chain-name mychain --chain-id 12345
ZK Stack использует Boojum — proof system на основе PLONK с custom gates. Proof generation занимает минуты и требует GPU для production скоростей (~RTX 4090 или A100).
Реальное время proof generation:
- CPU (32 cores): ~15–30 минут на батч
- RTX 4090: ~2–5 минут
- A100: ~1–2 минуты
Для проекта с частыми транзакциями — GPU prover обязателен.
Временные и финансовые оценки
| Фаза | OP Stack | ZK Stack | Cosmos SDK |
|---|---|---|---|
| Деплой и настройка | 1–2 нед | 2–4 нед | 4–8 нед |
| Bridge + explorer | 1–2 нед | 2–3 нед | 2–4 нед |
| Аудит инфраструктуры | 2–4 нед | 4–8 нед | 4–8 нед |
| Production-ready | 1–2 мес | 2–4 мес | 3–6 мес |
Бюджет на инфраструктуру (monthly):
- L1 gas для sequencer: $500–$5000/мес (зависит от активности)
- RPC провайдеры (L1 и L2): $500–$2000/мес
- Серверы (sequencer, nodes): $500–$3000/мес
- Block explorer (Blockscout self-hosted): $200–$500/мес
Собственный L2 — это не разовая работа, это операционная ответственность. Кто-то должен следить за нодами, обновлять клиенты, мониторить мост и реагировать на инциденты 24/7.







