Установка нод Celestia, настройка Rollup
Сегодня мы разберем установку всех нод Celestia (Validator, Bridge, Full, Light).
Мы попытаемся разобрать, утилитарность каждой ноды, потому что, если "Validator node" - это что-то привычное для экосистемы Cosmos, ибо валидаторы есть в каждом проекте, то с Bridge, Full и Light не все так просто и однозначно.
Так же мы поднимем свой Rollup и локальную сеть Celestia и даже напишем небольшой текстовый запрос к нему приступим.
Вся основная информация взята с официальных источников:
https://docs.celestia.org/
https://rollkit.dev/docs/intro/
https://docs.ignite.com/
Системные требования
- Memory: 8 GB RAM
- CPU: 6 cores
- Disk: 500 GB SSD Storage
- Bandwidth: 1 Gbps for Download/1 Gbps for Upload
- Memory: 2 GB RAM
- CPU: Single Core
- Disk: 25 GB SSD Storage
- Bandwidth: 56 Kbps for Download/56 Kbps for Upload
- Memory: 8 GB RAM
- CPU: Quad-Core
- Disk: 1 TB SSD Storage
- Bandwidth: 1 Gbps for Download/1 Gbps for Upload
Part 1
Начнем с самого привычного - Validator Node она же, Сonsensus Full node (только без установки валидатора)
В данном гайде мы делаем все на дефолтных портах, если они у вас заняты, вы можете воспользоваться нашим гайдом по смене портов
В целом, здесь нет никаких подводных камней, все так же, как и у обычного проекта, базой которого является Cosmos, начнем.
Устанавливаем дополнительные пакеты
sudo apt install make clang git pkg-config libssl-dev build-essential git gcc chrony curl jq ncdu bsdmainutils htop net-tools lsof fail2ban wget -y
Устанавливаем go и проверяем версию
ver="1.20.2" && \ 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
CELESTIA_CHAIN="blockspacerace-0" CELESTIA_MONIKER="your_name" CELESTIA_WALLET="your_name"
echo 'export CELESTIA_CHAIN='${CELESTIA_CHAIN} >> $HOME/.bash_profile echo 'export CELESTIA_MONIKER='${CELESTIA_MONIKER} >> $HOME/.bash_profile echo 'export CELESTIA_WALLET='${CELESTIA_WALLET} >> $HOME/.bash_profile source $HOME/.bash_profile
Клонируем репозиторий и билдим бинарник
cd $HOME/celestia-app/ git clone https://github.com/celestiaorg/celestia-app.git git checkout v0.12.1 make install mv $HOME/go/bin/celestia-appd /usr/local/bin
celestia-appd init $CELESTIA_MONIKER --chain-id blockspacerace-0
wget -O $HOME/.celestia-app/config/genesis.json "https://raw.githubusercontent.com/celestiaorg/networks/master/blockspacerace/genesis.json"
Настройка прунинга (опционально)
pruning="custom" pruning_keep_recent="1000" pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.celestia-app/config/app.toml sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.celestia-app/config/app.toml sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.celestia-app/config/app.toml
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.001utia\"/;" ~/.celestia-app/config/app.toml
peers="be935b5942fd13c739983a53416006c83837a4d2@178.170.47.171:26656,cea09c9ac235a143d4b6a9d1ba5df6902b2bc2bd@95.214.54.28:20656,5c9cfba00df2aaa9f9fe26952e4bf912e3f1e8ee@195.3.221.5:26656,7b2f4cb70f04f2e9befb6ace66ce1ac7b3bea5b4@178.239.197.179:26656,7ee2ba21197d58679cfc1517b5bbc6465bed387a@65.109.67.25:26656,dc0656ab58280d641c8d10311d86627255bec8a1@148.251.85.27:26656,ccbd6262d0324e2e858594b639f4296cc4952c93@13.57.127.89:26656,a507b2bda6d2974c84ae1e8a8b788fc9e44d01f7@142.132.131.184:26656,9768290c60a746ee97ef1a5bcb8bee69066475e8@65.109.80.150:2600" sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.celestia-app/config/config.toml
seeds="0293f2cf7184da95bc6ea6ff31c7e97578b9c7ff@65.109.106.95:26656,8f14ec71e1d712c912c27485a169c2519628cfb6@celest-test-seed.theamsolutions.info:22256" sed -i.bak -e "s/^seeds *=.*/seeds = \"$seeds\"/" $HOME/.celestia-app/config/config.toml
sudo tee /etc/systemd/system/celestia-appd.service > /dev/null <<EOF [Unit] Description=celestia-appd After=network-online.target
[Service] User=root ExecStart=$(which celestia-appd) start Restart=on-failure RestartSec=3 LimitNOFILE=65535
sudo systemctl daemon-reload && \ sudo systemctl enable celestia-appd && \ sudo systemctl restart celestia-appd && \ sudo journalctl -u celestia-appd -f -o cat
Создаем кошелек, либо восстанавливаем
celestia-appd keys add $CELESTIA_WALLET celestia-appd keys add $CELESTIA_WALLET --recover
Добавляем в переменную адрес кошелька и экспортируем в .bash_profile
CELESTIA_ADDR=$(celestia-appd keys show $CELESTIA_WALLET -a) echo 'export CELESTIA_ADDR='${CELESTIA_ADDR} >> $HOME/.bash_profile source $HOME/.bash_profile
В данном тестнете, имеют допуск только отобранные участники
celestia-appd tx staking create-validator \ --amount 1000000utia \ --from $CELESTIA_WALLET \ --commission-max-change-rate "0.05" \ --commission-max-rate "0.2" \ --commission-rate "0.1" \ --min-self-delegation "1" \ --pubkey $(celestia-appd tendermint show-validator) \ --moniker $CELESTIA_MONIKER \ --chain-id $CELESTIA_CHAIN
Добавляем в переменную адрес валидатора и экспортируем в .bash_profile
CELESTIA_VALOPER=$(celestia-appd keys show $CELESTIA_WALLET --bech val -a) echo 'export CELESTIA_VALOPER='${CELESTIA_VALOPER} >> $HOME/.bash_profile source $HOME/.bash_profile
Поскольку от Validator node особо нету смысла в данном тестнете ( речь идет о не допущенных пользователях ) всегда можно сделать ноду для ендпоинтов RPC/API/GPRC, сейчас мы покажем, как это можно осуществить
Для этого нам необходимо включить несколько параметров в конфигах, если они выключены.
sed -i.bak -e "117 s/^enable *=.*/enable = true/" $HOME/.celestia-app/config/app.toml -e "183 s/^enable *=.*/enable = true/" $HOME/.celestia-app/config/app.toml && cat -n $HOME/.celestia-app/config/app.toml | sed -n '117p;183p'
sed -i.bak -e '91 s/127.0.0.1/0.0.0.0/' $HOME/.celestia-app/config/config.toml && cat -n $HOME/.celestia-app/config/config.toml | sed -n '91p'
Для того, что бы узнать ваш ендпоинт, вам нужно всего лишь подставить ваш IP сервера к определенному порту, IP сервера - это "32.274.125.73" выглядеть это будет так:
Напоминаю, все это мы делаем на дефолтных портах, если у вас кастомные - меняйте на свои
RPC: 32.274.125.73:26657 API: 32.274.125.73:1317 GRPC: 32.274.125.73:9090
Удаление Validator node / Consensus Full node
cd $HOME/ rm /usr/local/bin/celestia-appd rm -rf .celestia-app/ rm -rf celestia-app/ rm /etc/systemd/system/celestia-appd.service
Part 2
Перейдем к следующим видам узлов в Celestia - Light, Bridge, Full
Сейчас мы попробуем сжато рассказать о них вам
Light node Легкие клиенты проводят выборку доступности данных в сети Data Availability.
Bridge node Осуществляют мостовое соединение блоков между сетью Data Availability и сетью Consensus.
Fulll node Осуществляет хранение всех данных в сети Data Availability , но не подключен к Consensus.
Поскольку их установка сильно друг от друга не отличается, в данном гайде мы просто будем дублировать команды, а не писать для каждой отдельный раздел.
Качаем репозиторий, билдим бинарник для узлов и cel-key для генерации ключей.
После команды "make install" бинарник будет лежать по пути /usr/local/bin/celestia
cd $HOME/ git clone https://github.com/celestiaorg/celestia-node.git cd celestia-node git checkout tags/v0.9.3 make build make install make cel-key
#Для Light celestia light init --core.ip https://rpc-celestia-testnet.mms.team/ --p2p.network blockspacerace #Для Bridge celestia bridge init --core.ip https://rpc-celestia-testnet.mms.team/ --p2p.network blockspacerace #Для Full celestia full init --core.ip https://rpc-celestia-testnet.mms.team/ --p2p.network blockspacerace
При инициализации создаются кошельки, но если вы хотите его поменять / сделать еще один, команда будет ниже, если вы хотите восстановить кошелек по мнемонике, добавьте дополнительный флаг "--recover" в конец команды
cd celestia-node/ #Для Light ./cel-key add NAME_HERE --keyring-backend test --node.type light --p2p.network blockspacerace #Для Bridge ./cel-key add NAME_HERE --keyring-backend test --node.type bridge --p2p.network blockspacerace #Для Full ./cel-key add NAME_HERE --keyring-backend test --node.type full --p2p.network blockspacerace
#Для Light sudo tee /etc/systemd/system/celestia-light.service > /dev/null <<EOF [Unit] Description=Celestia light node After=network-online.target [Service] User=root ExecStart=/usr/local/bin/celestia light start --core.ip https://rpc-celestia-testnet.mms.team/ --core.rpc.port 26660 --core.grpc.port 9090 --keyring.accname my_celes_key --metrics.tls=false --metrics --metrics.endpoint otel.celestia.tools:4318 --gateway --gateway.addr localhost --gateway.port 26667 --p2p.network blockspacerace Restart=on-failure RestartSec=3 LimitNOFILE=4096 [Install] WantedBy=multi-user.target EOF
#Для Bridge sudo tee /etc/systemd/system/celestia-bridge.service > /dev/null <<EOF [Unit] Description=Celestia bridge node After=network-online.target [Service] User=root ExecStart=/usr/local/bin/celestia bridge start --core.ip https://rpc-celestia-testnet.mms.team/ --keyring.accname my_celes_key --core.rpc.port 26657 --core.grpc.port 9090 --metrics.tls=false --metrics --metrics.endpoint otel.celestia.tools:4318 --gateway.port 26659 --p2p.network blockspacerace --gateway --gateway.addr localhost Restart=on-failure RestartSec=3 LimitNOFILE=4096 [Install] WantedBy=multi-user.target EOF
#Для Full sudo tee /etc/systemd/system/celestia-full.service > /dev/null <<EOF [Unit] Description=Celestia full node After=network-online.target [Service] User=root ExecStart=/usr/local/bin/celestia full start --core.ip https://rpc-celestia-testnet.mms.team/ --keyring.accname my_celes_key --core.rpc.port 26657 --core.grpc.port 9090 --metrics.tls=false --metrics --metrics.endpoint otel.celestia.tools:4318 --gateway.port 26659 --p2p.network blockspacerace --gateway --gateway.addr localhost Restart=on-failure RestartSec=3 LimitNOFILE=4096 [Install] WantedBy=multi-user.target EOF
Иногда могут возникать проблемы с запуском из-за RPC ноды, в таком случае альтернативные варианты можете поискать тут и сделать изменение в сервисе, во флаге "--core.ip" после чего перезапустить ноду
Включаем сервисный файл, рестартим и смотрим логи
#Для Light systemctl daemon-reload && \ systemctl enable celestia-light.service && \ systemctl restart celestia-light.service && \ journalctl -fu celestia-light.service -o cat
#Для Bridge systemctl daemon-reload && \ systemctl enable celestia-bridge.service && \ systemctl restart celestia-bridge.service && \ journalctl -fu celestia-bridge.service -o cat
#Для Full systemctl daemon-reload && \ systemctl enable celestia-full.service && \ systemctl restart celestia-full.service && \ journalctl -fu celestia-full.service -o cat
Часть 3
Build/Deploy sovereign Rollup using Rollkit / Run local chain
В этой части гайда, мы попробуем рассказать о том, как сделать Rollup и завести локальную цепь Celestia
спойлер - проще, чем кажется
Для начала установим переменные и экспортируем их в .bash_profile
BLOCKCHAIN_NAME="NAME_HERE" ADDR_PREFIX="PREFIX_HERE"
echo 'export BLOCKCHAIN_NAME='${BLOCKCHAIN_NAME} >> $HOME/.bash_profile echo 'export ADDR_PREFIX='${ADDR_PREFIX} >> $HOME/.bash_profile source $HOME/.bash_profile
Далее установим Docker, чуть позже он нам понадобится для старта локальной цепи Celestia
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
После установки Docker, запускаем локальную цепь скриптом
docker run --platform linux/amd64 -p 26650:26657 -p 26659:26659 ghcr.io/rollkit/local-celestia-devnet:v0.9.1
Проверяем, работает ли он, обычным запросом
Если все ок, он выведет такой ответ: {"denom":"utia","amount":"999995000000000"}
После запуска блокчейна, открываем отдельную сессию в нашем терминале и переходим туда
Все это можно делать через софт screen, но поскольку гайд для этого Rollup, не очень длинный, мы обойдемся без него, если вам удобнее работать со screen, все в ваших руках ;)
Давайте теперь разберемся с такой штукой, как Ignite CLI:
Ignite CLI - это простой в использовании инструмент CLI для создания и обслуживания суверенных блокчейнов, специфичных для конкретного приложения. Блокчейны, созданные с помощью Ignite CLI, используют Cosmos SDK и Tendermint.
Если хотите поближе познакомиться с данным софтом, велком сюда
Далее нам необходимо установить Ignite CLI
Проверяем, что все ок, а заодно и версию
Далее задаем имя нашего блокчейна и префикс адресов
Далее будем показывать какую-то часть со скриншотами, что бы не возникало вопросов
cd $HOME ignite scaffold chain $BLOCKCHAIN_NAME --address-prefix $ADDR_PREFIX
Для дальнейшего понимания, что мы делаем, надо рассказать, что такое Rollkit, как обычно сжато, если интересно - читайте здесь
Rollkit - это фреймворк для Rollup, который дает разработчикам свободу развертывания роллапов во всем модульном стеке, открывая новые возможности для быстрых экспериментов и инноваций.
Далее переходим в только что созданную директорию
В нашем случае - это mms-team
Сейчас нам необходимо заменить различные модули Tendermint на Rollkit
go mod edit -replace github.com/cosmos/cosmos-sdk=github.com/rollkit/cosmos-sdk@v0.46.7-rollkit-v0.7.3-no-fraud-proofs go mod edit -replace github.com/tendermint/tendermint=github.com/celestiaorg/tendermint@v0.34.22-0.20221202214355-3605c597500d go mod tidy go mod download
Качаем скрипт, который запустит наш блокчейн
wget https://raw.githubusercontent.com/rollkit/docs/main/docs/scripts/gm/init-local.sh
Добавляем переменные и экспортируем в .bash_profile
Добавим небольшие пояснения DENOM - это название вашей монеты BIN_FILE - это название вашего бинарного файла, который в процессе скрипта сгенерируется, что бы узнать имя вашего бинарного файла, надо всего-лишь добавить букву "d" к вашему BLOCKCHAIN_NAME, в нашем случае это будет mms-teamd
VALIDATOR_NAME=YOUR_VAL_NAME_HERE CHAIN_ID=YOUR_CHAIN_ID_HERE KEY_NAME=YOUR_WALLET_NAME_HERE KEY_2_NAME=YOUR_SECOND_WALLET_NAME_HERE DENOM=YOUR_DENOM_HERE BIN_FILE=YOUR_BLOCKCHAIN_NAMEd
echo 'export VALIDATOR_NAME='${VALIDATOR_NAME} >> $HOME/.bash_profile echo 'export CHAIN_ID='${CHAIN_ID} >> $HOME/.bash_profile echo 'export KEY_NAME='${KEY_NAME} >> $HOME/.bash_profile echo 'export KEY_2_NAME='${KEY_2_NAME} >> $HOME/.bash_profile echo 'export DENOM='${DENOM} >> $HOME/.bash_profile echo 'export BIN_FILE='${BIN_FILE} >> $HOME/.bash_profile source $HOME/.bash_profile
И редактируем его под наши переменные
sed -i.bak -e "s/^VALIDATOR_NAME*=.*/VALIDATOR_NAME=$VALIDATOR_NAME/" $HOME/mms-team/init-local.sh sed -i.bak -e "s/^CHAIN_ID*=.*/CHAIN_ID=$CHAIN_ID/" $HOME/mms-team/init-local.sh sed -i.bak -e "s/^KEY_NAME*=.*/KEY_NAME=$KEY_NAME/" $HOME/mms-team/init-local.sh sed -i.bak -e "s/^KEY_2_NAME*=.*/KEY_2_NAME=$KEY_2_NAME/" $HOME/mms-team/init-local.sh sed -i.bak -e "9,10 s/stake/$DENOM/" $HOME/mms-team/init-local.sh sed -i.bak -e "s/^gmd/$BIN_FILE/" $HOME/mms-team/init-local.sh
Он окончится ошибкой, зато мы сгенерировали нашу рабочую директорию и теперь можем до конца сменить наш деном, в уже готовом генезисе
Кто шарит - да, костыли никому не помешают
Наша новая рабочая директория будет называться так же, как и наш BLOCKCHAIN_NAME, только вначале будет стоять точка ".mms-team/"
Добавим переменную для удобства и экспортируем в .bash_profile
WORK_DIRECTORY=.$BLOCKCHAIN_NAME
echo 'export WORK_DIRECTORY='${WORK_DIRECTORY} >> $HOME/.bash_profile source $HOME/.bash_profile
Командой меняем denom "stake", на нужный
sed -i.bak -e "s/stake/$DENOM/" $HOME/$WORK_DIRECTORY/config/genesis.json
В процессе выполнения скрипта будут возникать некоторые ошибки, так же скрипт нас спросит о выполнении некоторых действий, везде отвечаем "n"
Вуаля, мы запустили свой блокчейн, со своими переменными
Что бы ничего не выдумать с сервисными файлами или со screen переходим в отдельную сессию терминала
Теперь в вашем распоряжении ваш личный Rollup, на локальной цепи Celestia
Можете делать, все что вам вздумается, тестировать разные штуки, которые боялись раньше в различных дьюнетах/тестнетах/мейнетах, все работает точно так же, как и в самом обычном космофорке
Просто, для примера посмотрим что у нас за кошельки, убедимся, что префикс, который мы задавали действительно поменялся, а так же посмотрим баланс и лист валидаторов
#Смотрим кошельки
$BIN_FILE keys list --keyring-backend test
#Смотрим баланс одного из кошельков $BIN_FILE q bank balances YOUR_ADDR_HERE
#Смотрим активсет нашего блокчейна $BIN_FILE q staking validators -o json --limit=1000 \ | jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' \ | jq -r '.tokens + " - " + .description.moniker' \ | sort -gr | nl
В общем здесь, вы можете воплотить все ваши самые смелые фантазии в реальность
Остановка локальной цепи Celestia и остановка нашего Rollup
Далее нам нужно остановить сети, которые мы запустили, для этого переходим во вкладку с нашим Rollup и нажимаем комбинацию клавиш "ctrl + c", после чего он остановится
Остановка и удаление контейнера с локальной цепью Celestia и остановка Rollup
Что бы остановить Rollup, который мы запустили, для этого переходим во вкладку с нашим Rollup и нажимаем комбинацию клавиш "ctrl + c", после чего он остановится
Проверяем активные контейнеры командой
В колонке "Container ID", соответственно мы видим наш id контейнера, копируем его. Что бы остановить и удалить его, пишем следующие команды:
docker stop YOUR_CONTAINER_ID && \ docker rm YOUR_CONTAINER_ID
Часть 3.1
Теперь, когда мы научились запускать наш блокчейн и локальную цепь Celestia мы сделаем так, что бы к нам в бинарный файл добавилась дополнительная команда, с выводом какого-либо текста.
Для начала нам необходимо запустить Celestia Light node, процесс установки описан в Part 2
Создаем запрос, отвечаем "y" на вопрос от Ignite
cd $HOME/$BLOCKCHAIN_NAME/ ignite scaffold query $BLOCKCHAIN_NAME --response text
Далее, что бы не плодить еще больше переменных, которых уже достаточно, я буду просто указывать, где, что и как надо изменить, с примерами, что бы добраться до нужного файла
Идем по такому пути, у вас он будет немного другой, как и конечное название файла, по сути тут будет везде имя вашего блокчейна Наш путь выглядит так:
nano x/mmsteam/keeper/query_mms_team.go Для тех кто не в курсе, двукратное нажатие кнопки "tab" показывает вам, что находится в директории, в таком случае становится гораздо проще искать, пользуйтесь
Когда вы открыли нужный файл, там нам необходимо добавить наш текст, в самом низу
Добавляем данный текст в фигурные скобки (у вас они будут пустые), все что в кавычках, вы можете спокойно менять на свое усмотрение, мы напишем:
Text: "Join us https://t.me/mmsnodes Peace to all'
Качаем новый скрипт по запуску Rollup, только на этот раз мы уже не будем запускать локальную цепь Celestia, мы будем общаться с настоящей тестовой цепью, с помощью LIght Node, установку которой мы описывали выше
wget https://raw.githubusercontent.com/rollkit/docs/main/docs/scripts/gm/init-testnet.sh
Видоизменяем скрипт под наши переменные
sed -i.bak -e "s/^VALIDATOR_NAME*=.*/VALIDATOR_NAME=$VALIDATOR_NAME/" $HOME/mms-team/init-testnet.sh sed -i.bak -e "s/^CHAIN_ID*=.*/CHAIN_ID=$CHAIN_ID/" $HOME/mms-team/init-testnet.sh sed -i.bak -e "s/^KEY_NAME*=.*/KEY_NAME=$KEY_NAME/" $HOME/mms-team/init-testnet.sh sed -i.bak -e "s/stake/$DENOM/" $HOME/mms-team/init-testnet.sh sed -i.bak -e "s/^gmd/$BIN_FILE/" $HOME/mms-team/init-testnet.sh
Удаляем прошлый бинарник и рабочую директорию
rm -r $HOME/go/bin/$BIN_FILE && \ rm -rf $HOME/$WORK_DIRECTORY
Переходим в наш каталог, откуда билдим бинарник и запускаем наш переделанный скрипт
Снова получаем ошибку "denom", как и в прошлый раз, меняем наш genesis
sed -i.bak -e "s/stake/$DENOM/" $HOME/$WORK_DIRECTORY/config/genesis.json
Запускаем снова скрипт и везде отвечаем "n"
Наблюдаем удачно запущенный блокчейн, с помощью Rollkit, но на этот раз с выходом в интернет, а не по локальной сети
И так, нам осталось совсем немного, остается составить и дать последнюю команду, которую мы создали
Наша команда выглядит таким образом $BIN_FILE q mmsteam mms-team Поясним, за каждое слово в команде BIN_FILE - переменнная с бинарным файлом q - стандартный модуль космоса для запросов mmsteam - наш созданный модуль текстового запроса mms-team - сам запрос
Как-то так мы научились создавать собственный блокчейн (Rollup), с помощью утилит Ignite и Rollkit, на основе Celestia, научились запускать локальный блокчейн, а так же создавать свои, хоть и простые(надо же с чего-то начинать), модули для своего блокчейна.
Большое спасибо, за внимание и уделенное время
Наш телеграмм канал по нодам — https://t.me/mmsnodes
Наш телеграмм чат по нодам - https://t.me/mmsnodeschat
Наш телеграмм канал по экосистеме Cosmos - https://t.me/cosmochannel_mms