March 26, 2023

OJO: Installation Guide

Lava Network создает уровень децентрализованной инфраструктуры для удаленных вызовов процедур блокчейна - peer-to-peer RPC сеть. Данное решение позволит Web3 компаниям устранить зависимость от централизованных RPC нод, что уменьшит уязвимость и вероятность быть скомпрометированным.

Тестнет эксплорер - http://explorer.nodera.org/ojo/staking

DYOR:

Website
Discord
Twitter
Whitepaper

Оглавление


Подготовка сервера

Оглавление

На данном этапе устанавливаю на сервере 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

Устанавливаем GO

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 - текстовое описание валидатора

Nodera

Telegram | Discord | Twitter