deploy.sh
Обзор
deploy.sh — это скрипт на shell, предназначенный для автоматизации процесса развертывания смарт-контрактов в локальной среде разработки с использованием Ethereum-совместимых инструментов (Anvil, cast, forge). Скрипт последовательно:
Ожидает готовности локальных Ethereum нод (Anvil и Anvil Settlement).
Выполняет предварительное развертывание контракта Multicall3 с передачей средств.
Публикует ABI и байткод контрактов в локальную ноду.
Запускает скрипты развертывания для нескольких контрактов с помощью forge.
Ожидает создания файла с данными о развернутых relay-контрактах.
Настраивает интервальное майнинг-блоков для ускорения транзакций.
Генерирует финальный блок для фиксации развертывания.
Создаёт маркер, сигнализирующий об успешном завершении развертывания.
Таким образом, этот файл интегрирует процессы подготовки, развертывания и конфигурации локальной тестовой инфраструктуры для дальнейшей работы с контрактами и тестирования.
Подробное описание шагов и команд
1. Ожидание запуска локальных нод
until cast client --rpc-url http://anvil:8545 > /dev/null 2>&1; do sleep 1; done
until cast client --rpc-url http://anvil-settlement:8546 > /dev/null 2>&1; do sleep 1; done
Используется команда
cast clientдля проверки доступности RPC интерфейса двух Ethereum нод:anvilна порту 8545 иanvil-settlementна 8546.Цикл
untilповторяется с задержкой в 1 секунду, пока ноды не станут доступны.Это обеспечивает синхронизацию запуска развертывания с готовностью нод.
2. Предварительное развертывание Multicall3 контрактов
cast send 0x05f32b3cc3888453ff71b01135b34ff8e41263f2 --value 100000000000000000 --private-key 0xac0974... --rpc-url http://anvil:8545
cast publish <contract_bytecode> --rpc-url http://anvil:8545
cast send 0x05f32b3cc3888453ff71b01135b34ff8e41263f2 --value 100000000000000000 --private-key 0xac0974... --rpc-url http://anvil-settlement:8546
cast publish <contract_bytecode> --rpc-url http://anvil-settlement:8546
Отправка 0.1 ETH (100000000000000000 wei) с приватным ключом на контрактный адрес.
Публикация байткода и ABI Multicall3 контракта в обе ноды.
Используется команда
cast sendдля передачи средств иcast publishдля публикации контракта.Выполняется как на основной, так и на settlement цепочке.
3. Запуск Forge скриптов развертывания
forge script script/LocalDeploy.s.sol:LocalDeploy --rpc-url http://anvil:8545 -vv --broadcast --private-key 0xac0974... | tee /deploy-data/deployment.log
forge script script/SettlementChainDeploy.s.sol:SettlementChainDeploy --rpc-url http://anvil-settlement:8546 -vv --broadcast --private-key 0xac0974... | tee /deploy-data/settlement-deployment.log
forge script script/ValSetDriverDeploy.s.sol:ValSetDriverDeploy --rpc-url http://anvil:8545 -vv --broadcast --private-key 0xac0974... | tee /deploy-data/valsetdriver-deployment.log
Выполняются три скрипта на Solidity (через forge), которые развертывают основные логические контракты:
LocalDeploy— развертывание локальной цепочки.SettlementChainDeploy— для settlement цепочки.ValSetDriverDeploy— для валидаторного драйвера.
Параметры:
--rpc-url— подключение к нужной ноде.-vv— подробный вывод для отладки.--broadcast— отправка транзакций в сеть.--private-key— ключ для подписи транзакций.
Логирование результатов в соответствующие файлы в
/deploy-data.
4. Ожидание файла с relay контрактаим
until [ -f /deploy-data/relay_contracts.json ]; do sleep 2; done
Цикл ждет появления файла
/deploy-data/relay_contracts.json, который содержит информацию о развернутых relay контрактах.Это синхронизирует дальнейшие действия с успешным созданием данного файла.
5. Настройка интервального майнинга
cast rpc --rpc-url http://anvil:8545 evm_setIntervalMining 1
cast rpc --rpc-url http://anvil-settlement:8546 evm_setIntervalMining 1
Устанавливает режим майнинга блоков с интервалом в 1 секунду на обеих нодах.
Это позволяет ускорить подтверждение транзакций и эмуляцию реального майнинга в тестовой среде.
6. Принудительная генерация блока
cast rpc --rpc-url http://anvil:8545 evm_mine
cast rpc --rpc-url http://anvil-settlement:8546 evm_mine
Генерирует один блок на каждой ноде для финализации состояния после всех транзакций развертывания.
7. Завершение и создание маркера успешного развертывания
echo "$(date): Deployment completed successfully" > /deploy-data/deployment-complete.marker
echo "Deployment completion marker created"
Записывает текущую дату и сообщение о успешном завершении в файл-маркер.
Сигнализирует остальным процессам системы о готовности развертывания.
Важные детали реализации
Скрипт использует
set -e— при любой ошибке выполнение остановится, что предотвращает некорректное развертывание.Приватные ключи жестко заданы в скрипте (для локальной разработки), что упрощает автоматизацию, но неприемлемо для продакшена.
Используются инструменты из набора Foundry (
cast,forge) для взаимодействия с локальными Ethereum-нодами.Публикация контракта Multicall3 происходит вручную с передачей байткода, что позволяет обеспечить поддержку мультиколл вызовов.
Скрипт ориентирован на локальную среду с двумя нодами — основной и settlement — что отражает архитектуру системы с раздельными цепочками.
Взаимодействие с другими частями системы
Скрипт ожидает запуска локальных нод Anvil и Anvil Settlement, которые должны быть подготовлены и запущены отдельно.
Работает в связке со скриптами развертывания на Solidity (
LocalDeploy.s.sol,SettlementChainDeploy.s.sol,ValSetDriverDeploy.s.sol), которые содержат логику создания контрактов.После развертывания скрипт ждёт файл
relay_contracts.json, который вероятно формируется одним из этих скриптов или вспомогательным процессом.Созданный маркер и логи развертывания служат сигналом для других частей системы, например, для CI/CD пайплайнов или тестов, что можно приступать к работе с контрактами.
Пример использования
# Запуск скрипта в терминале (предположим, что Anvil ноды уже запущены)
./deploy.sh
Вывод будет содержать информацию о прогрессе, задержках ожидания и финальном успешном завершении.
Диаграмма процесса deploy.sh
flowchart TD
A[Start: Запуск скрипта] --> B[Ожидание запуска anvil (8545)]
B --> C[Ожидание запуска anvil-settlement (8546)]
C --> D[Отправка ETH и публикация Multicall3 на anvil]
D --> E[Отправка ETH и публикация Multicall3 на anvil-settlement]
E --> F[Запуск forge скрипта LocalDeploy]
F --> G[Запуск forge скрипта SettlementChainDeploy]
G --> H[Запуск forge скрипта ValSetDriverDeploy]
H --> I[Ожидание файла relay_contracts.json]
I --> J[Настройка интервального майнинга на обеих нодах]
J --> K[Принудительная генерация блока на обеих нодах]
K --> L[Создание маркера успешного развертывания]
L --> M[Завершение: Deployment completed]
Итог
deploy.sh — ключевой скрипт для автоматизации локального развертывания и тестирования Ethereum смарт-контрактов, обеспечивающий последовательное выполнение шагов с контролем состояния нод и логированием результатов. Он интегрирует Foundry инструменты и локальные ноды, создавая удобную среду для дальнейшей разработки и тестирования.