Разработка системы автоматического деплоя на несколько сетей

Разработка системы автоматического деплоя на несколько сетей Проблема возникает на третьем или четвёртом деплое одного и того же протокола в разные сети: кто-то задеплоил на Arbitrum с другим значением константы, на Base использовалась другая версия OpenZeppelin, адреса прокси не сохранились норм

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1269
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1009

Разработка системы автоматического деплоя на несколько сетей

Проблема возникает на третьем или четвёртом деплое одного и того же протокола в разные сети: кто-то задеплоил на Arbitrum с другим значением константы, на Base использовалась другая версия OpenZeppelin, адреса прокси не сохранились нормально, и теперь непонятно что где задеплоено. Наша команда решает это с помощью multichain auto-deploy system, которая гарантирует воспроизводимость и трекинг деплоев. Мы разрабатываем такие системы под ключ — свяжитесь с нами для предварительной оценки проекта.

Почему CREATE2 — стандарт для multichain деплоя?

Главное требование к мультичейн деплою: одинаковые адреса на всех сетях. Это упрощает пользовательский опыт, документацию и кросс-чейн интеграции. CREATE2 позволяет вычислить адрес контракта до деплоя:

// Формула CREATE2 address = keccak256(0xff ++ deployerAddress ++ salt ++ keccak256(bytecode))[12:] 

Если deployer имеет одинаковый адрес на всех EVM-сетях (через Nick's Factory или собственный deployer через deterministicDeploy), байткод одинаков, salt одинаков — адрес будет одинаков везде. Foundry поддерживает это нативно, и мы активно используем его в проектах. Подробнее о CREATE2 можно прочитать в EIP-1014.

Сравнение методов: CREATE vs CREATE2

Характеристика CREATE CREATE2
Адрес контракта Зависит от nonce деплоера Зависит от salt и байткода
Детерминизм Нет (изменение nonce меняет адрес) Да, если соль и байткод зафиксированы
Возможность предсказать адрес Только после nonce До деплоя
Использование в multichain Адреса различаются Идеально подходит
Газовые затраты Стандартный CREATE (около 32000 газа) CREATE2 (около 32000 + extra за соль)

Система конфигурации сетей

Единый источник истины для всех сетей хранится в deploy.config.ts. Это централизованный файл, который содержит RPC-урлы, адреса деплоера, настройки газа и адреса зависимых контрактов (USDC, WETH). Благодаря этому деплой на новую сеть добавляется одной записью.

export interface NetworkConfig { chainId: number; rpcUrl: string; deployer: string; gasPrice?: bigint; confirmations: number; verifier?: "etherscan" | "blockscout" | "none"; verifierUrl?: string; nativeCurrency: string; contracts: { usdc?: string; weth?: string; uniswapRouter?: string; }; } export const networks: Record<string, NetworkConfig> = { arbitrum: { chainId: 42161, rpcUrl: process.env.ARBITRUM_RPC!, deployer: DEPLOYER_ADDRESS, confirmations: 1, verifier: "etherscan", nativeCurrency: "ETH", contracts: { usdc: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", weth: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", }, }, base: { chainId: 8453, rpcUrl: process.env.BASE_RPC!, deployer: DEPLOYER_ADDRESS, confirmations: 1, verifier: "blockscout", verifierUrl: "https://base.blockscout.com/api", nativeCurrency: "ETH", contracts: { usdc: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", weth: "0x4200000000000000000000000000000000000006", }, }, }; 

Artifacts и state management

После каждого деплоя сохраняем адреса в deployments.json. Этот файл коммитится в репозиторий и служит единственным источником правды. CI/CD обновляет его автоматически.

Деплой скрипт с retry и verification

import { createPublicClient, createWalletClient, http } from "viem"; async function deployWithRetry( network: NetworkConfig, contractName: string, deployFn: () => Promise<`0x${string}`>, maxRetries = 3 ): Promise<`0x${string}`> { for (let attempt = 0; attempt < maxRetries; attempt++) { try { const address = await deployFn(); const client = createPublicClient({ transport: http(network.rpcUrl) }); await client.waitForTransactionReceipt({ hash: address, confirmations: network.confirmations, }); console.log(`✓ ${contractName} on ${network.chainId}: ${address}`); return address; } catch (err) { if (attempt === maxRetries - 1) throw err; console.log(`Retry ${attempt + 1}/${maxRetries}: ${err.message}`); await sleep(2000 * (attempt + 1)); } } throw new Error("unreachable"); } 

Верификация контрактов выполняется сразу после деплоя через Etherscan или Blockscout. Это обязательный шаг для доверия пользователей.

CI/CD pipeline

Автоматический деплой при тегировании релиза с использованием GitHub Actions. Job запускается последовательно для каждой сети, чтобы избежать конфликтов при обновлении deployments.json.

name: Deploy Protocol on: push: tags: - "v*" jobs: deploy: runs-on: ubuntu-latest strategy: matrix: network: [arbitrum, base, optimism] max-parallel: 1 steps: - uses: actions/checkout@v4 - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - name: Run tests run: forge test --fork-url ${{ secrets.MAINNET_RPC }} - name: Deploy to ${{ matrix.network }} env: DEPLOYER_PRIVATE_KEY: ${{ secrets.DEPLOYER_PRIVATE_KEY }} RPC_URL: ${{ secrets[format('{0}_RPC', matrix.network)] }} run: | forge script script/Deploy.s.sol \ --rpc-url $RPC_URL \ --private-key $DEPLOYER_PRIVATE_KEY \ --broadcast \ --verify - name: Update deployments.json run: node scripts/update-deployments.js ${{ matrix.network }} - name: Commit deployments uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore: update deployments for ${{ matrix.network }} @ ${{ github.ref_name }}" file_pattern: deployments.json 

Сравнение: ручной деплой vs автоматический

Параметр Ручной деплой Автоматический деплой
Время на 5 сетей 2–3 дня 1 час
Вероятность ошибки Высокая (константы, адреса) Минимальная (CI/CD)
Верификация По отдельности Автоматически
Трекинг адресов Разрозненные заметки Единый deployments.json

Автоматизация деплоя работает быстрее ручного процесса в 20 раз. Затраты сокращаются на 70%. Время релиза падает с дней до часов. Наша команда имеет 5+ лет опыта в смарт-контрактах и реализовала такие системы для топовых DeFi-протоколов.

Что входит в разработку системы?

  • Проектирование архитектуры деплоя (CREATE2, конфигурация)
  • Написание скриптов деплоя с retry и логированием
  • Интеграция CI/CD (GitHub Actions / GitLab CI)
  • Настройка верификации для Etherscan, Blockscout
  • Генерация и поддержка deployments.json
  • Документация и обучение команды
  • Опционально: мониторинг контрактов через Tenderly

Как мы работаем

  1. Аудит (1-2 дня). Смотрим число сетей, деплоеры, хранение ключей.
  2. Проектирование (2-3 дня). Выбираем стек: Foundry или Hardhat. Рисуем схему CI/CD.
  3. Разработка (5-10 дней). Пишем скрипты деплоя. Настраиваем retry-логику. Делаем конфиги сетей.
  4. Тестирование (2-3 дня). Деплоим на тестнеты. Проверяем адреса и верификацию.
  5. Запуск (1 день). Деплоим на mainnet. Подключаем мониторинг. Передаём документацию.

Типичные ошибки при multichain деплое

  • Хранение приватного ключа деплоера в CI как plain hex — риск компрометации. Используйте AWS KMS или аппаратный кошелек.
  • Различие в байткоде между сетями из-за hardcoded chainId — адреса CREATE2 будут разными. Выносите chainId в runtime-конфигурацию.
  • Отсутствие единого файла конфигурации — приводит к путанице с адресами.

Сроки и стоимость

Разработка системы для EVM-сетей занимает от 1 до 2 недель. Базовая система (3-5 сетей, без мониторинга) — от 3 000 USD. Полный пакет (10+ сетей, CI/CD, мониторинг через Tenderly) — от 8 000 USD. Добавление non-EVM сетей (Solana, TON) требует отдельного toolchain и обговаривается индивидуально. Стоимость рассчитывается под ваш проект — получите консультацию.

Частые вопросы

Нужен ли отдельный деплоер-кошелёк? Да. Мы создаём выделенный deployer с минимальными правами. Ключи храним в AWS KMS или HashiCorp Vault. Это надёжнее и безопаснее plain hex в CI.

При сбое на середине деплоя — скрипт сохраняет состояние после каждой сети. Повторный запуск продолжает с последней точки. Данные не теряются.

Готовы упростить деплой вашего протокола? Закажите разработку системы автоматического деплоя — оценим проект бесплатно. Свяжитесь с нами, чтобы обсудить детали.