OJO: Installation Guide
Lava Network создает уровень децентрализованной инфраструктуры для удаленных вызовов процедур блокчейна - peer-to-peer RPC сеть. Данное решение позволит Web3 компаниям устранить зависимость от централизованных RPC нод, что уменьшит уязвимость и вероятность быть скомпрометированным.
Тестнет эксплорер - http://explorer.nodera.org/ojo/staking
Website
Discord
Whitepaper
Оглавление
- Подготовка сервера
- Установка ноды
- Snapshot (опционально)
- Создание кошелька и валидатора
- Обновление v0.7.0
- Удаление ноды
- Полезные команды
Подготовка сервера
На данном этапе устанавливаю на сервере Hetzner - CPX31: 4 CPU, 8 GB RAM, 160 GB SSD.
sudo apt update && sudo apt upgrade -y
Устанавливаем инструменты разработчика и необходимые пакеты
sudo apt install curl build-essential pkg-config libssl-dev git wget jq make gcc tmux chrony -y
wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz; \ rm -rv /usr/local/go; \ tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz && \ rm -v go1.19.5.linux-amd64.tar.gz && \ echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profile && \ source ~/.bash_profile && \ go version
Установка ноды
cd $HOME git clone https://github.com/ojo-network/ojo.git cd ojo git checkout v0.1.2 make install
ojod version #0.0.2-alpha-11
MONIKER_OJO=вводим свое имя CHAIN_ID_OJO=ojo-devnet PORT_OJO=40
Сохраняем переменные, перезагружаем .bash_profile и проверяем значения переменных
echo "export MONIKER_OJO="${MONIKER_OJO}"" >> $HOME/.bash_profile echo "export CHAIN_ID_OJO="${CHAIN_ID_OJO}"" >> $HOME/.bash_profile echo "export PORT_OJO="${PORT_OJO}"" >> $HOME/.bash_profile source $HOME/.bash_profile echo -e "\nmoniker_OJO > ${MONIKER_OJO}.\n" echo -e "\nchain_id_OJO > ${CHAIN_ID_OJO}.\n" echo -e "\nport_OJO > ${PORT_OJO}.\n"
ojod config chain-id $CHAIN_ID_OJO ojod config keyring-backend test ojod config node tcp://localhost:${PORT_OJO}657 sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0.000uojo\"/" $HOME/.ojo/config/app.toml
ojod init $MONIKER_OJO --chain-id $CHAIN_ID_OJO
curl -s https://rpc.devnet-n0.ojo-devnet.node.ojo.network/genesis | jq -r .result.genesis > $HOME/.ojo/config/genesis.json
peers="6f304029cb1b7fbcbe1359d57cbb69ae8dbcccfc@207.180.243.64:36656,5af3d50dcc231884f3d3da3e3caecb0deef1dc5b@142.132.134.112:25356,62fa77951a7c8f323c0499fff716cd86932d8996@65.108.199.36:24214,9edc978fd53c8718ef0cafe62ed8ae23b4603102@136.243.103.32:36656,ac5089a8789736e2bc3eee0bf79ca04e22202bef@162.55.80.116:29656,bd35cfd5bfbea4c2a63e893860d4f9a7d880957c@213.239.217.52:45656,408ee86160af26ee7204d220498e80638f7874f4@161.97.109.47:38656,c37e444f67af17545393ad16930cd68dc7e3fd08@95.216.7.169:61156,fbeb2b37fe139399d7513219e25afd9eb8f81f4f@65.21.170.3:38656,239caa37cb0f131b01be8151631b649dc700cd97@95.217.200.36:46656,e54b02d103f1fcf5189a86abe542670979d2029d@65.109.85.170:58656,9bcec17faba1b8f6583d37103f20bd9b968ac857@38.146.3.230:21656,1145755896d6a3e9df2f130cc2cbd223cdb206f0@209.145.53.163:29656,b0968b57bcb5e527230ef3cfa3f65d5f1e4647dd@35.212.224.95:26656,8671c2dbbfd918374292e2c760704414d853f5b7@35.215.121.109:26656,2691bb6b296b951400d871c8d0bd94a3a1cdbd52@65.109.93.152:33656,cbe534c7d012e9eb4e71a5573aee8acc1adf4bc6@65.108.41.172:28056,a23cc4cbb09108bc9af380083108262454539aeb@35.215.116.65:26656,3d11a6c7a5d4b3c5752be0c252c557ed4acc2c30@167.235.57.142:36656,b6b4a4c720c4b4a191f0c5583cc298b545c330df@65.109.28.219:21656" sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.ojo/config/config.toml
Изменяем порты для возможности дальнейшего подселения других нод проектов экосистемы Космос на один сервер
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:${PORT_OJO}658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:${PORT_OJO}657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:${PORT_OJO}060\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:${PORT_OJO}656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":${PORT_OJO}660\"%" $HOME/.ojo/config/config.toml sed -i.bak -e "s%^address = \"tcp://0.0.0.0:1317\"%address = \"tcp://0.0.0.0:${PORT_OJO}317\"%; s%^address = \":8080\"%address = \":${PORT_OJO}080\"%; s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:${PORT_OJO}090\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:${PORT_OJO}091\"%" $HOME/.ojo/config/app.toml
pruning="custom" pruning_keep_recent="100" pruning_keep_every="0" pruning_interval="10" sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.ojo/config/app.toml sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.ojo/config/app.toml sed -i -e "s/^pruning-keep-every *=.*/pruning-keep-every = \"$pruning_keep_every\"/" $HOME/.ojo/config/app.toml sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.ojo/config/app.toml
ojod tendermint unsafe-reset-all --home $HOME/.ojo
printf "[Unit] Description=Ojo Service After=network.target [Service] Type=simple User=$USER ExecStart=$(which ojod) start Restart=on-failure RestartSec=10 LimitNOFILE=65535 [Install] WantedBy=multi-user.target" > /etc/systemd/system/ojod.service
Запускаем сервис и проверяем логи
sudo systemctl daemon-reload && sudo systemctl enable ojod && \ sudo systemctl restart ojod && \ sudo journalctl -u ojod -f -o cat
Ждем окончания синхронизации, проверить синхронизации можно командой
ojod status 2>&1 | jq .SyncInfo
Если вывод показывает false, синхронизация завершена.
State sync
Останавливаем ноду и удаляем данные
sudo systemctl stop ojod ojod tendermint unsafe-reset-all --home $HOME/.ojo --keep-addr-book
STATE_SYNC_RPC="https://ojo-testnet-rpc.polkachu.com:443" LATEST_HEIGHT=$(curl -s $STATE_SYNC_RPC/block | jq -r .result.block.header.height) SYNC_BLOCK_HEIGHT=$(($LATEST_HEIGHT - 2000)) SYNC_BLOCK_HASH=$(curl -s "$STATE_SYNC_RPC/block?height=$SYNC_BLOCK_HEIGHT" | jq -r .result.block_id.hash) echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH sed -i \ -e "s|^enable *=.*|enable = true|" \ -e "s|^rpc_servers *=.*|rpc_servers = \"$STATE_SYNC_RPC,$STATE_SYNC_RPC\"|" \ -e "s|^trust_height *=.*|trust_height = $SYNC_BLOCK_HEIGHT|" \ -e "s|^trust_hash *=.*|trust_hash = \"$SYNC_BLOCK_HASH\"|" \ -e "s|^persistent_peers *=.*|persistent_peers = \"$STATE_SYNC_PEER\"|" \ $HOME/.ojo/config/config.toml
Перезапускаем ноду и ждем синхронизации
sudo systemctl restart ojod && sudo journalctl -u ojod -f -o cat
Создание кошелька и валидатора
ojod keys add $MONIKER_OJO
Сохраняем мнемоник фразу в надежном месте!
Если вы участвовали в предыдущих тестнетах, восстанавливаем кошелек командой и вводим мнемоник фразу
ojod keys add $MONIKER_OJO --recover
Создаем переменную с адресом кошелька и валидатора
WALLET_OJO=$(ojod keys show $MONIKER_OJO -a) VALOPER_OJO=$(ojod keys show $MONIKER_OJO --bech val -a) echo "export WALLET_OJO="${WALLET_OJO}"" >> $HOME/.bash_profile echo "export VALOPER_OJO="${VALOPER_OJO}"" >> $HOME/.bash_profile source $HOME/.bash_profile echo -e "\nwallet_OJO > ${WALLET_OJO}.\n" echo -e "\nvaloper_OJO > ${VALOPER_OJO}.\n"
ojod q bank balances $WALLET_OJO
После завершения синхронизации и пополнения кошелька, создаем валидатора
ojod tx staking create-validator \ --amount 9500000000uojo \ --from $WALLET_OJO \ --commission-rate "0.07" \ --commission-max-rate "0.20" \ --commission-max-change-rate "0.1" \ --min-self-delegation "1" \ --pubkey=$(ojod tendermint show-validator) \ --moniker $MONIKER_OJO \ --chain-id "ojo-devnet" \ --identity="" \ --details="" \ --website="nodera.org" \ --gas=auto \ -y
Проверяем своего валидатора в эксплорере - http://explorer.nodera.org/lava/staking
Мониторинг можно настроить с использованием Panic! бота по гайду - https://nodera.org/panic_bot
Установка price feeder
cd $HOME git clone https://github.com/ojo-network/price-feeder && cd price-feeder git checkout v0.1.1 make install
price-feeder version # commit: 5d46ed438d33d7904c0d947ebc6a3dd48ce0de59
mkdir -p $HOME/price-feeder_config wget -O $HOME/price-feeder_config/price-feeder.toml "https://raw.githubusercontent.com/ojo-network/price-feeder/main/price-feeder.example.toml" sed -i '/^dir *=.*/a pass = ""' $HOME/price-feeder_config/price-feeder.toml
ojod keys add feeder_ojo --keyring-backend os
PASSWORD_OJO=<вводим_свoй_пароль> FEEDER_OJO=$(ojod keys show feeder_ojo -a) echo "export FEEDER_OJO="${FEEDER_OJO}"" >> $HOME/.bash_profile echo "export PASSWORD_OJO="${PASSWORD_OJO}"" >> $HOME/.bash_profile source $HOME/.bash_profile echo -e "\nfeeder_OJO > ${FEEDER_OJO}.\n" echo -e "\npassword_OJO > ${PASSWORD_OJO}.\n"
ОТправляем немного токенов на кошелек фидера
ojod tx bank send $WALLET_OJO $FEEDER_OJO 100000000uojo --fees 20000uojo
ojod tx oracle delegate-feed-consent $WALLET_OJO $FEEDER_OJO --from tRDM --gas-adjustment 1.4 --gas auto --gas-prices 0uojo -y
ojod q oracle feeder-delegation $VALOPER_OJO
Вносим изменения в price-feeder.toml
sed -i "s/^address *=.*/address= \"$WALLET_OJO\"/;\ s/^chain_id *=.*/chain_id= \"$CHAIN_ID_OJO\"/;\ s/^validator *=.*/validator = \"$VALOPER_OJO\"/;\ s/^backend *=.*/backend = \"os\"/;\ s|^dir *=.*|dir = \"$HOME/.ojo\"|;\ s|^pass *=.*|pass = \"$PASSWORD_OJO\"|;\ s|^grpc_endpoint *=.*|grpc_endpoint = \"localhost:${PORT_OJO}090\"|;\ s|^tmrpc_endpoint *=.*|tmrpc_endpoint = \"http://localhost:${PORT_OJO}657\"|;" $HOME/price-feeder_config/price-feeder.toml
printf "[Unit] Description=Ojo Feeder After=network.target [Service] Type=simple Environment="PRICE_FEEDER_PASS=$PASSWORD_OJO" User=$USER ExecStart=$(which price-feeder) $HOME/price-feeder_config/price-feeder.toml Restart=on-failure RestartSec=10 LimitNOFILE=65535 [Install] WantedBy=multi-user.target" > /etc/systemd/system/price-feeder.service
Запускаем сервис и проверяем логи
systemctl daemon-reload systemctl enable price-feeder systemctl restart price-feeder journalctl -u price-feeder -f -o cat
Для работы фидера ваша валидатор должен быть в активе
Делегируем полномочия отдельно созданному кошельку OJO_FEEDER_ADDR
ojod tx oracle delegate-feed-consent $OJO_ADDR $OJO_FEEDER_ADDR --fees 40000uojo
Вносим изменения в price-feeder.toml
sed -i "s/^address *=.*/address= \"$OJO_FEEDER_ADDR\"/" $HOME/price-feeder_config/price-feeder.toml systemctl restart price-feeder && journalctl -u price-feeder -f -o cat
Также можно проверить транзакции через explorer
# проверить slash-window ojod q oracle slash-window # проверить miss-counter валидатора ojod q oracle miss-counter <ojovaloper13y7...> # проверить текущие ставки валидатора http://localhost:7171/api/v1/prices
systemctl stop price-feeder && \ systemctl disable price-feeder && \ rm /etc/systemd/system/price-feeder.service && \ systemctl daemon-reload && \ cd $HOME && \ rm -rf price-feeder*
ojod tx bank send $WALLET_OJO $FEEDER_OJO 1000000uojo --fees 200uojo --home $HOME/.ojo
ojod tx oracle delegate-feed-consent $WALLET_OJO $FEEDER_OJO --fees 400uojo --home $HOME/.ojo
sed -i "s/^address =./address= "$FEEDER_OJO"/" $HOME/price-feeder_config/price-feeder.toml
Удаление ноды
Перед удалением ноды убедитесь, что сохранены файлы из каталога /root/.lava/config
Для удаления ноды используйте следующие команды
sudo systemctl stop ojod sudo systemctl disable ojod sudo rm -rf $HOME/.ojo sudo rm -rf $HOME/ojo sudo rm -rf /etc/systemd/system/ojod.service sudo rm -rf /usr/local/bin/ojod sudo systemctl daemon-reload
Полезные команды
sudo systemctl restart ojod
sudo journalctl -u ojod -f -o cat
ojod keys show $MONIKER_OJO --bech val -a
Делегировать токены валидатору
ojod tx staking delegate $VALOPER_OJO 9000000uojo --from $WALLET_OJO --chain-id $CHAIN_ID_OJO --gas=auto
ojod tx staking edit-validator --identity="" --details="" --website="" \ --from $WALLET_OJO --chain-id $CHAIN_ID_OJO --gas=auto -y #identity - PGP ключ c keybase.io (устанавливает аватар валидатора) #details - текстовое описание валидатора