ManageValidators.s.sol
Обзор
ManageValidators.s.sol — это скриптовый контракт на Solidity, предназначенный для управления валидаторами в блокчейн-сети. Основная функциональность включает регистрацию валидаторов, управление их стейком (ставкой), проверку состояния и мониторинг валидаторов. Скрипт использует возможности Foundry (forge-std) для взаимодействия с окружением, чтения переменных окружения и записи файлов конфигурации.
Данный файл автоматизирует процессы взаимодействия с токеном MANA и позволяет:
регистрировать валидаторов с указанным стейком;
увеличивать/уменьшать их стейк;
просматривать список валидаторов;
проверять состояние сети и валидаторов;
сохранять информацию о валидаторах и генерировать конфигурационные файлы.
Описание классов и функций
Контракт ManageValidators
Реализует логику управления валидаторами с помощью встроенных методов. Наследует Script из forge-std, что позволяет запускать скрипты в среде Foundry.
Структура ValidatorInfo
Хранит информацию о валидаторе:
address validatorAddress— адрес валидатора.string name— имя валидатора.string endpoint— сетевой эндпоинт валидатора.uint256 stakeAmount— размер стейка (в wei).bool isActive— активность валидатора.uint256 registrationTime— время регистрации (timestamp).
Константы
MIN_STAKE— минимальный стейк для регистрации валидатора, 10,000 MANA (в 18 десятичных).
Функция run()
Описание:
Главная точка входа скрипта. Считывает действие из переменной окружения VALIDATOR_ACTION и вызывает соответствующую функцию.
Параметры: отсутствуют.
Действия:
register— регистрация валидатора.stake— добавление стейка.unstake— инициирование уменьшения стейка.list— список валидаторов.health — проверка состояния валидаторов.
Иначе — выводит справку по доступным действиям.
Пример использования:
VALIDATOR_ACTION=register forge script ManageValidators.s.sol
Функция registerValidator()
Описание:
Регистрация нового валидатора с заданным адресом, именем, эндпоинтом и стейком. Проверяет минимальный стейк, при необходимости ментит MANA токены, сохраняет информацию и генерирует конфигурационный файл.
Параметры: отсутствуют (использует vm.env* для получения параметров).
Переменные окружения:
VALIDATOR_ADDRESS— адрес валидатора.VALIDATOR_NAME— имя валидатора.VALIDATOR_ENDPOINT— эндпоинт валидатора.STAKE_AMOUNT— размер стейка (в wei).
Пример использования:
VALIDATOR_ACTION=register \
VALIDATOR_ADDRESS=0x... \
VALIDATOR_NAME="validator-1" \
VALIDATOR_ENDPOINT="http://validator1.node" \
STAKE_AMOUNT=10000000000000000000000 \
forge script ManageValidators.s.sol
Функция stakeValidator()
Описание:
Добавляет дополнительный стейк для валидатора. Если у валидатора недостаточно MANA, скрипт ментит необходимую сумму.
Параметры: отсутствуют (использует vm.env*).
Переменные окружения:
VALIDATOR_ADDRESS— адрес валидатора.ADDITIONAL_STAKE— дополнительный стейк (в wei).
Функция unstakeValidator()
Описание:
Инициирует процесс уменьшения стейка валидатора. В текущей реализации — только вывод сообщения, в реальной системе ожидался бы вызов соответствующего контракта с задержкой.
Параметры: отсутствуют (использует vm.env*).
Переменные окружения:
VALIDATOR_ADDRESS— адрес валидатора.UNSTAKE_AMOUNT— сумма для снятия стейка (в wei).
Функция listValidators()
Описание:
Выводит на консоль список активных валидаторов и агрегированную информацию. В демо-версии список жестко закодирован.
Функция checkValidatorHealth()
Описание:
Показывает текущее состояние валидаторов и сети: онлайн статус, время последнего ответа, состояние консенсуса и кворума.
Вспомогательные функции
getManaTokenAddress()
Возвращает адрес контракта MANA токена, читая из файлов деплоя local.json или sepolia.json. Если файлы отсутствуют, берёт из переменной окружения MANA_TOKEN_ADDRESS.
getGameManagerAddress()
Аналогично getManaTokenAddress(), возвращает адрес контракта GameManager.
saveValidatorInfo(ValidatorInfo memory validator)
Сохраняет информацию валидатора в локальный JSON-файл в папке ./validators/.
generateValidatorConfig(string memory name, address validatorAddr, string memory endpoint)
Генерирует .env конфигурационный файл для валидатора с ключевыми параметрами, включая адреса контрактов и параметры работы.
Важные детали реализации
Для взаимодействия с окружением используется
vmAPI из Foundry (forge-std), который позволяет читать переменные окружения, файлы, писать файлы и запускать транзакции.Для регистрации и стейкинга используется метод "mint" токенов MANA, что подходит для тестовой среды.
Информация о валидаторах сохраняется локально в виде JSON и
.envфайлов для последующего использования.Проверка действия (
VALIDATOR_ACTION) реализована через сравнение хешей строкkeccak256, что типично для Solidity.Порог минимального стейка установлен жёстко, что обеспечивает базовые требования к валидаторам.
Взаимодействие с другими частями системы
Импортируется контракт
ManaTokenиз../src/ManaToken.sol— это ERC20 токен, используемый для стейкинга валидаторов.Используются файлы деплоя (
./deployments/local.jsonи./deployments/sepolia.json) для получения адресов контрактов MANA и GameManager.Скрипт предполагает наличие папки
./validators/для сохранения данных валидаторов.Может использоваться вместе с другими скриптами и контрактами, управляющими сетевой логикой и консенсусом.
Пример запуска скрипта
export VALIDATOR_ACTION=register
export VALIDATOR_ADDRESS=0x1234...abcd
export VALIDATOR_NAME="MyValidator"
export VALIDATOR_ENDPOINT="http://localhost:3030"
export STAKE_AMOUNT=10000000000000000000000 # 10,000 MANA
forge script ManageValidators.s.sol
Mermaid диаграмма структуры контракта
classDiagram
class ManageValidators {
<<contract>>
+uint256 MIN_STAKE
+run()
-registerValidator()
-stakeValidator()
-unstakeValidator()
-listValidators()
-checkValidatorHealth()
-getManaTokenAddress() address
-getGameManagerAddress() address
-saveValidatorInfo(ValidatorInfo)
-generateValidatorConfig(string, address, string)
}
class ValidatorInfo {
<<struct>>
+address validatorAddress
+string name
+string endpoint
+uint256 stakeAmount
+bool isActive
+uint256 registrationTime
}
ManageValidators --> ValidatorInfo : uses
Итог
ManageValidators.s.sol — скрипт для управления жизненным циклом валидаторов в тестовой или локальной среде блокчейна. Он автоматизирует процессы регистрации, стейкинга и мониторинга, облегчая взаимодействие с токеном MANA и сохраняет информацию в удобном формате. Возможность расширения и интеграции с реальными контрактами делает данный файл полезным инструментом для разработчиков и операторов сетей на базе Ethereum-совместимых цепочек.