Безопасное подписание голосов
Валидатор получает записи от текущего лидера и отправляет голоса, подтверждающие, что эти записи действительны. Это представление голосования представляет собой проблему безопасности, поскольку поддельные голоса, нарушающие правила консенсуса, могут быть использованы для сокращения доли валидатора.
Валидатор голосует за выбранную им вилку, отправляя транзакцию, которая использует асимметричный ключ для подписи результата своей проверки. Другие объекты могут проверить эту подпись, используя открытый ключ валидатора. Если ключ валидатора используется для подписи неверных данных (например, голосов на нескольких ответвлениях реестра), доля узла или его ресурсы могут быть скомпрометированы.
Solana устраняет этот риск, выделяя отдельный сервис vote signer, который оценивает каждый голос, чтобы убедиться, что он не нарушает условие косой черты.
Валидаторы, лица, подписывающие голоса, и заинтересованные стороны
Когда валидатор получает несколько блоков для одного и того же слота, он отслеживает все возможные форки, пока не сможет определить «лучший». Валидатор выбирает лучший форк, отправляя ему голосование, используя подписавшего голос, чтобы свести к минимуму вероятность того, что его голос непреднамеренно нарушит правило консенсуса и урежет ставку.
Подписавший голос оценивает голос, предложенный валидатором, и подписывает голос, только если он не нарушает условия косой черты. Подписавшемуся голосующему нужно только поддерживать минимальное состояние в отношении голосов, которые он подписал, и голосов, подписанных остальной частью кластера. Ему не нужно обрабатывать полный набор транзакций.
Заинтересованная сторона — это личность, которая имеет контроль над поставленным капиталом. Заинтересованная сторона может делегировать свою долю лицу, подписавшему голос. После делегирования доли голоса лица, подписавшего голосование, представляют собой вес голосов всех делегированных ставок и дают вознаграждение за все делегированные доли.
В настоящее время существует отношение 1:1 между валидаторами и лицами, подписавшими голос, и заинтересованные стороны делегируют всю свою долю одному лицу, подписывающему голос.
Служба подписи
Служба подписи голосов состоит из сервера JSON RPC и обработчика запросов. При запуске служба запускает сервер RPC на настроенном порту и ожидает запросов валидатора. Он ожидает следующего типа запросов:
-
Зарегистрируйте новый узел валидатора
- Запрос должен содержать личность валидатора (открытый ключ)
- Запрос должен быть подписан закрытым ключом валидатора.
- Служба отбрасывает запрос, если подпись запроса не может быть проверена
- Сервис создает новый асимметричный ключ голосования для валидатора и возвращает открытый ключ в качестве ответа
- Если валидатор пытается зарегистрироваться снова, сервис возвращает открытый ключ из ранее существовавшей пары ключей.
-
Подпишите голосование
- Запрос должен содержать транзакцию голосования и все данные проверки
- Запрос должен быть подписан закрытым ключом валидатора.
- Служба отбрасывает запрос, если подпись запроса не может быть проверена
- Сервис проверяет данные голосования
- Сервис возвращает подпись для транзакции
Голосование валидатора
Узел проверки при запуске создает новую учетную запись для голосования и регистрирует ее в кластере, отправляя новую транзакцию «регистра голосования». Другие узлы в кластере обрабатывают эту транзакцию и включают новый валидатор в активный набор. Впоследствии валидатор отправляет транзакцию «нового голосования», подписанную закрытым ключом валидатора для голосования при каждом событии голосования.
Конфигурация
Узел валидатора настроен с сетевой конечной точкой службы подписи (IP/Port).
Регистрация
При запуске валидатор регистрируется в своей службе подписи с помощью JSON RPC. Вызов RPC возвращает открытый ключ голосования для узла проверки. Валидатор создает новую транзакцию «регистра голосования», включающую этот открытый ключ, и отправляет ее в кластер.
Сбор голосов
Валидатор ищет голоса, отправленные всеми узлами в кластере за последний период голосования. Эта информация передается службе подписи вместе с новым запросом на подпись голосования.
Новое подписание голосования
Валидатор создает транзакцию «нового голосования» и отправляет ее в службу подписи с помощью JSON RPC. Запрос RPC также включает данные проверки голосования. В случае успеха вызов RPC возвращает подпись для голосования. В случае сбоя вызов RPC возвращает код сбоя.