Для POS майнинга криптовалюты Ethereum используется специальное программное обеспечение под общим названием Валидатор. Валидатор в свою очередь состоит из двух компонентов Исполняемого слоя и Консенсус слоя. Где консенсус слой это и есть сам POS майнинг, а исполняемый слой это бывшая блокчейн POW сеть Ethereum, которая работала с 2015 года до слияния в 2022 году. Все данные накопленные за это время полностью перенесены в новую POS сеть.
Т.к. существует несколько вариантов программного обеспечения для работы валидатора, поэтому дальнейшие рассуждения будут применимы для клиента GETH, как самого популярного.
Для работы каждого слоя используется своя база данных, так для исполняемого слоя эта база данных увеличивается на 14Gb каждую неделю, а полностью база данных уже сейчас занимает почти 2 Tb данных. Для архивного валидатора (используется для различных сервисов Etherscan и beacoincha.in) требования для свободного места на SSD еще выше и составляют более 14TB при использованиb клиента GETH.
Что бы сократить требования к размеру SSD для полной ноды (стандартный валидатор), разработчики придумали процедуру подрезки базы данных (Pruning) до последних 128 блоков для каждой транзакции.
С помощью этой процедуры теоретически можно использовать SSD размером 1 TB, но процедуру подрезки придется делать каждый месяц. Поэтому лучше купить для валидатора SSD размером 2TB и делать уменьшение базы данных раз в год. Тем более что данная процедура занимает по времени около 6-7 часов, в течении которых Ваш валидатор будет оффлайн и получать штрафы.
Консенсус слой так же имеет свою базу данных, но увеличивается в размерах она не так быстро, как база для исполняемого слоя, поэтому основное внимание уделяется именно уменьшению базы данных для исполняемого слоя.
Важно: С версии 1.13.0 клиент GETH поддерживает новый флаг --state.scheme=path а так же новый тип базы данных Pebble, если Вы уже используете --state.scheme=path или только собираетесь устанавливать ETH валидатор с новым типом базы данных, то подрезку базы данных делать уже не нужно. Для всех остальных клиентов, которые хоть и обновились до версии 1.13.0 или выше, продолжает работать старая версия базы. Что бы перейти на новую базу данных нужно полностью удалить базу данных клиента Geth (команда geth removedb), в настройках GETH указать флаг --state.scheme=path и --db.engine pebble, и ждать полной синхронизации ноды в течении 1 дня или более, при условии что у Вас быстрый SSD, мощный современный CPU и быстрый интернет.
Теперь непосредственно перейдем к инструкции как сделать эту самую подрезку базы данных для GETH клиента.
Подрезка (Pruning) базы данных GETH
Важно: Сделать подрезку базы данных можно только если на SSD диске осталось не менее 40Gb свободного места. Если У вас уже меньше места на SSD, то можно увеличить место за счет уменьшения SWAP файла или расширения размера логического диска. Временного переноса базы данных консенсус слоя на другой диск или как последний вариант сделать новую синхронизацию с нуля, но уже с базой данных Pebble.
Команда Linux проверить свободное место не диске:
df -h
Второй момент: Ваш клиент GETH должен быть полностью синхронизирован и проработать после запуска не менее 35 минут для набора необходимых данных.
Первое что нужно сделать это остановить процесс GETH
sudo systemctl stop geth
Так же можно остановить работу консенсус слоя. Команды остановки работы для клиента PRYSM
sudo systemctl stop prysmvalidator
sudo systemctl stop prysmbeacon
Подождать 3 минуты перед тем как приступить к следующему шагу.
Перед дальнейшим действиями рекомендуется запустить терминальный мультиплексор TMUX и все дальнейшие действия выполнять в нем
tmux
Это необходимо для тех случаев, когда по каким либо причинам вы потеряет доступ к удаленному терминалу управления сервером. В этом случае процесс обрезки базы данных не прервется вместе с вашей сессией.
Далее можно начать уменьшение самой базы данных
Команда для обрезания базы данных:
geth snapshot prune-state
Если Вы устанавливали валидатора с помощью инструкции Somer Esat на Medium, т.е. запуск GETH происходит с помощью systemd, то команда для запуска будет совсем другая:
sudo -u <user> geth --datadir <path> snapshot prune-state
пример команды: sudo -u geth geth --datadir /var/lib/geth snapshot prune-state
или sudo -u goeth geth --datadir /var/lib/goethereum snapshot prune-state
выбор команды зависит от того где у Вас на сервере хранится база данных GETH.
Узнать путь к базе данных можно в файле geth.service
sudo nano /etc/systemd/system/geth.service
путь к базе данных указан под флагом --datadir
Если Вы все сделали правильно то начнется процесс уменьшения базы данных, который разделен на 3 этапа:
Первый этап составление фильтра Bloom, что на моем компьютере заняло чуть более 2 часов
,где
elapsed- сколько уже времени прошло
eta - прогнозируемое время до окончания процесса
Далее начнется сама подрезка базы, на что уйдет еще около 4 часов.
После Pruning, база данных будет еще какое-то время архивироваться, в консоль этот процесс будет записан как Compacting database. Этот процесс может занять еще около часа.
О успешном выполнении задачи по уменьшению базы данных ethereum валидатора сообщит надпись State pruning successful
Выключаем TMUX
tmux kill-server
Далее запускаем клиент GETH и валидатор, если он тоже был выключен
sudo systemctl start geth
sudo systemctl start prysmbeacon
sudo systemctl start prysmvalidator
Ошибка "Snapshot not old enough yet: need 128 more blocks"
Данная ошибка возникает если ваш валидатор недостаточно долго работал перед тем как Вы решили уменьшить базу данных. В рекомендациях сказано, что GETH должен проработать не менее 35 минут перед тем, как Вы сможете приступить к обрезке.
Так же это ошибка возникает если Вы выбрали неправильную команду для Pruning database клиента GETH. Укажите другой путь или используете другой формат команды.
Второй вариант как запустить обрезку базы данных GETH Ethereum
Отредактируйте существующий файл geth.service
sudo nano /etc/systemd/system/geth.service
добавьте в самый конец ExecStart:
snapshot prune-state
Все остальные параметры должны остаться без изменений.
Перезагрузить systemd
sudo systemctl daemon-reload
Запустите службу Geth
sudo systemctl start geth
Смотреть за ходом обрезки базы данных можно через команду
journalctl -fu geth
После завершения обрезки базы данных GETH, удалить в файле geth.service строку snapshot prune-state
sudo nano /etc/systemd/system/geth.service
Перезагрузить systemd
sudo systemctl daemon-reload
Запустите службу Geth
sudo systemctl start geth
Весь процесс уменьшения базы данных клиента GETH занял около 7 часов на сервере с процессором Ryzen 1700X, 32Gb ОЗУ и 2TB SSD ADATA XPG GAMMIX S11 Pro.
Если Ваша конфигурация сервера значительно слабее, то и общее время затраченное на уменьшение базы данных будет больше. И наоборот при более мощном компьютере Pruning может занять меньше времени.
Вывод: Pruning или подрезка базы данных валидатора ETH, работающего на клиенте GETH очень полезная функция, т.к. позволяет использовать SSD гораздо меньшего объема, чем требовалось бы на самом деле. Что так же избавляет от проблем, если Вашего 2Tb SSD уже не хватает для поддержания работы валидатора Ethereum. Можно всего за несколько часов уменьшить базу данных и не думать о полной синхронизации GETH в течении нескольких дней для перехода на новый тип базы данных, где уменьшение базы данных происходит автоматически.
Если Вы все таки решили не переходить на Pebble, то не забывайте периодически выполнять команду snapshot prune-state вовремя, пока на вашем SSD еще есть 40Gb свободного места.