Часть 4. Solana: нода (Гайд)
⠀Данная статья является руководством по работе с Solana нодой.
Содержание
Часть 1. Solana: введение и общая информация о проекте
Часть 2. Solana: программа валидаторов, условия, требования и доход
Часть 3. Solana: регистрация на SFDP (Гайд)
Требования к серверу
⠀Выбирать сервер необходимо с высокой ответственностью. Требования к серверу были рассмотрены во второй части.
⠀Если был выбран польский хостинг Mevspace, то в качестве руководства по аренде и настройке сервера (включая установку RAID-0 массива) можно использовать статью ниже.
RAM Disk (опционально)
⠀Желательно создать RAM-диск, который снижает нагрузку на SSD диски, тем самым продлевает их срок службы.
⠀В официальной документации предлагают отвести на создание RAM-диска 100 GB и 300 GB для тестнета и мейннета соответственно и перенести на него директорию «accounts» из папки «ledger». Ниже рассматривается подходящий вариант как для тестовой, так и для основной сети — RAM-диск на 200 GB.
⠀Для начала необходимо обновить пакеты и систему
sudo apt update && sudo apt upgrade -y
⠀Установить необходимые пакеты
sudo apt install nano curl jq logrotate git bc -y
⠀Для начала необходимо создать SWAP файл
⠀SWAP файл или файл подкачки — файл на диске, использующийся по принципу оперативной памяти (ОП).
⠀Он служит двум основным целям:
- Хранение неактивных программ. Операционная система выгружает неактивные программы не в ОП, а в файл подкачки. При переключении между программами происходит автоматическое перемещение программ из файла подкачки в ОП.
- Компенсация недостаточного объёма ОП. При недостатке объёма ОП SWAP файл используется в качестве дополнительного хранилища данных и активных программ.
swapoff -a dd if=/dev/zero of=/swapfile bs=1G count=128 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
⠀Открыть файл, содержащий список устройств хранения информации и параметры монтирования
nano /etc/fstab
⠀Закомментировать символом #
строку, в которой содержится слово swap
(существующий SWAP файл).
⠀Добавить в конец файла две строки
/swapfile none swap sw 0 0 tmpfs /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=200G 0 0
⠀Сочетанием клавиш Ctrl+S
сохранить файл и покинуть текстовый редактор сочетанием Ctrl+X
.
mkdir -p /mnt/ramdisk mount /mnt/ramdisk
Установка инструментария
Ручная
⠀Перейти на сайт официальной документацией в раздел «Install The Solana Tool Suite» и найти команду установки инструментария.
sudo apt update && sudo apt upgrade -y
⠀Установить необходимые пакеты
sudo apt install nano curl jq logrotate git bc -y
⠀Создать файл с переменными среды
touch $HOME/.bash_profile
⠀Скопировать, выполнить команду и дождаться окончания установки. Пример команды на момент написания гайда
sh -c "$(curl -sSfL https://release.solana.com/v1.9.1/install)"
⠀Не перезаходить на сервер и не выполнять export
, о котором написано в конце.
. $HOME/.bash_profile
Автоматическая
⠀Запустить скрипт и дождаться окончания установки
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Solana/main/multi_tool.sh)
Валидатор
⠀В официальной документации перейти в раздел «Validating» — «Starting a Validator». Дальнейшие действия будут выполняться руководствуясь данным разделом.
⠀Установить конфиг тестовой сети
solana config set --url http://api.testnet.solana.com
mkdir -p $HOME/solana
⠀Создать сервисный файл Solana System Tuner’а, который настраивает системные параметры с целью оптимизации производительности
sudo tee <<EOF >/dev/null $HOME/solana/sstd.service [Unit] Description=Solana System Tuning After=network.target Before=solana.service [Service] User=$USER ExecStart=`which solana-sys-tuner` --user $USER Restart=on-failure RestartSec=3 LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF
rm -rf /etc/systemd/system/sstd.service ln -s $HOME/solana/sstd.service /etc/systemd/system/sstd.service sudo systemctl daemon-reload sudo systemctl enable sstd sudo systemctl restart sstd
⠀Перенести аккаунт testnet-validator-keypair.json
, созданный при регистрации в третьей части, в папку solana
.
⠀Далее необходимо добавить его в конфиг
solana config set --keypair $HOME/solana/testnet-validator-keypair.json
⠀Для запуска ноды необходимо получить тестовые токены при помощи:
- Крана от разработчиков из сообщества (100 SOL один раз). Для получения адреса используется команда
solana address
solana airdrop 1
⠀Проверить баланс можно командой
solana balance
Уже есть Vote
и Withdrawer
аккаунты (например перенос ноды на другой сервер)
⠀Поместить в папку solana
аккаунт vote-account-keypair.json
⠀Далее необходимо создать Vote
аккаунт, который будут указывать при стейкинге токенов на валидатора
solana-keygen new -o $HOME/solana/vote-account-keypair.json
⠀Создать Withdrawer
аккаунт, при помощи которого снимаются награды, изменяются параметры валидатора и т. д.
solana-keygen new -o $HOME/solana/authorized-withdrawer-keypair.json
⠀После создания всех аккаунтов необходимо их связать
solana create-vote-account $HOME/solana/vote-account-keypair.json \ $HOME/solana/testnet-validator-keypair.json \ $HOME/solana/authorized-withdrawer-keypair.json
⠀На данном этапе в директории Solana обязательно должно быть 3 файла:
⠀Сделать резервную копию всех этих файлов, сохранив их в надёжном месте
⠀Помимо этого необходимо удалить на сервере файл authorized-withdrawer-keypair.json
с целью защиты валидатора от злоумышленника, получившего доступ к серверу (он сможет отобрать валидатора и все награды).
⠀Запустить ротацию логов, которая будет разделять большой лог на несколько частей и удалять части свыше 3-ей
sudo tee <<EOF >/dev/null $HOME/solana/solana.logrotate $HOME/solana/solana.log { rotate 1 daily missingok postrotate systemctl kill -s USR1 solana.service endscript } EOF rm -rf /etc/logrotate.d/sol ln -s $HOME/solana/solana.logrotate /etc/logrotate.d/sol sudo systemctl restart logrotate
⠀Создать и открыть сервисный файл в текстовом редакторе
nano $HOME/solana/solana.service
⠀На момент написания статьи актуальный файл представлен ниже, актуальную версию необходимо отслеживать в официальной документации.
⠀При созданном RAM-диске добавить опцию accounts
после ledger
--accounts /mnt/ramdisk/accounts \
[Unit] Description=Solana Node After=network.target syslog.target StartLimitIntervalSec=0 [Service] Restart=always RestartSec=1 LimitNOFILE=1024000 Environment="SOLANA_METRICS_CONFIG=host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea" ExecStart=/root/.local/share/solana/install/active_release/bin/solana-validator \ --log /root/solana/solana.log \ --ledger /root/solana/ledger \ --identity $HOME/solana/testnet-validator-keypair.json \ --vote-account /root/solana/vote-account-keypair.json \ --known-validator GcibmF4zgb6Vr4bpZZYHGDPZNWiLnBDUHdpJZTsTDvwe \ --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \ --known-validator 3iPu9xQ3mCFmqME9ZajuZbFHjwagAxhgfTxnc4pWbEBC \ --known-validator 8SRKNfvMerfA1BdU79CAwU4wNfjnDvFrBo3o5f5TS4uv \ --known-validator FCnsZL8d45gC5aVsmheV3zs533DfM2jRk1vNnDgLNkfr \ --known-validator 8VNj7K6ssFcUogRfT6miUzz8HTKu1nX2n8MYr5z49CXb \ --entrypoint entrypoint.testnet.solana.com:8001 \ --entrypoint entrypoint2.testnet.solana.com:8001 \ --entrypoint entrypoint3.testnet.solana.com:8001 \ --only-known-rpc \ --private-rpc \ --rpc-port 8899 \ --dynamic-port-range 8000-8020 \ --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \ --wal-recovery-mode skip_any_corrupted_record \ --limit-ledger-size 50000000 \ --snapshot-interval-slots 1000 \ --maximum-local-snapshot-age 1000 \ --no-port-check ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID [Install] WantedBy=multi-user.target
⠀Сочетанием клавиш Ctrl+S
сохранить файл и покинуть текстовый редактор сочетанием Ctrl+X
.
⠀Создать логическую ссылку на сервисный файл
rm -rf /etc/systemd/system/solana.service ln -s /root/solana/solana.service /etc/systemd/system/solana.service
sudo systemctl daemon-reload sudo systemctl enable solana sudo systemctl restart solana
⠀Добавить команды в систему в виде переменных:
- Просмотр лога ноды;
- Просмотр скорости синхронизации;
- Просмотр времени, оставшегося до следующего лидирующего слота.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n solana_log -v "tail -fn 100 $HOME/solana/solana.log" -a . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n solana_catchup -v "solana catchup --our-localhost --follow --log" -a . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) -n solana_leader_slot -v ". <(wget -qO- https://raw.githubusercontent.com/SecorD0/Solana/main/multi_tool.sh) -ls" -a
⠀Подождать 10-20 минут и посмотреть, с какой скоростью нода догоняет сеть
solana_catchup
Мониторинг
cd $HOME/solana
⠀Добавить ссылку на репозиторий
cat <<EOF | sudo tee /etc/apt/sources.list.d/influxdata.list deb https://repos.influxdata.com/ubuntu bionic stable EOF
sudo curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
⠀Установить необходимые пакеты
sudo apt update sudo apt install telegraf git jq bc -y
⠀Создать пользователя telegraf
sudo adduser telegraf sudo
⠀Добавить его в группу администраторов
sudo adduser telegraf adm
sudo -- bash -c 'echo "telegraf ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers'
⠀Скопировать и удалить исходник конфига
sudo cp /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.orig sudo rm -rf /etc/telegraf/telegraf.conf
⠀Клонировать репозиторий и перейти в него
git clone https://github.com/stakeconomy/solanamonitoring/ cd solanamonitoring
⠀Выполнить команду и ввести название ноды, которое будет отображаться в публичной панели мониторинга
read -p #39;\e[40m\e[92mEnter a node moniker:\e[0m ' moniker
⠀Создать конфигурационный файл
sudo tee <<EOF >/dev/null /etc/telegraf/telegraf.conf # Global Agent Configuration [agent] hostname = "$moniker" # set this to a name you want to identify your node in the grafana dashboard flush_interval = "15s" interval = "15s" # Input Plugins [[inputs.cpu]] percpu = true totalcpu = true collect_cpu_time = false report_active = false [[inputs.disk]] ignore_fs = ["devtmpfs", "devfs"] [[inputs.io]] [[inputs.mem]] [[inputs.net]] [[inputs.system]] [[inputs.swap]] [[inputs.netstat]] [[inputs.processes]] [[inputs.kernel]] [[inputs.diskio]] # Output Plugin InfluxDB [[outputs.influxdb]] database = "metricsdb" urls = [ "http://metrics.stakeconomy.com:8086" ] # keep this to send all your metrics to the community dashboard otherwise use http://yourownmonitoringnode:8086 username = "metrics" # keep both values if you use the community dashboard password = "password" [[inputs.exec]] commands = ["sudo su -c /root/solana/solanamonitoring/monitor.sh -s /bin/bash root"] # change home and username to the useraccount your validator runs at interval = "5m" timeout = "1m" data_format = "influx" data_type = "integer" EOF
sudo systemctl enable telegraf sudo systemctl restart telegraf
⠀Как правило telegraf
не запускается с первого раза, поэтому его требуется перезапустить несколько раз
sudo systemctl restart telegraf
⠀После окончания синхронизации ноду можно будет найти в публичной панели мониторинга по адресу Identity аккаунта
solana address --keypair $HOME/solana/testnet-validator-keypair.json
Высокий скип
⠀При высоком скипе может помочь удаление папок ledger
и accounts
и повторный запуск валидатора
solana-validator --ledger $HOME/solana/ledger/ wait-for-restart-window --max-delinquent-stake 10 && \ sudo systemctl stop solana && \ rm -rf $HOME/solana/ledger /mnt/ramdisk/accounts; \ sudo systemctl restart sstd; \ sudo systemctl restart solana
Тестовая сеть упала
⠀В случае, если тестовая сеть упала, в Discord выкладывают инструкцию по восстановлению ноды. У нас также есть специальная статья под названием «Реинкарнация Solana ноды».
⠀Необходимо сравнить дату в статье с текущей, поскольку мы публикуем обновлённую версию только после тестов на нескольких серверах.
Обновление
Ручное
⠀Выполнить команду и ввести версию, до которой необходимо обновиться, например 1.9.3
read -p #39;\e[40m\e[92mEnter a node version:\e[0m ' solana_version
solana-install init "v${solana_version}" && \ solana-validator --ledger $HOME/solana/ledger/ wait-for-restart-window --max-delinquent-stake 10 && \ sudo systemctl stop solana && \ sudo systemctl restart sstd; \ sudo systemctl restart solana
Автоматическое
⠀Добавить в конец версию, до которой необходимо обновиться, например 1.9.3
, запустить скрипт и дождаться окончания работы
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Solana/main/multi_tool.sh) \ -up -v
Удаление
⠀Запустить скрипт и дождаться окончания работы
⠀Аккаунты в папке solana
остаются нетронутыми, при необходимости удалить их вручную.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Solana/main/multi_tool.sh) -un
Вклад сообщества
Наша команде не несёт ответственности за возможные негативные последствия, поскольку не может гарантировать безопасность использования представленных инструментов
Как сюда попасть?
⠀Чтобы попасть в этот почётный раздел необходимо написать SecorD’у сообщение с информацией об инструменте:
- Название проекта;
- Краткое название в 2-3 слова (будет использоваться как заголовок);
- Описание, которое будет добавлено в статью (зачем нужно, функционал, как использовать, другая полезная информация, желательно со скриншотами).
- Пользу сообществу;
- Возможность заявить о себе;
- Дополнительную возможность представления доказательств контрибуции в различных проектах.
Полезные команды
# Ноды solana_log tail -fn 100 $HOME/solana/solana.log # Solana System Tuner'а sudo journalctl -fn 100 -u sstd
⠀Посмотреть скорость синхронизации
solana_catchup solana catchup --our-localhost --follow --log
⠀Посмотреть количество запланированных на текущую эпоху слотов
solana leader-schedule | grep $376e8QLx9qSkjFn7mK2kp3wBwvziKuMqiB3iAbK5Payx | wc -l
⠀Протестировать скорость работы дисков и скорость интернет соединения
bash <(wget -qO- yabs.sh) -g
# Ноду мягко (предпочтительный вариант) solana-validator --ledger $HOME/solana/ledger/ wait-for-restart-window --max-delinquent-stake 10 && \ sudo systemctl restart solana # Ноду жёстко sudo systemctl restart solana # Solana System Tuner sudo systemctl restart sstd
Полезные ссылки
Официальный сайт проекта | Solana Foundation
Тех. русскоязычная группа Telegram (по запросу)
Русскоязычная группа Telegram | Тех. группа для новичков
Discord | Twitter | GitHub | Blog | Forum
Официальная документация | Explorer
Валидаторы (Validators.app) | Валидаторы (Solana Beach)
Установка мониторинга (EN) | Публичная панель мониторинга
Благодарности
Dim An — серия видео гайдов по установке ноды
Команда Let’s Node! — изучение проекта, написание статьи