Защита валидатора (Validator Guard)
Плагин validator_guard автоматизирует восстановление ключа подписи для аккаунтов валидаторов. Когда ключ подписи валидатора сбрасывается в null (отключая производство блоков), плагин обнаруживает изменение и транслирует validator_update_operation для восстановления ключа — без ручного вмешательства.
Когда использовать этот плагин
- Ключ подписи вашего аккаунта валидатора может быть обнулён мастером экстренного консенсуса, протоколом безопасности или вручную.
- Без этого плагина вам нужно вручную отслеживать ключ в сети и восстанавливать его до наступления вашего запланированного слота.
- С этим плагином узел проверяет наличие нулевых ключей каждые N блоков и восстанавливает их автоматически.
Подключение плагина
ini
plugin = validator_guardКонфигурация
| Опция | По умолчанию | Описание |
|---|---|---|
validator-guard-enabled | true | Глобально включить или отключить плагин. |
validator-guard-interval | 20 | Интервал проверки в блоках (~60 с при 3 с/блок). |
validator-guard-validator | — | JSON-тройка [name, signing_wif, active_wif]. Повторяемый. |
validator-guard-disable | 5 | Число последовательных блоков от одного валидатора перед его автоотключением. 0 = отключено. |
Плагин также считывает enable-stale-production из конфигурации плагина validator.
Пример
ini
plugin = validator_guard
# Мониторинг одного валидатора
validator-guard-validator = ["alice", "5K_SIGNING_WIF", "5K_ACTIVE_WIF"]
# Мониторинг второго валидатора
validator-guard-validator = ["alice.backup", "5J_SIGNING_WIF", "5J_ACTIVE_WIF"]
# Проверка каждые 10 блоков
validator-guard-interval = 10Безопасность: Активный приватный ключ хранится в открытом виде в
config.ini. Ограничьте права доступа к файлу (chmod 600 config.ini) и избегайте его доступности недоверенным процессам.
Принцип работы
Запуск
- Разбирает и проверяет все настроенные WIF-ключи.
- Если
enable-stale-production = true, автовосстановление начинается отключённым (см. Защитные механизмы). - После открытия базы данных цепочки проверяет каждый настроенный активный ключ по on-chain авторизации. Валидаторы, аккаунты которых не найдены или чьи ключи не совпадают, удаляются из мониторинга с предупреждением.
- Выполняет немедленную проверку; кэширует результат для синхронизации с периодическим расписанием.
Обработчик на каждый блок
При каждом блоке:
- Автоотключение при последовательных блоках: Если отслеживаемый валидатор произвёл
validator-guard-disableпоследовательных блоков, транслируетсяvalidator_update_operationс нулевым ключом для его отключения, и валидатор помечается как автоотключённый. Любой блок от другого валидатора сбрасывает все счётчики последовательных блоков. - Подтверждение транзакции: Сканирует ожидающие ID транзакций восстановления в блоке. При совпадении помечает восстановление как подтверждённое и очищает состояние отслеживания.
- Упреждающее планирование: Если какой-либо отслеживаемый валидатор запланирован в следующие 3 слота, запускает немедленную проверку, чтобы ключ можно было восстановить до прихода слота.
- Периодическая проверка: В противном случае основная проверка выполняется каждые
validator-guard-intervalблоков. Пока узел всё ещё догоняет после запуска, проверки выполняются каждые 10 блоков.
Основная проверка
Каждая проверка (по порядку):
- Защита от устаревшего производства: Если активен
enable-stale-productionи участие в сети < 33%, пропускает все восстановления. Автоматически снимается, когда участие достигает ≥ 33%. - Проверка синхронизации: Пропускает, если время головного блока отстаёт от системных часов более чем на 2 интервала блока.
- Безопасность при длинном форке: Пропускает, если LIB старше 200 секунд.
- Очистка просроченных: Просрочивает устаревшие незавершённые попытки восстановления, чтобы их можно было повторить.
- Проверка ключа для каждого валидатора: Считывает on-chain ключ подписи.
- Ключ присутствует → очищает состояние ожидающего восстановления и флаг автоотключения.
- Ключ null + валидатор был автоотключён → пропускает автовосстановление (оператор должен разобраться).
- Ключ null + нет незавершённого восстановления → вызывает
send_witness_update.
Транзакция восстановления
- Строит
validator_update_operation, сохраняя текущий on-chain URL и устанавливая ключ подписи на настроенный публичный ключ. - Оборачивает в
signed_transactionс 30-секундным сроком действия и ссылкой на текущий головной блок. - Подписывает настроенным активным приватным ключом.
- Транслирует через P2P.
- Отслеживает ID транзакции в
_pending_confirmationsдля предотвращения дублирующих отправок.
Защитные механизмы
| Механизм | Поведение |
|---|---|
| Устаревшее производство | При enable-stale-production = true автовосстановление отключено во избежание трансляции на minority fork. Автоматически снимается при участии ≥ 33%. |
| Экстренный режим | Во время экстренного консенсуса защита от устаревшего производства обходится — восстановление ключа может понадобиться для восстановления. |
| Проверка синхронизации | Выполняется только при синхронизации узла. |
| Обнаружение длинного форка | Пропускает, если LIB старше 200 секунд. |
| Проверка авторизации | Активные ключи проверяются по on-chain авторизации при запуске. |
| Автоотключение при последовательных блоках | Автоматически обнуляет ключ подписи после N последовательных блоков от одного валидатора. Автовосстановление подавляется до ручного исправления ключа оператором. |
| Предотвращение дублирования | Незавершённые восстановления отслеживаются со сроком действия; дублирующие транзакции не отправляются. |
Сообщения журнала
| Сообщение | Значение |
|---|---|
monitoring validator 'alice' (signing key: VIZ...) | Плагин запущен для этого валидатора |
enable-stale-production detected — auto-restore is DISABLED | Активен режим устаревшего производства; восстановление подавлено |
network is healthy (XX%), auto-clearing stale production override | Защита от устаревшего производства снята |
'alice' has null signing key on-chain — initiating restore | Обнаружен нулевой ключ, скоро будет выполнена трансляция |
broadcasting validator_update [ID: ...] for 'alice' — restoring key to VIZ... | Транзакция восстановления отправлена |
CONFIRMED restoration for 'alice' in block #N | Восстановление подтверждено on-chain |
POTENTIAL LONG FORK DETECTED! LIB #N is Xs old. Skipping restoration. | Восстановление пропущено из-за устаревшего LIB |
validator 'alice' produced N consecutive blocks — auto-disabling | Достигнут порог последовательных блоков |
'alice' was auto-disabled (consecutive block limit), skipping auto-restore | Автовосстановление подавлено после автоотключения |
validator_update FAILED for 'alice': [error] | Трансляция не удалась |
Устранение неполадок
| Проблема | Проверьте |
|---|---|
| Восстановление не срабатывает | Убедитесь, что validator-guard-enabled = true; узел синхронизирован; аккаунт зарегистрирован как валидатор |
Отключено при enable-stale-production = true | Ожидаемо — ждёт участия в сети ≥ 33% |
| Транзакция не прошла | Убедитесь, что active_wif соответствует активной авторизации аккаунта. Проверьте предупреждение при запуске о несовпадении ключей |
| Ошибка разбора конфигурации | Каждая запись должна быть допустимым 3-элементным JSON-массивом: ["name", "signing_wif", "active_wif"] |
| Валидатор автоотключён и не восстанавливается | Был достигнут порог последовательных блоков. Выясните причину, вручную восстановите ключ подписи on-chain; флаг автоотключения сбрасывается, как только ключ обнаруживается как ненулевой |
| Предупреждение об авторизации при запуске | WARNING: Configured active key ... does NOT have authority on-chain — обновите ключ в конфигурации |
См. также: Узел-валидатор — настройка ключа подписи; Плагин Validator — внутреннее устройство цикла производства.