Экосистемы
December 20, 2021

Часть 4. Solana: нода (Гайд)

Let's Node!

⠀Данная статья является руководством по работе с Solana нодой.


Содержание

Часть 1. Solana: введение и общая информация о проекте

Часть 2. Solana: программа валидаторов, условия, требования и доход

Часть 3. Solana: регистрация на SFDP (Гайд)

Часть 4. Solana: нода (Гайд)


Требования к серверу

К содержанию

⠀Выбирать сервер необходимо с высокой ответственностью. Требования к серверу были рассмотрены во второй части.

⠀Если был выбран польский хостинг 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 файл или файл подкачки — файл на диске, использующийся по принципу оперативной памяти (ОП).

⠀Он служит двум основным целям:

  1. Хранение неактивных программ. Операционная система выгружает неактивные программы не в ОП, а в файл подкачки. При переключении между программами происходит автоматическое перемещение программ из файла подкачки в ОП.
  2. Компенсация недостаточного объёма ОП. При недостатке объёма ОП 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.

⠀Смонтировать RAM-диск

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
  • Встроенной команды (1 SOL ежедневно)
solana airdrop 1

⠀Проверить баланс можно командой

solana balance

Уже есть Vote и Withdrawer аккаунты (например перенос ноды на другой сервер)

⠀Поместить в папку solana аккаунт vote-account-keypair.json

Ещё нет Vote и Withdrawer аккаунтов

⠀Далее необходимо создать 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
  • testnet-validator-keypair.json
  • vote-account-keypair.json

Сделать резервную копию всех этих файлов, сохранив их в надёжном месте

⠀Помимо этого необходимо удалить на сервере файл 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

Мониторинг

К содержанию

⠀Перейти в папку solana

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

⠀Запустить telegraf

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, запустить скрипт и дождаться окончания работы

⠀Обновление может впасть в режим ожидания, если:

  • До следующего лидирующего слота остаётся менее 30 минут (для игнорирования необходимо добавить опцию -us)
  • Если Delinquent stake (неактивный стейк по всей сети) более 5% (необходимо дождаться, пока значение опустится ниже 5%).
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/Solana/main/multi_tool.sh) \
-up -v 

Удаление

К содержанию

⠀Запустить скрипт и дождаться окончания работы

⠀Скрипт чистит систему от:

  • Бинарных файлов;
  • Папки ledger;
  • Мониторинга;
  • Сервисных файлов.

⠀Аккаунты в папке 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) | Публичная панель мониторинга


Благодарности

К содержанию

Сообществу Solana

Dim An — серия видео гайдов по установке ноды

Команда Let’s Node! — изучение проекта, написание статьи

Выразить благодарность