May 22, 2024

Initia - мануал, нода для самых маленьких

Автор (можно обращаться за помощью)
Канал
Держать ноду: 2 месяца
Суммарные затраты: от 90$ до 190$
Перспектива на насыпку: отличная


Это был мой первый опыт деплоя ноды/валидатора. Процесс занял не менее 6 часов и заставил дважды пережить смерть своего эго в попытках разобраться, как заставить всё работать. Теперь я готов помочь сэкономить время и нервы остальным, написав свой мануал для таких же первенцев, как я.

1. Но сперва разберемся, зачем нам это.

Проект собрал $7.5млн. от топовых фондов (ничего нового), но что интереснее - в них засажены Binance, при том их сумма инвеста не разглашается.

Initia - платформа, призванная упростить и обезопасить разработку блокчейна путем создания сети взаимосвязанных блокчейнов второго уровня (L2). Initia позиционирует себя как сеть 1-го уровня (L1), специально созданная для поддержки модульных "сворачиваний", т.е. rollups. Раунд финансирования и партнерские отношения с лидерами криптосферы свидетельствуют о том, что их "инновационный" (надеемся) подход к L2-роллапам набирает обороты. По мере развития технологии, Initia может сыграть важную роль в формировании будущего масштабируемых и безопасных блокчейн-приложений - продолжение пути к массадопшну. Справка:

"Блокчейны можно разделить на L1 и L2 в зависимости от их вычислительных возможностей. Блокчейны L1, такие как Bitcoin и Ethereum, обрабатывают транзакции непосредственно в своей основной сети. Однако такой подход может привести к проблемам масштабируемости, поскольку сеть становится перегруженной.
Сети L2 решают эту проблему, обрабатывая транзакции вне основного блокчейна и периодически сортируя их для отправки в сеть L1 для окончательного расчета. Это освобождает место в сети L1, позволяя проводить транзакции быстрее и дешевле"

Обещают такие преимущества:

- Упрощенная разработка: модульная конструкция Initia упрощает процесс разработки L2, делая создание пользовательских блокчейн-приложений проще и быстрее.
- Улучшенная масштабируемость: упрощая роллапы L2, Initia обеспечивает более быстрые и дешевые транзакции в блокчейне.
- Повышенная безопасность: Initia наследует преимущества безопасности базовой сети L1, позволяя разработчикам реализовывать дополнительные функции безопасности в своих L2-роллапах.

Если кратко - билдеры для билдеров, такое всегда выглядит интересно.

Сейчас началась первая фаза тестнета из восьми, так что времени заработать на реварды полно. Какие именно будут награды до конца неизвестно, поговаривают о "местах в генезисе", т.е. видимо вайтлист на валидирование (деплой ноды) в будущем мейннете, однако кажется очевидной насыпка токенов $INIT в будущем. Так же есть новая гугл-форма для валидаторов.
Учитывая вышеперечисленные факты, вопрос "зачем в этом участвовать?" выглядит риторическим.

2. Мануал

Сразу по делу. Арендуем сервер
Рекомендуемые требования к железу:

- Memory: 16 GB RAM
- CPU: 4 cores
- Disk: 1 TB SSD
- Bandwidth: 1 Gbps
- Linux amd64 arm64 (Ubuntu LTS release)

Со всем считаемся, кроме диска. 400-700гб должно хватить с головой.
Брал сервер на aeza.net. Адекватный ценовой диапазон, моментальная оплата в крипте, отличные мощности и самое важное - стабильная работа.

Покупаем сервер PARs-4. На гео в всё равно, берите любой европейский город. Если закончится память, то можно расширить до 720гб с доплатой 40$/мес.

Сетапим ноду!

Подключаемся к серверу используя любой SSH-клиент (гайд), я советую Termius. РЕМАРКА! В процессе деплоя можете так же сверять свои действия с официальным (пусть и не самым понятным) мануалом. Большую часть команд втупую копируем, места где надо внести свои правки будут обозначены. Сперва ознакомьтесь со всеми шагами, а потом приступайте, что бы не накосячить (хотя я косячил и ничего страшного не произошло, просто сервак переустановил с нодой, но это лишний гемор)


1. Устанавливаем необходимые компоненты:

sudo apt update && \
sudo apt install curl git jq build-essential gcc unzip wget lz4 -y

2. Устанавливаем Go:

cd $HOME && \
ver="1.22.0" && \
wget "https://golang.org/dl/go$ver.linux-amd64.tar.gz" && \
sudo rm -rf /usr/local/go && \
sudo tar -C /usr/local -xzf "go$ver.linux-amd64.tar.gz" && \
rm "go$ver.linux-amd64.tar.gz" && \
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile && \
source $HOME/.bash_profile && \
go version

3. Устанавливаем ноду:

git clone https://github.com/initia-labs/initia.git
cd initia
git checkout v0.2.15
make install
initiad version

4. Задаем переменные:

# Customize if you need
echo 'export MONIKER="My_Node"' >> ~/.bash_profile
echo 'export CHAIN_ID="initiation-1"' >> ~/.bash_profile
echo 'export WALLET_NAME="wallet"' >> ~/.bash_profile
echo 'export RPC_PORT="26657"' >> ~/.bash_profile
source $HOME/.bash_profile

Важно! В строке export echo 'export MONIKER="My_Node"' >> ~/.bash_profile указываем любое название своего валидатора, дефолтным не оставляем.
Пример: echo 'export MONIKER="flowerly"' >> ~/.bash_profile (в моем случае). Так будет правильно+удобно.

5. Инициализируем ноду:

cd $HOME
initiad init $MONIKER --chain-id $CHAIN_ID
initiad config set client chain-id $CHAIN_ID
initiad config set client node tcp://localhost:$RPC_PORT
initiad config set client keyring-backend os # You can set it to "test" so you will not be asked for a password

6. Просто вводим:

wget https://initia.s3.ap-southeast-1.amazonaws.com/initiation-1/genesis.json -O $HOME/.initia/config/genesis.json

7. Важный пункт - подключаемся к нужным пирам+сидам.

Нестабильные пиры, которые дают в ориг. мануале, стали одной из причин, почему я так долго трахался с нодой. Вводим эту команду и по идее всё будет пучком:

PEERS="a96694150ccd37f224059b3307dfcf6c38859c9c@65.21.109.183:26656,5c5441d80d686129b9c3fe62830ee5fc732bdce4@138.201.196.246:26656,8c63f08b951f7680a443caa1144b720d2a666261@65.108.232.174:17956,878a184ea897412f9823e3190b8ef1c81e263508@65.108.60.2:26656,37a683597dc1807c57550b5f10e8238bc5c81994@195.201.58.101:26656,22d15dd14042fe37356d5c21ada139d753c770db@65.109.49.248:26656,b3202f401aee2ad59afae9d4f671647005538059@168.119.235.140:17956,769b90d0c4c4cedb5d0b8d6a3627a5792b4c8519@5.78.98.32:17956,4e33a90e043ce7c80f0ccff86bffa0c921b9a1e7@116.202.243.98:26656,29835dc71444e9a728cb25a12febe67e255dce56@65.108.229.141:26756,e1bc2c4ef45100e12fe49d5999f7b21ff32c64c4@95.217.132.163:26656,d76820c0890379eb75e3c27ea881167f97f3ca70@95.216.43.37:26656" && \
SEEDS="2eaa272622d1ba6796100ab39f58c75d458b9dbc@34.142.181.82:26656,c28827cb96c14c905b127b92065a3fb4cd77d7f6@testnet-seeds.whispernode.com:25756" && \
sed -i \
    -e "s/^seeds *=.*/seeds = \"$SEEDS\"/" \
    -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" \
    "$HOME/.initia/config/config.toml"

8. Команда позволяющая экономить гигабайты диска:

sed -i \
    -e "s/^pruning *=.*/pruning = \"custom\"/" \
    -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" \
    -e "s/^pruning-interval *=.*/pruning-interval = \"10\"/" \
    "$HOME/.initia/config/app.toml"

9. Пишем это:

sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.15uinit,0.01uusdc\"/" $HOME/.initia/config/app.toml

10. Отключаем индексацию транзакций для ускорения работы ноды:

sed -i "s/^indexer *=.*/indexer = \"null\"/" $HOME/.initia/config/config.toml

11. Создаем файлик сервиса ноды:

sudo tee /etc/systemd/system/initiad.service > /dev/null <<EOF
[Unit]
Description=Initia Node
After=network.target

[Service]
User=$USER
Type=simple
ExecStart=$(which initiad) start --home $HOME/.initia
Restart=on-failure
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

12. Проверяем версию ноды, должна быть 0.2.15:

initiad version

Если версия 0.2.14, пишем (поочередно, 1 строка=1 команда):

sudo systemctl stop initiad
cd $HOME/initia
git fetch --all
git checkout v0.2.15
make install

13. Важный процесс - синхронизировать ноду. Ускорить этот процесс поможет снэпшот, скачиваем так (это одна команда как и большинство команд выше, копируем всё и вставляем всё за один раз):

initiad tendermint unsafe-reset-all --home $HOME/.initia--keep-addr-book
if curl -s --head curl https://krews.xyz/snapshots/initia/latest.tar.lz4 | head -n 1 | grep "200" > /dev/null; then
  curl https://krews.xyz/snapshots/initia/latest.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.initia
    else
  echo snapshot not found
fi

14. Делаем кошелек для валидатора (ничего не меняем, не забудьте сохранить сидку и сразу импортировать ее в кошелек)

initiad keys add $WALLET_NAME

15. Запрашиваем токены на кошелек. Идём сюда, вставляем адрес только что сгенерированного кошелька через терминал, получаем на него токены.

16. Самое вкусное и важное - создаем валидатора.

initiad tx mstaking create-validator \
--amount 1000000uinit \
--pubkey $(initiad tendermint show-validator) \
--moniker=$MONIKER \
--identity "" \
--details "Initia to the moon!" \
--website "YOUR_WEBSITE_URL" \
--chain-id initiation-1 \
--commission-rate 0.05 \
--commission-max-rate 0.20 \
--commission-max-change-rate 0.05 \
--from=$WALLET_NAME \
--gas-adjustment 1.4 \
--gas auto \
--gas-prices 0.15uinit \
--node https://initia-testnet-rpc.kzvn.xyz \
-y

Важно: мой валидатор/нода не работала, когда я оставлял identity="" не заполненым. Что туда нужно вставить? Скачиваем это, заполняем профиль и получаем Public Key. Вставляем его в скобки, пример: --identity "21B797FC1B9F0254" \

Строку --website можно оставлять незаполненной/вставить ссылку на свой твиттер.

После создания валидатора идём сюда, вводим имя нашего валидатора, т.е. тот самый MONIKER. Если мы появились в списке - порядок, идём дальше.

17. ЗАПУСК НОДЫ

sudo systemctl daemon-reload && \
sudo systemctl enable initiad && \
sudo systemctl restart initiad && \
sudo journalctl -u initiad -f -o cat

Первые несколько минут могут лететь ошибки - это нормально, нода подбирает доступные для работы пиры. Если всё сделали правильно, то в терминале будут лететь похожие логи:

Полезные команды.

Проверить, сколько блоков осталось пройти, что бы достичь синхронизации (т.е. успевать за всеми новыми блоками без отставаний):

local_height=$(initiad status | jq -r .sync_info.latest_block_height); network_height=$(curl -s https://rpc-initia-testnet.trusted-point.com/status | jq -r .result.sync_info.latest_block_height); blocks_left=$((network_height - local_height)); echo "Your node height: $local_height"; echo "Network height: $network_height"; echo "Blocks left: $blocks_left"

Как только вы достигните последнего текущего блока, ваша нода будет синхронизирована. Это не особо важно ибо разработчики говорят, что влиять на награды будет именно up-time, т.е. время которое наша нода активно работала.

Отображение логов:

sudo journalctl -u initiad -f -o cat

Что бы спрятать логи, в терминале нажмите Ctrl+C

Запуск/перезапуск ноды:

sudo systemctl restart initiad && sudo journalctl -u initiad -f -o cat

Если по какой то причине этот мануал не помог вам достичь успеха, то это не беда.
Во-первых - в дискорде проекта есть раздел #validators, где 24/7 все друг другу помогают с любым тех. вопросом.
Во-вторых - можете попробовать этот вариант с автоматической установкой от парня с их дискорда, не знаю рабочий ли способ, но скорее всего да.

Накатить эту ноду сможет реально каждый, по мере необходимости сами изучите те или иные дополнительные аспекты этого вопроса а так же набор прочих команд, с которыми будет неплохо ознакомиться для общего понимания.