Skip to content

Защита валидатора (Validator Guard)

Плагин validator_guard автоматизирует восстановление ключа подписи для аккаунтов валидаторов. Когда ключ подписи валидатора сбрасывается в null (отключая производство блоков), плагин обнаруживает изменение и транслирует validator_update_operation для восстановления ключа — без ручного вмешательства.


Когда использовать этот плагин

  • Ключ подписи вашего аккаунта валидатора может быть обнулён мастером экстренного консенсуса, протоколом безопасности или вручную.
  • Без этого плагина вам нужно вручную отслеживать ключ в сети и восстанавливать его до наступления вашего запланированного слота.
  • С этим плагином узел проверяет наличие нулевых ключей каждые N блоков и восстанавливает их автоматически.

Подключение плагина

ini
plugin = validator_guard

Конфигурация

ОпцияПо умолчаниюОписание
validator-guard-enabledtrueГлобально включить или отключить плагин.
validator-guard-interval20Интервал проверки в блоках (~60 с при 3 с/блок).
validator-guard-validatorJSON-тройка [name, signing_wif, active_wif]. Повторяемый.
validator-guard-disable5Число последовательных блоков от одного валидатора перед его автоотключением. 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) и избегайте его доступности недоверенным процессам.


Принцип работы

Запуск

  1. Разбирает и проверяет все настроенные WIF-ключи.
  2. Если enable-stale-production = true, автовосстановление начинается отключённым (см. Защитные механизмы).
  3. После открытия базы данных цепочки проверяет каждый настроенный активный ключ по on-chain авторизации. Валидаторы, аккаунты которых не найдены или чьи ключи не совпадают, удаляются из мониторинга с предупреждением.
  4. Выполняет немедленную проверку; кэширует результат для синхронизации с периодическим расписанием.

Обработчик на каждый блок

При каждом блоке:

  1. Автоотключение при последовательных блоках: Если отслеживаемый валидатор произвёл validator-guard-disable последовательных блоков, транслируется validator_update_operation с нулевым ключом для его отключения, и валидатор помечается как автоотключённый. Любой блок от другого валидатора сбрасывает все счётчики последовательных блоков.
  2. Подтверждение транзакции: Сканирует ожидающие ID транзакций восстановления в блоке. При совпадении помечает восстановление как подтверждённое и очищает состояние отслеживания.
  3. Упреждающее планирование: Если какой-либо отслеживаемый валидатор запланирован в следующие 3 слота, запускает немедленную проверку, чтобы ключ можно было восстановить до прихода слота.
  4. Периодическая проверка: В противном случае основная проверка выполняется каждые validator-guard-interval блоков. Пока узел всё ещё догоняет после запуска, проверки выполняются каждые 10 блоков.

Основная проверка

Каждая проверка (по порядку):

  1. Защита от устаревшего производства: Если активен enable-stale-production и участие в сети < 33%, пропускает все восстановления. Автоматически снимается, когда участие достигает ≥ 33%.
  2. Проверка синхронизации: Пропускает, если время головного блока отстаёт от системных часов более чем на 2 интервала блока.
  3. Безопасность при длинном форке: Пропускает, если LIB старше 200 секунд.
  4. Очистка просроченных: Просрочивает устаревшие незавершённые попытки восстановления, чтобы их можно было повторить.
  5. Проверка ключа для каждого валидатора: Считывает on-chain ключ подписи.
    • Ключ присутствует → очищает состояние ожидающего восстановления и флаг автоотключения.
    • Ключ null + валидатор был автоотключён → пропускает автовосстановление (оператор должен разобраться).
    • Ключ null + нет незавершённого восстановления → вызывает send_witness_update.

Транзакция восстановления

  1. Строит validator_update_operation, сохраняя текущий on-chain URL и устанавливая ключ подписи на настроенный публичный ключ.
  2. Оборачивает в signed_transaction с 30-секундным сроком действия и ссылкой на текущий головной блок.
  3. Подписывает настроенным активным приватным ключом.
  4. Транслирует через P2P.
  5. Отслеживает 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 — внутреннее устройство цикла производства.