June 6, 2022

Celestia гайд по установке

Celestia — первая модульная Blockchain-сеть консенсуса и данных, созданная для того, чтобы каждый мог легко развернуть свой собственный блокчейн с минимальными расходами.

Команда проекта состоит из опытных разработчиков, имевших опыт работы с Ethereum Classic, Harmony и Optimistic Rollups, а также в Oracle, Google, Xerox и Facebook.

Уже успели провести Seed - раунд инвестиций. Собрали более $1.5 миллиона - основными инвесторами стали Binance Labs и Interchain Foundation.

Остальные инвесторы в раунде:

  • Maven11 (🚩)
  • KR1
  • Signature Ventures
  • Divergence Ventures ()
  • Dokia Capital

Опираясь на "Таблицу Инвесторов", видим 2 RedFlag-а, но забегая вперед - нода дешевая, а проект многообещающий. Перейдем к сути.

Сейчас ребята из Celestia дали нам возможность поставить ноду и отправить заявку на testnet.

Социальные сети проекта

Discord
Telegram
Twitter
Forum

Подготовка к установке

Для установки ноды мы арендуем сервер. Как это сделать - я думаю вы итак знаете. По поводу установки на сервер, где уже стоит другая(-ие) ноды - смотрите сами на загруженность сервера. На данный момент есть возможность ставить два сет-апа: Full Node + Bridge или Lite Node. Требования к оборудованию практически одинаковые, изменяется только объем диска. В этой часте будет описано как установить Full Noe +

Требования к серверу для Full Node + Bridge:

  • OS - Ubuntu 20.04
  • CPU - 4 CPU (Тестирую на 2 ядра)
  • SSD - 100+gb (Тест с 150gb)
  • RAM - 8gb (Тест с 4gb)

Далее будут указаны команды, которые необходимо поочередно вводить (за неимением скрипта от NodesGuru☺️).


Установка ноды

Ctrl+C каждую строчку по очереди в Терминал или любую другую программу, которую используете.

sudo apt update && sudo apt upgrade -y
sudo apt install curl tar wget clang pkg-config libssl-dev jq build-essential bsdmainutils git make ncdu -y
cd $HOME
ver="1.17.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
Командами выше обновили ПО на сервере и установили язык GO
Если версия 1.17.2 - все гуд и продолжаем
Установка Celestia App, составной части ноды
cd $HOME
rm -rf celestia-app
git clone https://github.com/celestiaorg/celestia-app.git
cd celestia-app/
git checkout 63519ec
make install
Далее проверим все ли в порядке
Окончание логов. Если все примерно так - продолжаем
# OUTPUT 
# name: "" 
# server_name: <appd> 
# version: "" 
# commit: "" 
# build_tags: "" 
# go: go version go1.17.2 linux/amd64 
# build_deps: # - filippo.io/[email protected] 
# - github.com/99designs/[email protected] => github.com/cosmos/[email protected] 
# - github.com/ChainSafe/[email protected] 
# ... 
# cosmos_sdk_version: v0.44.0
Полный результат после создания кошелька
celestia-appd keys add "YOUR OWN NAME"
Пароль придумываем и дважды вводим. ОБЯЗАТЕЛЬНО сохраняем все данные (кошелек:приват ключ). Так как мы впервые создали кошелек, mnemonic phrase будет написана ниже.
cd $HOME 
rm -rf networks 
git clone https://github.com/celestiaorg/networks.git 
Замените MY_NODE и MY_WALLET на свои данные. Имя может быть любым, а кошелек мы уже получили выше
CELESTIA_NODENAME="MY_NODE" 
CELESTIA_WALLET="MY_WALLET" 
CELESTIA_CHAIN="devnet-2"
Сохраняем введенные выше переменные
echo 'export CELESTIA_CHAIN='$CELESTIA_CHAIN >> $HOME/.bash_profile 
echo 'export CELESTIA_NODENAME='${CELESTIA_NODENAME} >> $HOME/.bash_profile 
echo 'export CELESTIA_WALLET='${CELESTIA_WALLET} >> $HOME/.bash_profile source $HOME/.bash_profile 
Запустим Celestia
celestia-appd init $CELESTIA_NODENAME --chain-id $CELESTIA_CHAIN
В итоге получим такой аутпут:
{"app_message":{"auth":{"accounts":[],"params":{"max_memo_characters":"256","sig_verify_cost_ed25519":"590","sig_verify_cost_secp256k1":"1000","tx_sig_limit":"7","tx_size_cost_per_byte":"10"}},"bank":{"balances":[],"denom_metadata":[],"params":{"default_send_enabled":true,"send_enabled":[]},"supply":[]},"capability":{"index":"1","owners":[]},"crisis":{"constant_fee":{"amount":"1000","denom":"stake"}},"distribution":{"delegator_starting_infos":[],"delegator_withdraw_infos":[],"fee_pool":{"community_pool":[]},"outstanding_rewards":[],"params":{"base_proposer_reward":"0.010000000000000000","bonus_proposer_reward":"0.040000000000000000","community_tax":"0.020000000000000000","withdraw_addr_enabled":true},"previous_proposer":"","validator_accumulated_commissions":[],"validator_current_rewards":[],"validator_historical_rewards":[],"validator_slash_events":[]},"evidence":{"evidence":[]},"feegrant":{"allowances":[]},"genutil":{"gen_txs":[]},"ibc":{"channel_genesis":{"ack_sequences":[],"acknowledgements":[],"channels":[],"commitments":[],"next_channel_sequence":"0","receipts":[],"recv_sequences":[],"send_sequences":[]},"client_genesis":{"clients":[],"clients_consensus":[],"clients_metadata":[],"create_localhost":false,"next_client_sequence":"0","params":{"allowed_clients":["06-solomachine","07-tendermint"]}},"connection_genesis":{"client_connection_paths":[],"connections":[],"next_connection_sequence":"0","params":{"max_expected_time_per_block":"30000000000"}}},"mint":{"minter":{"annual_provisions":"0.000000000000000000","inflation":"0.130000000000000000"},"params":{"blocks_per_year":"6311520","goal_bonded":"0.670000000000000000","inflation_max":"0.200000000000000000","inflation_min":"0.070000000000000000","inflation_rate_change":"0.130000000000000000","mint_denom":"stake"}},"params":null,"payment":{},"slashing":{"missed_blocks":[],"params":{"downtime_jail_duration":"600s","min_signed_per_window":"0.500000000000000000","signed_blocks_window":"100","slash_fraction_double_sign":"0.050000000000000000","slash_fraction_downtime":"0.010000000000000000"},"signing_infos":[]},"staking":{"delegations":[],"exported":false,"last_total_power":"0","last_validator_powers":[],"params":{"bond_denom":"stake","historical_entries":10000,"max_entries":7,"max_validators":100,"unbonding_time":"1814400s"},"redelegations":[],"unbonding_delegations":[],"validators":[]},"transfer":{"denom_traces":[],"params":{"receive_enabled":true,"send_enabled":true},"port_id":"transfer"},"upgrade":{},"vesting":{}},"chain_id":"devnet-2","gentxs_dir":"","moniker":"MY_NODE","node_id":"76a5e790757df25d50fdc569b8a60b286ebeaa9a"}
Проверяем, что у нас стоит именно devnet-2 сеть и имя MY_NODE указано верно
NODE_ID сохраняем, возможно понадобиться в будущем
cp $HOME/networks/devnet-2/genesis.json $HOME/.celestia-app/config/
SEEDS="[email protected]:26656"
PEERS="[email protected]:26656"
sed -i.bak -e "s/^seeds *=.*/seeds = \"$SEEDS\"/; s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.celestia-app/config/config.toml
external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address = \"\"/external_address = \"$external_address:26656\"/" $HOME/.celestia-app/config/config.toml
sed -i 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:26657"#g' $HOME/.celestia-app/config/config.toml
sed -i 's/timeout_commit = "5s"/timeout_commit = "15s"/g' $HOME/.celestia-app/config/config.toml
sed -i 's/index_all_keys = false/index_all_keys = true/g' $HOME/.celestia-app/config/config.toml
sed -i '/\[api\]/{:a;n;/enabled/s/false/true/;Ta};/\[api\]/{:a;n;/enable/s/false/true/;Ta;}' $HOME/.celestia-app/config/app.toml
pruning="custom"
pruning_keep_recent="100"
pruning_keep_every="5000"
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-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.celestia-app/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.celestia-app/config/app.toml
celestia-appd unsafe-reset-all
wget -O $HOME/.celestia-app/config/addrbook.json "https://raw.githubusercontent.com/maxzonder/celestia/main/addrbook.json"
celestia-appd config chain-id $CELESTIA_CHAIN
celestia-appd config keyring-backend test
sudo tee /etc/systemd/system/celestia-appd.service > /dev/null <<EOF
[Unit]
Description=celestia-appd Cosmos daemon
After=network-online.target
[Service]
User=$USER
ExecStart=$(which celestia-appd) start
Restart=on-failure
RestartSec=3
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable celestia-appd
sudo systemctl daemon-reload
sudo systemctl restart celestia-appd && journalctl -u celestia-appd.service -f
Нода установлена. Так сказать - мы прошли половину пути. Далее мониторим сихнронизацию ноды командой curl -s localhost:26657/status | jq .result.sync_info. В строке с "Catching_up" мы должны увидеть False.
False и все остальные строчки заполнены
cd $HOME
rm -rf celestia-node
git clone https://github.com/celestiaorg/celestia-node.git
cd celestia-node
git checkout v0.1.1
make install
Запустится процесс установки полной ноды. Да, именно для этого нам потребуется 100+ гигов SSD
TRUSTED_SERVER="http://localhost:26657"
TRUSTED_HASH=$(curl -s $TRUSTED_SERVER/status | jq -r .result.sync_info.latest_block_hash)
echo $TRUSTED_HASH
Примерный аутпут
4632277C441CA6155C4374AC56048CF4CFE3CBB2476E07A548644435980D5E17

# IF OUTPUT OK! - DO NEXT ->

echo 'export TRUSTED_SERVER='${TRUSTED_SERVER} >> $HOME/.bash_profile
echo 'export TRUSTED_HASH='${TRUSTED_HASH} >> $HOME/.bash_profile
source $HOME/.bash_profile
celestia full init --core.remote $TRUSTED_SERVER --headers.trusted-hash $TRUSTED_HASH
sed -i.bak -e 's/PeerExchange = false/PeerExchange = true/g' $HOME/.celestia-full/config.toml
sudo tee /etc/systemd/system/celestia-full.service > /dev/null <<EOF
[Unit] 
 Description=celestia-full node 
 After=network-online.target 
[Service] 
 User=$USER 
 ExecStart=$(which celestia) full start 
 Restart=on-failure 
 RestartSec=10 LimitNOFILE=4096 
[Install] 
 WantedBy=multi-user.target 
EOF

sudo systemctl enable celestia-full

sudo systemctl daemon-reload

sudo systemctl restart celestia-full && sleep 10 && journalctl -u celestia-full -o cat -n 10000 --no-pager | grep -m 1 "* /ip4/" > $HOME/multiaddress.txt

cat $HOME/multiaddress.txt

Примерно так должен выглядеть аутпут после всех команд
FULL_NODE_IP=$(cat $HOME/multiaddress.txt | sed -r 's/^.{3}//')
echo 'export FULL_NODE_IP='${FULL_NODE_IP} >> $HOME/.bash_profile
source $HOME/.bash_profile
journalctl -u celestia-full -o cat -f
После пойдут логи, жмем Ctrl+C чтобы выйти из режима логирования
echo -e "$FULL_NODE_IP\n$TRUSTED_HASH"
Сверим переменные
rm -rf $HOME/.celestia-light
celestia light init --headers.trusted-peer $FULL_NODE_IP --headers.trusted-hash $TRUSTED_HASH
port=2122
sed -i.bak -e "s|ListenAddresses *=.*|ListenAddresses = \[\"/ip4/0.0.0.0/tcp/$port\", \"/ip6/::/tcp/$port\"\]|" $HOME/.celestia-light/config.toml
sed -i.bak -e "s|NoAnnounceAddresses *=.*|NoAnnounceAddresses = \[\"/ip4/0.0.0.0/tcp/$port\", \"/ip4/127.0.0.1/tcp/$port\", \"/ip6/::/tcp/$port\"\]|" $HOME/.celestia-light/config.toml
Меняем порт под Light Client

sudo tee /etc/systemd/system/celestia-light.service > /dev/null <<EOF

[Unit] 
 Description=celestia-light 
 After=network-online.target 
[Service] 
 User=$USER 
 ExecStart=$(which celestia) light start 
 Restart=on-failure 
 RestartSec=10 
 LimitNOFILE=4096 
[Install] 
 WantedBy=multi-user.target 
EOF
Здесь мы создали новое окружение для Light Client
sudo systemctl enable celestia-light
sudo systemctl daemon-reload
sudo systemctl restart celestia-light && journalctl -u celestia-light -f -o cat
После этого нам остается чекнуть логи и удостовериться, что все прекрасно работает
Здесь мы получили финальные логи по ноде. Ctrl+C для выхода

Команды для мониторинга

curl -s localhost:26657/status | jq .result.sync_info
Команда для проверки статуса ноды. Всегда проверяйте, чтобы в конце вы получали False
celestia-appd q bank balances $CELESTIA_ADDR
Проверка кошелька (В данный момент не требуется ибо в установке валидатора нет смысла из-за лимита)