Solana: учетные записи и ключи для запуска валидатора
Всем привет! Давненько я не писал. Последние несколько лет мой основной фокус был в сфере блокчейна и web3, поэтому сегодня я постараюсь написать статью о ключах и аккаунтах, которые используются для запуска и обслуживания Солана валидатора.
Основной фокус будет на следующем:
- как настроить учетную запись голосования в блокчейне
- какие ключи и настройки для валидатора задействованы
- примеры команд для запуска голосующего валидатора
Поехали.
В основе статьи лежит гайд от разработчиков солана: Validator Guide: Vote Account Management. Когда вы запускаете ноду Солана, ключ --no-voting
определяет, будет ли нода учавствовать в голосовании за блоки.
Что такое аккаунт \ учетная запись в solana и чем он отличается от ключа?
Стоит отметить, что в сети Solana куда больше типов аккаунтов, чем тот минимум, который описан в статье. Этот факт вызывает много путаницы. В случае с голосующим валидатором нам интересны, как минимум, два типа аккаунта: системный и голосующий. Мы не затрагиваем стейк-аккаунт в статье.
Все аккаунты в солана – это пара закрытый ключ и публичный адрес этого ключа. Ключ можно создать этой командой:
solana-keygen new --no-bip39-passphrase
Generating a new keypair
Wrote new keypair to /Users/user/.config/solana/id.json
================================================================================
pubkey: FK6pLjt1v3PtkTk76RE9egQXrf2yVjioaQpkhWm9jAHy
================================================================================
Save this seed phrase to recover your new keypair:
spawn original laptop spot solve imitate flag faint payment absurd initial tired
================================================================================
Если интересно, что внутри файла, то там json массив, который содержит побайтовое представление созданного ключа. Каждое поле – это int от 0 до 255, что соответствует одному байту. В этом массиве 64 числа, что указывает на то, что используется 512-битный ключ. Первые 32 — это приватный ключ, вторые 32 — это публичный ключ.
cat /Users/user/.config/solana/id.json
[227,30,135,225,83,180,21,232,240,134,93,115,78,42,227,236,12,104,189,199,135,49,152,251,103,178,7,27,233,29,118,176,212,166,165,223,183,36,14,51,67,27,133,55,11,85,234,103,72,53,239,253,103,2,113,232,136,146,78,21,134,6,114,236]
# получить публичный ключ
solana-keygen pubkey /Users/user/.config/solana/id.json
31SdKRCVvYo1WQojYX1AX9fotGMtA7KVnybwEV3mouRL
Итак, когда ключ создан, он еще не является аккаунтом и НЕ связан ни с какой сетью. Как только вы отправите на него какое-то количество токенов или опубликуете код в сети Солана, вот тогда ключ становится аккаунтом в сети. Иными словами, аккаунт — это публичный адрес ключа, который имеет активные данные в кластере Солана.
Какие ключи нужны для голосующего валидатора (Solana voting validator)
Перед разбором, давайте посмотрим на вывод команды solana validators -u d
Наиболее интересные поля – Identity и Vote Account – о них поговорим ниже.
Ключ для Vote Account Address / Адреса аккаунта голосования
Обратите внимание на столбец
Vote Account
на скриншоте.
Ключ учетной записи голосования — используется как системный аккаунт. Vote Account никогда не требуется для подписи транзакций, он используется только для поиска/сопоставления информации об учетной записи. Иными словами, Vote Account Address связывает вместе три сущности:
- Validator Identity (для указания какая нода оплачивает комиссию за голосующие транзакции),
- Authorized Withdrawer (для указания, кто авторизован снимать вознаграждения сети) и собственно,
- Vote Account Address (который является идентификатором валидатора).
Также, когда кто-то хочет делегировать/стейкировать токены, делегирование происходит на Vote Account Address валидатора. Вознаграждения за создание блоков приходят также на Vote Account.
Ключ для Validator Identity / Идентификатора валидатора
Обратите внимание на столбец
Identity
на скриншоте.
Ключ для Идентификатора валидатора – это аккаунт типа системная учетная запись, он используется для оплаты всех комиссий за транзакции голосования, отправляемые в учетную запись голосования. (Внимание, не путайте эту учетную запись с Vote Account Address, о которой говорилось выше. В данном случае, речь идет о глобальном аккаунте Vote111111111111111111111111111111111111111). Поскольку от валидатора ожидается, что он будет голосовать за большинство действительных блоков, которые он получает, учетная запись идентификатора валидатора часто (несколько раз в секунду) подписывает транзакции и платит комиссии. По этой причине ключевая пара идентификатора валидатора должна храниться как “горячий кошелек” в файле ключевой пары на той же системе, на которой работает процесс валидатора.
Поскольку горячий кошелек обычно менее безопасен, чем офлайн или “холодный” кошелек, админ валидатора может выбрать хранение в учетной записи идентификатора только достаточного количества SOL для покрытия комиссий за голосование на ограниченный период времени. Например, на несколько недель или месяцев. Учетная запись идентификатора валидатора может быть периодически пополнена из более безопасного (холодного) кошелька.
Эта практика может снизить риск потери средств, если диск или файловая система узла валидатора станут скомпрометированными или поврежденными.
Validator Identity необходим, когда создается учетная запись голосования. Идентификатор валидатора также может быть изменен после создания учетной записи с использованием команды vote-update-validator.
Ключ для Authorized Withdrawer / Уполномоченного на снятие средств
Ключевая пара авторизованного снимающего используется для снятия средств с учетной записи голосования с использованием команды withdraw-from-vote-account
. Любые награды сети, заработанные валидатором, зачисляются на учетную запись голосования и могут быть извлечены только путем подписи с использованием ключевой пары авторизованного снимающего.
Authorized Withdrawer также должен подписывать любую транзакцию по изменению комиссии Vote Account и по изменению идентификатора валидатора на учетной записи голосования.
Иными словами, Authorized Withdrawer может управлять всеми операциями с аккаунтом готолования.
Поскольку кража ключевой пары авторизованного снимающего может дать полный контроль над операциями валидатора злоумышленнику, рекомендуется хранить ключевую пару снимающего в офлайн/холодном кошельке в безопасном месте. Ключевая пара снимающего не нужна во время работы валидатора и не должна храниться на самом валидаторе.
Авторизованный снимающий должен быть установлен при создании учетной записи голосования. Он не должен быть установлен на ключевую пару, которая является той же самой, что и ключевая пара идентификатора валидатора или ключевая пара полномочия голосования.
Авторизованный снимающий может быть изменен позже с помощью команды vote-authorize-withdrawer-checked.
Ключ для Vote Authority / Полномочий голосования
Ключевая пара полномочия голосования используется для подписи каждой транзакции голосования, которую узел валидатора хочет отправить в кластер. Этот ключ не обязательно должен быть отдельным. По умолчанию (обычно), голосующий валидатор использует ключ идентификатора валидатора, как ключ, обладающий полномочиями голосования.
Если решено использовать отдельный (от идентификатора валидатора) ключ, то его так же нужно хранить на валидаторе, поскольку ключ с полномочиями голосования постоянно подписывает транзакции.
Честно говоря, мне трудно представить в какой ситуации этот ключ может понадибиться.
Если идентификатор валидатора также обладает полномочием голосования, для подписи транзакции голосования и оплаты комиссии за транзакцию требуется только одна подпись. Поскольку fee/газ/комиссии за транзакции на Solana взимаются за подпись, наличие одного подписанта вместо двух приведет к уплате половины комиссии по сравнению с установкой полномочия голосования и идентификатора валидатора на два разных ключа.
Полномочие голосования может быть установлено при создании учетной записи голосования. Если оно не предоставлено, поведение по умолчанию заключается в том, чтобы назначить его таким же, как идентификатор валидатора. Полномочие голосования может быть изменено позже с помощью команды vote-authorize-voter-checked
.
Полномочие голосования может быть изменено не более одного раза за эпоху. Если полномочие изменяется с помощью vote-authorize-voter-checked
, это вступит в силу только в начале следующей эпохи. Чтобы поддерживать плавный переход подписания голосов, solana-validator позволяет указывать аргумент --authorized-voter
несколько раз. Это позволяет процессу валидатора продолжать успешно голосовать, когда сеть достигает границы эпохи, в которой меняется аккаунт полномочия голосования валидатора.
Итог
Для запуска голосующего Солана валидатора необходимо иметь 3 ключа (минимум), функции которых, коротко:
- Ключ для Validator Identity / Идентификатора валидатора
- Указывает на каком физическом сервере работает валидатор
- подписывает и оплачивает комиссии за транзакции голосования
- Ключ для Authorized Withdrawer / Уполномоченного на снятие средств
- отвечает за вывод наград сети с Vote Account
- Ключ для Vote Account Address / Адреса аккаунта голосования
- получает награды сети
- используется, как адрес для стейкинга
- связывает вместе идентификатор сервера (Validator Identity) и того, кто может снимать награды (Authorized Withdrawer)
Итак, мы знаем какие аккаунты нам нужны. Давайте разберемся, как создавать ключи Solana и аккаунты.
Как создать ключ в Solana
Перед работой с Солана, нужно установить Solana CLI. Когда утилиты для работы с солана установлены, для генерации ключей используется solana-keygen
. (Для подробной справки, используйте solana-keygen --help
)
Создание ключей
Для создания ключа, необходимо использовать подкоманду new
:
solana-keygen new --no-bip39-passphrase
Generating a new keypair
Wrote new keypair to /Users/user/.config/solana/id.json
================================================================================
pubkey: FK6pLjt1v3PtkTk76RE9egQXrf2yVjioaQpkhWm9jAHy
================================================================================
Save this seed phrase to recover your new keypair:
spawn original laptop spot solve imitate flag faint payment absurd initial tired
================================================================================
Что важно в выводе:
- путь, где был создан ключ
/Users/user/.config/solana/id.json
- публичный адрес
FK6pLjt1v3PtkTk76RE9egQXrf2yVjioaQpkhWm9jAHy
- seed ключевая фраза, которая позволит восстановить ключ в случае утери
Если забыли публичный ключ, то можно его посмотреть подкомандой pubkey
:
solana-keygen pubkey /Users/user/.config/solana/id.json
FK6pLjt1v3PtkTk76RE9egQXrf2yVjioaQpkhWm9jAHy
Мы знаем, как создать ключ. Мы знаем, что нам нужно минимум 3 ключа для валидатора. Давайте соединим эти 2 факта и создадим ключи:
solana-keygen new -o ./validator-identity-keypair.json
solana-keygen new -o ./vote-account-keypair.json
solana-keygen new -o ./authorized-withdrawer-keypair.json
Полезно указать следующий ключ: --no-bip39-passphrase
Это отключит запрос ключевой фразы.
Важно отметить, что ключи validator-identity-keypair.json и vote-account-keypair.json должны обслуживаться как горячие ключи. Ключ authorized-withdrawer-keypair.json должен обслуживаться с максимальным уровнем безопсаности и должен храниться в безопасном месте (бумага + сейф или аппаратный ключ). Более детальные рекомендации по безопасности тут: https://docs.solanalabs.com/operations/best-practices/security
Создание vote аккаунта
Итак, ключевые пары созданы, давайте назначим им роли. Учетную запись голосования можно создать с помощью подкоманды create-vote-account
. Учетную запись голосования можно настроить при первом создании или после запуска валидатора. Все аспекты учетной записи голосования могут быть изменены, за исключением адреса учетной записи голосования, который фиксирован на всю жизнь учетной записи.
Формат команды следующий:
USAGE:
solana create-vote-account [FLAGS] [OPTIONS] <ACCOUNT_KEYPAIR> <IDENTITY_KEYPAIR> <WITHDRAWER_PUBKEY>
Где:
<ACCOUNT_KEYPAIR>
– Ключевая пара для голосующего аккаунта<IDENTITY_KEYPAIR>
– Ключевая пара валидатора, на котором будет работать голосующий аккаунт<WITHDRAWER_PUBKEY>
– Публичный ключ авторазованного снимающего (можно использовать pubkey или сам ключ в json формате)[FLAGS] [OPTIONS]
– Это необязательные флаги, которые можно посмотреть в справке:solana create-vote-account --help
Вот так это будет выглядеть в конечном счете:
solana create-vote-account vote-account-keypair.json validator-keypair.json E6zLSYqqzzppffmqyMfEueB
E6zLSYqqzzppffmqyMfEueB
Error: Account 31SdKRCVvYo1WQojYX1AX9fotGMtA7KVnybwEV3mouRL has insufficient funds for spend (0.0270744 SOL) + fee (0.000015 SOL)
Данная команда отправляет траназакцию в сеть солана. Соответственно, комиссия за транзакцию должна быть оплачена. Вы можете видеть эту ошибку, если Ваш аккаунт (который задан в настройках solana config get keypair
) не имеет достаточно SOL для оплаты траназкции. Пополните его в нужной сети (mainnet\testnet\devnet), чтобы создать голосующий аккаунт. Либо, можно задать в ручную, кто платит комиссию с помощью ключа: --fee-payer <KEYPAIR>
.
Настроить валидатор на использование созданных ключей
Что ж, путешествие почти завершено. У нас есть 3 ключа (solana-keygen new
), мы создали голосующий аккаунт и связали его с идентификатором валидатора и назначили, какой ключ может снимать токены (solana create-vote-account
). Осталось применить эти ключи к валидатору. Для этого, необходимо скопировать ./validator-identity-keypair.json
и ./vote-account-keypair.json
на валидатор и указать на эти ключи в параметрах запуска:
exec solana-validator \
--identity /путь/к/validator-identity-keypair.json \
--vote-account /путь/к/vote-account-keypair.json \
<...другие параметры валидатора...>
Резюме
В статье я постарался разобрать какие ключи нужны для голосующего солана валидатора, как ключи создавать, применять и как они взаимодействют.
Я буду рад любой обратной связи.
Полезные ссылки:
- Setup a Solana Validator
- Validator Guide: Vote Account Management
- Solana Account Model
- #Solana accounts explained in 5 tweets