MAINNET
December 21, 2023

Dora Factory

Web Discord Github

Testnet details

# проверяем статус prevotes/precommits
FOLDER=.dora

# узнать порт RPC
echo -e "\033[0;32m$(grep -A 3 "\[rpc\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+")\033[0m"

PORT=<ввести свой порт>

# Проверка prevotes/precommits. Пригодится при обновах
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].prevotes_bit_array' && \
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].precommits_bit_array'

UPD 🕊 (Высота обновления: )

cd
rm -rf doravota
git clone https://github.com/DoraFactory/doravota && cd doravota
git checkout 
make build
$HOME/doravota/build/dorad version --long
# version: 
# commit: 

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!
systemctl stop dorad
mv $HOME/doravota/build/dorad $(which dorad)
dorad version --long | grep -e version -e commit
# 

systemctl restart dorad && journalctl -u dorad -f -o cat

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

# обновляем репозитории
apt update && sudo apt upgrade -y

# устанавливаем необходимые утилиты
apt install curl build-essential git wget jq make gcc tmux htop nvme-cli pkg-config libssl-dev libleveldb-dev tar clang bsdmainutils ncdu unzip libleveldb-dev -y

# проверяем работу жестких дисков
curl -sL yabs.sh | bash -s — -ig

# проверяем работу интернета
curl -sL yabs.sh | bash -s — -fg

File2Ban - подробнее здесь

# устанавливаем и копируем конфиг, который будет иметь больший приоритет
apt install fail2ban -y && \
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local && \
nano /etc/fail2ban/jail.local
# раскомментировать и добавить свой IP: ignoreip = 127.0.0.1/8 ::1 <ip>
systemctl restart fail2ban

# проверяем status 
systemctl status fail2ban
# проверяем, какие jails активны (по умолчанию только sshd)
fail2ban-client status
# проверяем статистику по sshd
fail2ban-client status sshd
# смотрим логи
tail /var/log/fail2ban.log
# останавливаем работу и удаляем с автозагрузки
#systemctl stop fail2ban && systemctl disable fail2ban

Устанавливаем Go ОДНОЙ КОМАНДОЙ

ver="1.21.3" && \
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

Новая установка ноды

ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>

Устанавливаем бинарники

git clone https://github.com/DoraFactory/doravota && cd doravota
git checkout 0.3.1
make install

dorad version --long | grep -e version -e commit -e build
# version: 0.3.1
# commit: 

Инициализируем ноду, чтобы создать необходимые файлы конфигурации

dorad init UTSA_guide --chain-id vota-ash

Скачиваем Genesis

wget -O $HOME/.dora/config/genesis.json "https://raw.githubusercontent.com/DoraFactory/doravota/main/config/mainnet/genesis.json"

# Проверим генезис
sha256sum ~/.dora/config/genesis.json
# bb1f3841ad636a8dc5320ca39266adc00f27c312d0e73eb35f8a4384306bcbd6

Проверяем, что состояние валидатора на начальном этапе

cd && cat .dora/data/priv_validator_state.json
{
  "height": "0",
  "round": 0,
  "step": 0
}

# если нет, то выполняем команду
dorad unsafe-reset-all --home $HOME/.dora

Скачиваем Addr book

wget -O $HOME/.dora/config/addrbook.json "https://share.utsa.tech/dora/addrbook.json"

Настраиваем конфигурацию ноды

# правим конфиг, благодаря чему мы можем больше не использовать флаг chain-id для каждой команды CLI в client.toml
dorad config chain-id vota-ash

# при необходимости настраиваем keyring-backend в client.toml 
dorad config keyring-backend os

# настраиваем минимальную цену за газ в app.toml
sed -i.bak -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"100000000000peaka\"/;" ~/.dora/config/app.toml

# добавляем seeds/bpeers/peers в config.toml
external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:26656\"/" $HOME/.dora/config/config.toml

peers="[email protected]:26656,[email protected]:26656,[email protected]:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.dora/config/config.toml
seeds=""
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.dora/config/config.toml

# увеличиваем количество входящих и исходящих пиров для подключения, за исключением постоянных пиров в config.toml
sed -i 's/max_num_inbound_peers =.*/max_num_inbound_peers = 40/g' $HOME/.dora/config/config.toml
sed -i 's/max_num_outbound_peers =.*/max_num_outbound_peers = 10/g' $HOME/.dora/config/config.toml

# настраиваем фильтрацию "плохих" peers
sed -i -e "s/^filter_peers *=.*/filter_peers = \"true\"/" $HOME/.dora/config/config.toml

(ОПЦИОНАЛЬНО) Настраиваем прунинг одной командой вapp.toml

pruning="custom"
pruning_keep_recent="1000"
pruning_interval="10"
sed -i -e "s/^pruning *=.*/pruning = \"$pruning\"/" $HOME/.dora/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"$pruning_keep_recent\"/" $HOME/.dora/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"$pruning_interval\"/" $HOME/.dora/config/app.toml

(ОПЦИОНАЛЬНО) Выкл индексацию вconfig.toml

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

(ОПЦИОНАЛЬНО) Вкл/выкл снэпшоты вapp.toml

# По умолчанию снэпшоты выключены "snapshot-interval=0"
snapshot_interval=1000
sed -i.bak -e "s/^snapshot-interval *=.*/snapshot-interval = \"$snapshot_interval\"/" ~/.dora/config/app.toml

(ОПЦИОНАЛЬНО) Смена портов #для 2 ноды

# config.toml
sed -i.bak -e "s%^proxy_app = \"tcp://127.0.0.1:26658\"%proxy_app = \"tcp://127.0.0.1:36658\"%; s%^laddr = \"tcp://127.0.0.1:26657\"%laddr = \"tcp://127.0.0.1:36657\"%; s%^pprof_laddr = \"localhost:6060\"%pprof_laddr = \"localhost:6061\"%; s%^laddr = \"tcp://0.0.0.0:26656\"%laddr = \"tcp://0.0.0.0:36656\"%; s%^prometheus_listen_addr = \":26660\"%prometheus_listen_addr = \":36660\"%" $HOME/.dora/config/config.toml

# app.toml
sed -i.bak -e "s%^address = \"0.0.0.0:9090\"%address = \"0.0.0.0:9190\"%; s%^address = \"0.0.0.0:9091\"%address = \"0.0.0.0:9191\"%" $HOME/.dora/config/app.toml

# client.toml
sed -i.bak -e "s%^node = \"tcp://localhost:26657\"%node = \"tcp://localhost:36657\"%" $HOME/.dora/config/client.toml

external_address=$(wget -qO- eth0.me)
sed -i.bak -e "s/^external_address *=.*/external_address = \"$external_address:36656\"/" $HOME/.dora/config/config.toml

Подробнее о смене портов здесь

(ОПЦИОНАЛЬНО) State Sync

# при необходимости скачиваем wasm
curl -L https://share.utsa.tech/dora/wasm-dora.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.dora --strip-components 2
# добавляем пир
peers="[email protected]:60556"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.dora/config/config.toml
#SNAP_RPC=https://vota-rpc.dorafactory.org:443
SNAP_RPC=https://m-dora.rpc.utsa.tech/:443

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height); \
BLOCK_HEIGHT=$((LATEST_HEIGHT - 1000)); \
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

echo $LATEST_HEIGHT $BLOCK_HEIGHT $TRUST_HASH

sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\1true| ; \
s|^(rpc_servers[[:space:]]+=[[:space:]]+).*$|\1\"$SNAP_RPC,$SNAP_RPC\"| ; \
s|^(trust_height[[:space:]]+=[[:space:]]+).*$|\1$BLOCK_HEIGHT| ; \
s|^(trust_hash[[:space:]]+=[[:space:]]+).*$|\1\"$TRUST_HASH\"| ; \
s|^(seeds[[:space:]]+=[[:space:]]+).*$|\1\"\"|" $HOME/.dora/config/config.toml

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

tee /etc/systemd/system/dorad.service > /dev/null <<EOF
[Unit]
Description=dorad
After=network-online.target

[Service]
User=$USER
ExecStart=$(which dorad) start
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable dorad
systemctl restart dorad && journalctl -u dorad -f -o cat

Если после старта нода долго не может подцепиться к пирам, то ищем новые пиры или просим addrbook.json в дискорд

# стопаем ноду и сбрасываем данные
systemctl stop dorad
dorad unsafe-reset-all --home $HOME/.dora --keep-addr-book

# перезагружаем ноду
systemctl restart dorad && journalctl -u dorad -f -o cat

Создаем или восстанавливаем кошелек и сохраняем вывод

# создать кошелек
dorad keys add <name_wallet> --keyring-backend os

# восстановить кошелек (после команды вставить seed)
dorad keys add <name_wallet> --recover --keyring-backend os

# подключить кошелек ledger
dorad keys add <name_wallet> --ledger 

Не забываем сохранить seed !!!

Создаем валидатора

dorad tx staking create-validator \
--chain-id vota-ash \
--commission-rate 0.05 \
--commission-max-rate 0.2 \
--commission-max-change-rate 0.1 \
--min-self-delegation "1000000" \
--amount 1000000000000000000peaka \
--pubkey $(dorad tendermint show-validator) \
--moniker "<name_moniker>" \
--from <name_wallet> \
--fees 20000000000000000peaka

Не забываем сохранить priv_validator_key.json !!!

Подробнее о создании/редактировании валидатора можно почитать здесь

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

Dora Vota (vota-ash) - сеть с нулевой инфляцией. Поэтому, в отличие от большинства других PoS-сетей, валидаторы сети vota-ash будут получать только комиссию за передачу данных в качестве собственного вознаграждения. На ранней стадии развития сети плата за передачу данных будет низкой, поэтому фонд Dora Factory собирается субсидировать валидаторов, зарегистрированных в нашей программе делегирования, дополнительными вознаграждениями DORA

Фонд Dora Factory каждый месяц покупает токены DORA на открытых рынках за фиксированную сумму в долларах США. Затем токены DORA будут сжигаться в сети Ethereum и повторно перечеканяться в сети vota-ash, а затем распределяться по адресам валидаторов через смарт-контракт вознаграждения в сети vota-ash

Награды Dora Vota Validator распределяются посредством отдельного смарт-контракта. Каждое распространение создает независимую последовательность вознаграждений, устанавливаемую администратором, с льготным периодом, установленным при создании. Только после истечения льготного периода соответствующая последовательность вознаграждений станет активной, что позволит требовать вознаграждения за последовательность

По умолчанию в Dora Vota Validator Reward в качестве получателя вознаграждения указывается адрес владельца валидатора. При получении вознаграждения валидаторы должны выполнить команду получения через учетную запись владельца

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

Для начала укажите адрес контракта о вознаграждении (TESTNET)

export CONTRACT_ADDR=dora1xt4ahzz2x8hpkc0tk6ekte9x6crw4w6u0r67cyt3kz9syh24pd7suku5hd

В тестовой сети время ожидания установлено на 12 часов, что означает, что вновь созданные последовательности вознаграждений должны ждать 12 часов, прежде чем их можно будет запросить. Причина установки времени ожидания состоит в том, чтобы дать команде Дора достаточно времени для подтверждения правильности распределения. Кроме того, обратите внимание, что время ожидания в основной сети может быть изменено

# Запросить адреса белого списка для определенной последовательности
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_sequenece_addrs": { "reward_sequenece_index": "1" } }' --node https://vota-testnet-rpc.dorafactory.org:443

# Запросить ожидаемые награды для определенного адреса
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "claims": { "address": "dora1jusy530rj4l5kpdcch0ylkn3hau7xxras68fuy", "reward_sequenece_list": null } }' --node https://vota-testnet-rpc.dorafactory.org:443

# Claim all rewards
dorad tx wasm execute \
  $CONTRACT_ADDR \
  '{ "claim": { "reward_sequenece_list": null } }' \
  --from lesnik_utsa_wallet --fees 20000000000000000peaka --chain-id "vota-testnet" --node https://vota-testnet-rpc.dorafactory.org:443 -y

# Получите награды за указанные последовательности
dorad tx wasm execute \
  $CONTRACT_ADDR \
  '{ "claim": { "reward_sequenece_list": ["1", "4"] } }' \
  --from lesnik_utsa_wallet --fees 20000000000000000peaka --chain-id "vota-testnet" --node https://vota-testnet-rpc.dorafactory.org:443 -y

# Время ожидания запроса для определенной последовательности
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_sequenece_time": { "reward_sequenece_index": "1" } }' --node https://vota-testnet-rpc.dorafactory.org:443

# Запросить информацию о раздаче для определенной последовательности
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_reward_sequenece": { "reward_sequenece_index": "2" } }' --node https://vota-testnet-rpc.dorafactory.org:443

# Запросить последний идентификатор последовательности
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_latest_sequenece_id": { } }' --node https://vota-testnet-rpc.dorafactory.org:443

# Конфигурация контракта запроса
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_config": {} }' --node https://vota-testnet-rpc.dorafactory.org:443

# Запрос контракта администратора
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "admin": {} }' --node https://vota-rpc.dorafactory.org:443

# Запрос контракта оператора
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "operator": {} }' --node https://vota-rpc.dorafactory.org:443

# Запрос баланса контракта
dorad query wasm contract-state smart \
  $CONTRACT_ADDR \
  '{ "get_total": {} }' --node https://vota-testnet-rpc.dorafactory.org:443

Информация

# проверить блоки
dorad status 2>&1 | jq ."SyncInfo"."latest_block_height"

# проверить логи
sudo journalctl -u dorad -f -o cat

# проверить статус
curl localhost:26657/status

# проверить баланс
dorad q bank balances <address>

# проверить pubkey валидатора
dorad tendermint show-validator

# проверить валидатора
dorad query staking validator <valoper_address>
dorad query staking validators --limit 1000000 -o json | jq '.validators[] | select(.description.moniker=="<name_moniker>")' | jq

# проверка информации по TX_HASH
dorad query tx <TX_HASH>

# параметры сети
dorad q staking params
dorad q slashing params

# проверить сколько блоков пропущено валидатором и с какого блока актив
dorad q slashing signing-info $(dorad tendermint show-validator)

# проверить slashing
dorad q slashing signing-info $(dorad tendermint show-validator)

# узнать транзакцию создания валидатора (заменить свой valoper_address)
dorad query txs --events='create_validator.validator=<your_valoper_address>' -o=json | jq .txs[0].txhash -r

# просмотр активного сета
dorad q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_BONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

# просмотр неактивного сета
dorad q staking validators -o json --limit=1000 \
| jq '.validators[] | select(.status=="BOND_STATUS_UNBONDED")' \
| jq -r '.tokens + " - " + .description.moniker' \
| sort -gr | nl

Транзакции

# заделегировать себе в стейк еще (так отправляется 1 монетa)
dorad tx staking delegate <valoper_address> 1000000peaka --from <name_wallet> --fees 20000000000000000peaka -y

# ределегирование на другого валидатора
dorad tx staking redelegate <src-validator-addr> <dst-validator-addr> 1000000peaka --from <name_wallet> --fees 20000000000000000peaka -y

# unbond 
dorad tx staking unbond <addr_valoper> 1000000peaka --from <name_wallet> --fees 20000000000000000peaka -y

# отправить монеты на другой адрес
dorad tx bank send <name_wallet> <address> 1000000peaka --fees 20000000000000000peaka -y

# выбраться из тюрьмы
dorad tx slashing unjail --from <name_wallet> --fees 20000000000000000peaka -y

Работа с кошельками

# вывести список кошельков
dorad keys list

# показать ключ аккаунта
dorad keys show <name_wallet> --bech acc

# показать ключ валидатора
dorad keys show <name_wallet> --bech val

# показать ключ консенсуса
dorad keys show <name_wallet> --bech cons

# запрос учетной записи
dorad q auth account $(dorad keys show <name_wallet> -a) -o text

# удалить кошелек
dorad keys delete <name_wallet>

Удалить ноду

systemctl stop dorad && \
systemctl disable dorad && \
rm /etc/systemd/system/dorad.service && \
systemctl daemon-reload && \
cd $HOME && \
rm -rf .dora doravota && \
rm -rf $(which dorad)

ГОВЕРНАНС

# список proposals
dorad q gov proposals

# посмотреть результат голосования
dorad q gov proposals --voter <ADDRESS>

# проголосовать за предложение 
dorad tx gov vote 1 yes --from <name_wallet> --fees 20000000000000000peaka

# внести депозит в предложение
dorad tx gov deposit 1 1000000peaka --from <name_wallet> --fees 20000000000000000peaka

# создать предложение
dorad tx gov submit-proposal --title="Randomly reward" --description="Reward 10 testnet participants who completed more than 3 tasks" --type="Text" --deposit="11000000grain" --from=<name_wallet> --fees 500peaka

Peers and RPC

FOLDER=.dora

# узнать свой peer
PORTR=$(grep -A 3 "\[p2p\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+") && \
echo $(dorad tendermint show-node-id)@$(wget -qO- eth0.me)$PORTR

# узнать порт RPC
echo -e "\033[0;32m$(grep -A 3 "\[rpc\]" ~/$FOLDER/config/config.toml | egrep -o ":[0-9]+")\033[0m"

# проверка количества пиров
PORT=
curl -s http://localhost:$PORT/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr | split(":")[2])"' | wc -l

# cписок моникеров подключенных пиров
curl -s http://localhost:$PORT/net_info | jq '.result.peers[].node_info.moniker'

# Проверка prevotes/precommits. Пригодится при обновах
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].prevotes_bit_array' && \
curl -s localhost:$PORT/consensus_state | jq '.result.round_state.height_vote_set[0].precommits_bit_array'

# check prevote of your validator
curl -s localhost:$PORT/consensus_state -s | grep $(curl -s localhost:26657/status | jq -r .result.validator_info.address[:12])
Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq