Розроблення L3/appchain на базі OP Stack
Запуск власного appchain перестав бути прерогативою крупних протоколів з $10M+ бюджетом. OP Stack — модульний фреймворк, з якого зібрані Optimism, Base, Zora, Mode — дозволяє поднути EVM-сумісний L2 за дні, не місяці. L3 (appchain поверх L2) — це наступний крок: суверенний блокчейн з кастомним gas token, приватними транзакціями, специфічними precompiles, що працює поверх Base або OP Mainnet замість Ethereum L1.
Коли потрібен власний appchain
Запуск appchain виправданий якщо у вас принаймні два з наступних вимог:
Продуктивність. Shared L2 (Arbitrum, Base) має конкуренцію за блок-спейс — в пікові моменти gas растає. На власній цепочці весь throughput належить вашому застосунку.
Кастомний gas token. На shared L2 комісії платяться в ETH. На appchain можна зробити gas token — native token вашого протоколу. Економіка токена радикально змінюється: кожна транзакція спалює/захоплює value для держателів.
Приватність транзакцій. На публічних L2 всі транзакції видні. Для gaming (hidden moves), фінансових застосунків з корпоративними даними — потрібна ізоляція.
Кастомна логіка консенсусу. Permissioned sequencer з KYC, або fully decentralized sequencer set для censorship resistance.
Ні якщо: у вас < 100K транзакцій/день, немає команди для операційної підтримки ноди, немає ліквідності для bridge.
Архітектура OP Stack
OP Stack побудований на принципі modularity. Компоненти можуть замінюватися незалежно:
L1 (Ethereum / Base / OP Mainnet)
↑ settlements, DA
[OptimismPortal Contract] ← bridge L1↔L2
[L2OutputOracle Contract] ← state roots
↑
L2 / L3 Chain
├─ op-node (consensus client) ← derives chain from L1 data
├─ op-geth (execution client) ← EVM, state, mempool
└─ op-batcher ← submits transaction batches to L1
└─ op-proposer ← submits state roots to L1
op-node — "consensus client" L2. Читає дані з L1 (або батьківського L2), застосовує derivation rules, синхронізує op-geth через Engine API. Форк Ethereum consensus client під OP Stack.
op-geth — форк go-ethereum з мінімальними змінами: убрані proof-of-work, додано deposit transaction type (L1→L2 bridge), кастомні precompiles.
op-batcher — бере транзакції з L2 mempool, упаковує в batches, публікує в L1 як calldata або EIP-4844 blobs. Ключовий компонент для cost: EIP-4844 blobs в ~10x дешевше calldata.
Настройка кастомного L3
Крок 1: Розгортання контрактів на батьківській цепочці
git clone https://github.com/ethereum-optimism/optimism
cd packages/contracts-bedrock
# Конфігурація цепочки
cat > deploy-config/my-l3.json << EOF
{
"l1ChainID": 8453, // Base (батьківський L2)
"l2ChainID": 12345678, // наш L3
"l2BlockTime": 2,
"maxSequencerDrift": 600,
"sequencerWindowSize": 3600,
"channelTimeout": 300,
"p2pSequencerAddress": "0x...",
"batchInboxAddress": "0x...",
"batchSenderAddress": "0x...",
"l2OutputOracleSubmissionInterval": 120,
"l2OutputOracleStartingBlockNumber": 0,
"l2OutputOracleStartingTimestamp": 1700000000,
"l2OutputOracleProposer": "0x...",
"l2OutputOracleChallenger": "0x...",
"finalizationPeriodSeconds": 604800,
"proxyAdminOwner": "0x...", // multisig
"baseFeeVaultRecipient": "0x...",
"l1FeeVaultRecipient": "0x...",
"sequencerFeeVaultRecipient": "0x...",
"governanceTokenName": "MyApp Token",
"governanceTokenSymbol": "MYAPP",
"governanceTokenOwner": "0x..."
}
EOF
forge script scripts/Deploy.s.sol --rpc-url $BASE_RPC_URL --broadcast
Крок 2: Кастомний gas token
OP Stack підтримує Custom Gas Token з OP Stack Fjord. Конфігурація в genesis:
{
"customGasToken": {
"enabled": true,
"l1Address": "0x...MyToken на Base",
"l2Address": "0x4200000000000000000000000000000000000023"
}
}
Native L3 токен = ваш ERC-20 з батьківської мережі. Gas fees у транзакціях платяться ним. Важна нюанс: токен повинен бути стандартним ERC-20 без transfer fees (no-fee-on-transfer), інакше bridge ломається.
Крок 3: Запуск нод
# docker-compose для L3 секвенсера
services:
op-geth:
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-geth:latest
volumes:
- ./data/geth:/data
- ./genesis.json:/genesis.json
command: >
--datadir=/data
--networkid=12345678
--http --http.addr=0.0.0.0 --http.port=8545
--http.api=web3,debug,eth,txpool,net,engine
--ws --ws.addr=0.0.0.0 --ws.port=8546
--authrpc.addr=0.0.0.0 --authrpc.port=8551
--authrpc.jwtsecret=/data/jwt.txt
--syncmode=full
--gcmode=archive # потрібен для indexer
--override.fjord=1700000000
op-node:
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:latest
depends_on:
- op-geth
command: >
op-node
--l1=$BASE_WS_RPC
--l1.beacon=$BASE_BEACON_URL
--l2=http://op-geth:8551
--l2.jwt-secret=/data/jwt.txt
--rollup.config=/rollup.json
--p2p.sequencer.key=$SEQUENCER_PRIVATE_KEY
--sequencer.enabled
--sequencer.l1-confs=4
--rpc.addr=0.0.0.0 --rpc.port=9545
Data Availability: вибір DA шару
За замовчанням OP Stack публікує дані на L1 (Ethereum або Base). Це дорого та створює залежність. Альтернативи:
EIP-4844 Blobs (Dencun). Вже вбудовано в OP Stack. Blobs дешевше calldata в ~5-10x, але зберігаються тільки ~18 днів (pruning). Достатньо для fraud proofs (7-денне вікно).
Celestia DA. OP Stack + Celestia через op-plasma або AltDA mode. Дані публікуються в Celestia (~$0.001 за KB vs ~$0.01+ на Ethereum), L1 зберігає тільки commitment. Режим: op-batcher → Celestia, op-node читає з Celestia. Зниження DA costs в 50-100x.
# Запуск op-node з Celestia DA
op-node \
--altda.enabled=true \
--altda.da-server=http://celestia-da-server:3100 \
--altda.da-service=true \
...
EigenDA. Аналогічно Celestia, але через restaking на Ethereum. Молодше рішення, але з сильнішими економічними гарантіями безпеки.
Avail DA. Ще одна DA-спеціалізована мережа, популярна в Polygon екосистемі.
Кастомні precompiles
Precompiles — це вбудовані функції на рівні EVM, виконуються без bytecode (C++ у geth). Стандартні: ecrecover (0x01), SHA256 (0x02), BN254 pairing (0x08) та ін.
У op-geth можна додати кастомні precompiles для специфічних операцій: ZK верифікація, кастомні крипто-примітиви, швидкий доступ до L1 state:
// У op-geth: реєстрація кастомного precompile
var customPrecompiles = map[common.Address]vm.PrecompiledContract{
common.HexToAddress("0x0000...1234"): &MyCustomPrecompile{},
}
type MyCustomPrecompile struct{}
func (c *MyCustomPrecompile) RequiredGas(input []byte) uint64 {
return 1000 // фіксований gas cost
}
func (c *MyCustomPrecompile) Run(input []byte) ([]byte, error) {
// кастомна логіка: наприклад верифікація Groth16 proof
return verifyGroth16Proof(input)
}
Практичні застосунки: batch BLS signature verification для oracle networks, efficient Poseidon hashing для ZK applications, VRF verification.
Bridging та ліквідність
Стандартний OP Stack bridge — native, через OptimismPortal. Deposit (L2→L3): ~15 хвилин. Withdrawal (L3→L2): 7 днів (fraud proof window). 7-денне очікування неприйнятне для користувачів.
Рішення: fast bridge через liquidity providers. Протоколи типу Across, Hop, Stargate забезпечують "швидкі" withdrawals: LP fronts кошти одразу, отримує кошти з L3 після 7 днів + комісію за ризик. Інтеграція через Across Protocol SDK:
import { AcrossClient } from '@across-protocol/sdk';
const client = AcrossClient.create({ chains: [myL3Chain, base] });
const quote = await client.getQuote({
route: { originChainId: myL3Chain.id, destinationChainId: base.id },
inputToken: USDC_ON_L3,
outputToken: USDC_ON_BASE,
inputAmount: parseUnits('1000', 6),
});
// Виконуємо швидкий вивід (секунди, не 7 днів)
await client.executeQuote({ quote, walletClient });
Sequencer: централізований vs децентралізований
Centralized sequencer (стандарт для більшості appchain): один оператор впорядковує транзакції. Ризики: downtime (якщо sequencer упав — цепочка не рухається), censorship. Мітигація: force inclusion через L1 Portal контракт (транзакція включається примусово після 12+ годин якщо sequencer цензурує).
Decentralized sequencer через OP Stack + MEVA або через Espresso Systems Shared Sequencer. Складніше, потрібен leader election протокол. Для production appchain з $1M+ TVL варто розглядати.
Операційна інфраструктура
Мінімальна production setup:
| Нода | Назначение | Вимоги |
|---|---|---|
| Sequencer | Обробляє транзакції | 32GB RAM, 500GB NVMe SSD, надійний uptime |
| op-batcher | Публікує батчи на L1 | 8GB RAM, стабільний L1 RPC |
| op-proposer | Публікує state roots | 8GB RAM |
| RPC нода | Публічний RPC для користувачів | 32GB RAM, 1TB+ SSD |
| Archive нода | Історичні дані для індексації | 64GB RAM, 2TB+ SSD |
Моніторинг: block production (алерт якщо немає нового блоку > 30 сек), batcher lag (непосубмітовані батчи), proposer status (пропущені proposals), L1 gas price (batcher може застрягти при екстремальному L1 gas).
Терміни та етапи
Фаза 1 — Testnet (3-4 тижні). Deploy контрактів на тестовій мережі, запуск нод, базовий bridge UI, тестування кастомного gas token.
Фаза 2 — Mainnet prep (2-3 тижні). Security review контрактів, настройка multisig для admin ключів, моніторинг, runbooks для операторів.
Фаза 3 — Mainnet launch (1 тиждень). Deploy, міграція ліквідності, публічний анонс, 24/7 моніторинг перші два тижні.
Ongoing: оновлення OP Stack (регулярні hardfork'и Optimism Superchain), моніторинг, підтримка bridge ліквідності.
Загальна вартість інфраструктури: ~$500-2000/місяць для нод + L1 DA costs ($500-5000/місяць залежно від активності).







