DeployProduction.s.sol
Обзор
DeployProduction.s.sol — это скрипт развертывания на языке Solidity, предназначенный для выполнения производственного (production) развертывания смарт-контрактов с использованием сетевых конфигураций. Скрипт интегрируется с системой Forge (forge-std), что позволяет автоматически подставлять параметры сети, валидировать их, запускать основной скрипт развертывания игровых контрактов и сохранять результаты развертывания в виде артефактов и конфигурационных файлов. Основная цель — упростить и стандартизировать процесс развертывания для различных сетей, учитывая особенности каждой из них (например, основной сети, тестовых сетей и локальной сети).
Подробное описание
Контракт DeployProduction
DeployProduction наследует контракт Script из библиотеки forge-std, что позволяет использовать специальные возможности для скриптов развертывания, такие как считывание переменных окружения, вывод в консоль и запись файлов.
Свойства:
NetworkConfig private networkConfig;
Экземпляр контрактаNetworkConfig, предоставляющего сетевые параметры для текущей среды развертывания.
Основные методы
run()
function run() external returns (DeployGameContracts.DeployedContracts memory)
Описание: Основной метод запуска скрипта развертывания.
Параметры: отсутствуют.
Возвращает: структуру
DeployedContractsиз скриптаDeployGameContracts, содержащую адреса развернутых контрактов.Логика:
Создает экземпляр
NetworkConfigи получает текущие параметры сети (Config).Выводит в консоль информацию о сети.
Проверяет корректность параметров развертывания через
validateDeploymentParams.Устанавливает переменные окружения для скрипта
DeployGameContracts.Создает и запускает
DeployGameContractsдля развертывания игровых контрактов.Сохраняет артефакты развертывания в файл JSON.
Генерирует конфигурационные файлы для оффчейн-компонентов.
Выводит финальное сообщение об успешном завершении.
Пример использования:
DeployProduction deployer = new DeployProduction();
DeployGameContracts.DeployedContracts memory deployedContracts = deployer.run();
validateDeploymentParams()
function validateDeploymentParams(NetworkConfig.Config memory config) internal pure
Описание: Проверяет обязательные параметры развертывания.
Параметры:
config— структура конфигурации сети.
Возвращает: ничего (выбрасывает ошибку, если параметры некорректны).
Валидация:
adminне должен быть нулевым адресом.initialManaSupplyдолжен быть больше 0.chainIdне должен быть 0.
Использование: вызывается внутри
run()для защиты от некорректных параметров.
saveDeploymentArtifacts()
function saveDeploymentArtifacts(
DeployGameContracts.DeployedContracts memory deployed,
NetworkConfig.Config memory config
) internal
Описание: Сохраняет JSON-файл с артефактами развертывания.
Параметры:
deployed— структура с адресами развернутых контрактов.config— текущая конфигурация сети.
Возвращает: ничего.
Детали:
Формирует JSON, включающий:chainId, имя сети, признак тестовой сети,
время развертывания,
адреса контрактов (manaToken, gameManager, manaSettlement),
параметры конфигурации (например, начальный запас MANA),
указывает, используется ли существующее поселение (
existingSettlement).
Сохраняет файл: в папку
./deployments/с именем сети.
generateNetworkConfig()
function generateNetworkConfig(
DeployGameContracts.DeployedContracts memory deployed,
NetworkConfig.Config memory config
) internal
Описание: Генерирует конфигурационные файлы для оффчейн-компонентов.
Параметры:
deployed— адреса развернутых контрактов.config— параметры текущей сети.
Возвращает: ничего.
Детали:
Создает
.envфайл с переменными окружения для взаимодействия с сетью и контрактами.Вызывает
generateABIFiles()для генерации файлов ABI.
Расположение:
.envфайлы сохраняются в папке./off-chain/.
generateABIFiles()
function generateABIFiles(DeployGameContracts.DeployedContracts memory deployed) internal
Описание: Создает заготовки файлов ABI для оффчейн-компонентов.
Параметры:
deployed— адреса контрактов.
Возвращает: ничего.
Особенности:
На текущий момент создает JSON с адресами контрактов и ссылками на ABI-файлы (заглушки).Сохраняет: файл
./off-chain/abis/contracts.json.
getNetworkName()
function getNetworkName(uint256 chainId) internal pure returns (string memory)
Описание: Возвращает читаемое название сети по
chainId.Параметры:
chainId— идентификатор сети.
Возвращает: строку с именем сети (например,
"mainnet"или"sepolia").Поддерживаемые сети: mainnet, sepolia, arbitrum, arbitrum-sepolia, local, unknown.
Взаимодействие с другими файлами
DeployGameContracts.s.sol
Основной скрипт развертывания игровых контрактов. Этот файл вызывает его методrun()для фактического развертывания контрактов.NetworkConfig.s.sol
Предоставляет конфигурации сети, такие какchainId, RPC URL, адрес администратора, начальное количество токенов и др.forge-std (Script и console)
Библиотека для упрощения скриптов развертывания и отладки.vm (virtual machine)
Интерфейс для установки переменных окружения и записи файлов в процессе скрипта.
Важные детали реализации
Используется
vm.setEnvдля передачи параметров в дочерний скриптDeployGameContracts.Артефакты и конфигурационные файлы сохраняются локально, что облегчает интеграцию с CI/CD и оффчейн-частью проекта.
Валидация параметров исключает ошибки развертывания из-за пустых или некорректных значений.
Генерация
.envфайлов и ABI-конфигураций позволяет оффчейн-нодам и скриптам автоматически подхватывать актуальные адреса и параметры.
Пример рабочего процесса
flowchart TD
A[Запуск run()] --> B[Инициализация NetworkConfig]
B --> C[Получение текущей конфигурации]
C --> D[Вывод параметров в консоль]
D --> E[Валидация параметров]
E --> F[Установка переменных окружения]
F --> G[Вызов DeployGameContracts.run()]
G --> H[Получение адресов развернутых контрактов]
H --> I[Сохранение артефактов JSON]
I --> J[Генерация .env файла]
J --> K[Генерация ABI файлов]
K --> L[Завершение скрипта с выводом в консоль]
Диаграмма классов
classDiagram
class DeployProduction {
-NetworkConfig networkConfig
+run() DeployGameContracts.DeployedContracts
-validateDeploymentParams(NetworkConfig.Config config)
-saveDeploymentArtifacts(DeployGameContracts.DeployedContracts deployed, NetworkConfig.Config config)
-generateNetworkConfig(DeployGameContracts.DeployedContracts deployed, NetworkConfig.Config config)
-generateABIFiles(DeployGameContracts.DeployedContracts deployed)
-getNetworkName(uint256 chainId) string
}
DeployProduction ..> NetworkConfig : uses
DeployProduction ..> DeployGameContracts : uses
DeployProduction ..|> Script
Заключение
DeployProduction.s.sol — это ключевой скрипт для запуска производственного развертывания игровых смарт-контрактов с учетом параметров конкретной сети. Он обеспечивает надежность, автоматизацию и интеграцию с оффчейн-средой, что делает процесс развертывания масштабируемым и удобным для разработчиков и DevOps-инженеров.