Althea (gravity) /// v1.0.6
Устанавливаем ноду Althea (gravity) для участия в тестнете gravity.
Если вы не знаете, что такое нода — читаем статью.
Если вы не знаете, где арендовать сервер для ноды — читаем статью.
Если вы не знаете, как подключиться к серверу — читаем статью.
Если вы всё знаете — открываем MobaXterm и создаём сессию.
- Краткое описание ивента: несколько слов про ивент, условия участия.
- Требования к железу: рекомендуемые технические параметры сервера.
- Установка
- Нода: устанавливаем программное обеспечение.
- Кошелёк: генерируем аккаунт.
- Genesis: скачиваем файл генезиса и обновляем сиды в файле конфига.
- Валидатор: создаём валидатора.
- Gravity Bridge: устанавливаем gbt.
- Goerli: запускаем лайтовый клиент Goerli ETH.
- Orchestrator: настраиваем оркестратор.
- Обновление: в случае рестарта сети.
- Полезные вещи
- Полезные команды при работе с нодой.
- Ределегация: выводим реварды за стейкинг и ределегируем их.
- Перенос и бэкап: пригодится при переезде.
- Удаление ноды: на будущее.
- Идентификация: делаем валидатора уникальным.
- Благодарности
- Полезные ресурсы на каждый день
Althea представила протокол pay-per-forward в 2018 году - надёжный способ координации платежей за пропускную способность и сетевую маршрутизацию, радикальный по своей простоте и эффективности.
Благодаря этому протоколу, любой может быть интернет-провайдером и торговать своей пропускной способностью, как товаром.
Любой продавец может предложить свои ресурсы, любой покупатель может эту пропускную способность приобрести.
Блокчейн Althea - сообщество, которое реализует видение будущего Интернета.
Будущее, когда сам Интернет будет работать на вдохновлённых им принципах.
Тестнет посвящён проверке Gravity Bridge, а также других интересных модулей.
Docs | GitHub | WebSite | Twitter | Discord | Chat_RU
Официальные требования: 16 CPU x 16 GB RAM x 320 GB SSD - Ubuntu 20.04.
Субъективные наблюдения: 4 CPU x 4 GB RAM x 320 GB SSD - Ubuntu 20.04.
# обновляем 'базу данных', обновляем дистрибутив $ sudo apt-get update && sudo apt-get upgrade -y
# скачиваем необходимые зависимости $ sudo apt-get install curl jq -y
# увеличиваем лимит открытых файлов одной командой $ sudo su -c "echo 'fs.file-max = 65536' >> /etc/sysctl.conf" && \ sysctl -p && \ sudo su -c "echo '* hard nofile 94000' >> /etc/security/limits.conf" && \ sudo su -c "echo '* soft nofile 94000' >> /etc/security/limits.conf" && \ sudo su -c "echo 'root hard nofile 94000' >> /etc/security/limits.conf" && \ sudo su -c "echo 'root soft nofile 94000' >> /etc/security/limits.conf" && \ sudo su -c "echo 'session required pam_limits.so' >> /etc/pam.d/common-session"
Чтобы изменения вошли в силу, необходимо перезагрузить сервер и запустить сессию с сервером заново.
$ sudo reboot
Проверяем, сработало ли, командой:
$ ulimit -n
Отлично, сервер подготовлен. Приступаем к скачиванию необходимых файлов.
# создаём директорию 'gravity-bin' и переходим в неё $ mkdir $HOME/gravity-bin; \ cd $HOME/gravity-bin
# скачиваем файл ноды и переименовываем его для удобства $ wget https://github.com/Gravity-Bridge/Gravity-Bridge/releases/download/v1.0.6/gravity-linux-amd64 && \ mv gravity-linux-amd64 gravity
# скачиваем тулзу для гравити бридж $ wget https://github.com/Gravity-Bridge/Gravity-Bridge/releases/download/v1.0.6/gbt
# выдаём права на исполнение только что скачанных файлов # и перемещаем файлы ноды и 'gbt' в необходимый каталог $ chmod +x * $ sudo mv * /usr/bin/
# проверяем версии файлов $ gbt --version && gravity version
Первым делом добавим наш никнейм, который будет в дальнейшем использоваться в качестве названия кошелька, в систему, как переменную.
Замените условную переменную <nickname> на желаемый никнейм, раскрывая кавычки.
# например, "export NICKNAME="cyberomanov"" $ echo "export NICKNAME="<nickname>"" >> ~/.bash_profile
# чтобы переменная загрузилась, необходимо перезагрузить '.bash_profile' $ source ~/.bash_profile
# проверим значение переменной, выведя её на экран $ echo $NICKNAME
Сейчас восстанавливаем ключи, которые использовали при регистрации в ивенте Cosmos Gravity Bridge. Если вас нет в дискорде, вы не заполняли никаких форм и понятия не имеете, какие ключи восстанавливать - ивент не для вас.
Доступ на данный момент к мероприятию закрыт.
# восстанавливаем ключи валидатора $ gravity keys add $NICKNAME --recover
Восстанавливаем ключи от оркестратора, которые генерировали при подаче gentx:
# восстанавливаем ключи оркестратора. мы их генерировали при подаче 'gentx' $ gravity keys add $NICKNAME'_orchestrator' --recover
Отлично, добавляем адреса в переменные для удобства.
# узнаём гравити адрес валидатора $ gravity keys show $NICKNAME | grep gravity
# добавляем адрес в переменные без < > # например, "export NICKNAME="gravity19t0xupsupxxxxxxxxh8ykgpynrfdeyq"" $ echo "export GB_VALIDATOR="<gravity_orc_address>"" >> ~/.bash_profile
# узнаём гравити адрес оркестратора $ gravity keys show $NICKNAME'_orchestrator' | grep gravity
# добавляем адрес в переменные без < > # например, "export NICKNAME="gravity19t0xupsupxxxxxxxxh8ykgpynrfdeyq"" $ echo "export GB_ORCHESTRATOR="<gravity_orc_address>"" >> ~/.bash_profile
# чтобы переменные загрузилась, необходимо перезагрузить '.bash_profile' $ source ~/.bash_profile
# проверим значение переменной, выведя её на экран $ echo $GB_VALIDATOR '|' $GB_ORCHESTRATOR
# инициализируем ноду $ gbt init
# восстанавливаем ключи $ gbt keys set-ethereum-key --key <eth_private_key> $ gbt keys set-orchestrator-key --phrase "<mnemonic>" $ gbt keys show
<eth_private_key> - приватный ключ от эфировского кошелька оркестратора, который мы генерировали при создании gentx.
<mnemonic> - мнемоника от кошелька космос оркестратора, который мы генерировали при создании gentx.
Скачиваем файл генезиса и обновляем сиды в файле конфига.
# скачиваем файл генезиса $ wget https://raw.githubusercontent.com/Gravity-Bridge/Gravity-Docs/main/genesis.json -O $HOME/.gravity/config/genesis.json
# задаём переменную 'seeds' $ SEEDS="2b089bfb4c7366efb402b48376a7209632380c9c@65.19.136.133:26656"
# обновляем сиды в файле конфига $ sed -i.bak -e "s/^seeds *=.*/seeds = \"$SEEDS\"/" $HOME/.gravity/config/config.toml
# проверяем правдоподобность $ cat $HOME/.gravity/config/config.toml | grep 'seeds'
Создаём файл сервиса для ноды и запускаем валидатора.
# создаём сервисный файл 'gravity-node' $ sudo tee /etc/systemd/system/gravity-node.service > /dev/null <<EOF [Unit] Description=Gravity blockchain node Requires=network.target [Service] Type=simple TimeoutStartSec=10s Restart=always RestartSec=10 ExecStart=/usr/bin/gravity start LimitNOFILE=500000 LimitNPROC=500000 Environment="HOME=/root" [Install] WantedBy=default.target EOF
# запускаем сервис и смотрим логи одной командой $ sudo systemctl daemon-reload && \ sudo systemctl enable gravity-node && \ sudo systemctl restart gravity-node && \ journalctl -u gravity-node -f
Поднимаем локальную ноду Goerli ETH.
# скачиваем клиент одной командой $ cd $HOME && \ wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.13-7a0c19f8.tar.gz && \ tar -xvf geth-linux-amd64-1.10.13-7a0c19f8.tar.gz && \ rm -v geth-linux-amd64-1.10.13-7a0c19f8.tar.gz
# наводим красоту и скачиваем конфиг одной командой $ mv geth-linux-amd64-1.10.13-7a0c19f8 geth && \ chmod +x $HOME/geth/geth && \ sudo mv $HOME/geth/geth /usr/bin/ && \ wget -O $HOME/geth/geth-light-config.toml "https://raw.githubusercontent.com/Gravity-Bridge/Gravity-Docs/main/configs/geth-light-config.toml"
# создаём сервис 'gethd' одной командой $ sudo tee <<EOF >/dev/null /etc/systemd/system/gethd.service [Unit] Description=goerli After=network-online.target [Service] User=$USER ExecStart=/usr/bin/geth --syncmode "light" --goerli --http \ --config $HOME/geth/geth-light-config.toml Restart=on-failure RestartSec=3 LimitNOFILE=4096 [Install] WantedBy=multi-user.target EOF
# включаем сервис и смотрим логи одной командой $ sudo systemctl daemon-reload && \ sudo systemctl enable gethd && \ sudo systemctl restart gethd && \ journalctl -u gethd -f
После чего запрашиваем на эфировский адрес оркестратора с крана монеты.
Нужен хотя бы 1 Goerli ETH. Иначе оркестратор не сможет работать.
# создаём сервисный файл 'orchestrator' $ sudo tee /etc/systemd/system/orchestrator.service > /dev/null <<EOF [Unit] Description=Gravity bridge orchestrator Requires=network.target [Service] Type=simple TimeoutStartSec=10s Restart=always RestartSec=10 ExecStart=/usr/bin/gbt orchestrator \ --fees 0ugraviton \ --cosmos-grpc "http://localhost:9090" \ --gravity-contract-address 0xa17f0B21c70FaB270c68031A179e7bE61BE7E81e [Install] WantedBy=default.target EOF
В параметре --cosmos-grpc "http://localhost:9090" указать кастомный порт, на котором стоит сама нода gravity.
# запускаем сервис и смотрим логи одной командой $ sudo systemctl daemon-reload && \ sudo systemctl enable orchestrator && \ sudo systemctl restart orchestrator && \ journalctl -u orchestrator -f
Помимо Goerli ETH для работы оркестратору нужно несколько нативных монет сети gravity - ugraviton.
Мы их получим с наград, которые успели навалидировать за эти пару минут. Потом просто скинем пару монет на гравити кошелёк оркестратора. Если мы оставим кошелёк оркестратора пустовать - улетим в jail.
# выводим награды $ gravity tx distribution withdraw-all-rewards \ --from $NICKNAME \ --fees=000ugraviton \ --gas=auto \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
# пересылаем часть наград гравити адрес оркестратора $ gravity tx bank send $NICKNAME $GB_ORCHESTRATOR 5000000ugraviton \ --gas=auto \ --fees=5000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
Перезапускаем оркестратор и смотрим логи:
$ sudo systemctl daemon-reload && \ sudo systemctl enable orchestrator && \ sudo systemctl restart orchestrator && \ journalctl -u orchestrator -f
Довольно часто крашится сеть и разработчики выпускают новую. Следить за этим можно в дискорде. В этом пункте я покажу универсальный алгоритм обновления.
Официальный гайд постоянно обновляется. Самые свежие обновления находим здесь: https://github.com/Gravity-Bridge/Gravity-Docs/blob/main/docs/upgrading.md.
# останавливаем сервис $ sudo systemctl stop gravity-node
# скачиваем актуальный генезис $ wget https://raw.githubusercontent.com/Gravity-Bridge/Gravity-Docs/main/genesis.json -O $HOME/.gravity/config/genesis.json
# сверяем 'checksum' со значением из гитахаба $ md5sum $HOME/.gravity/config/genesis.json
# бэкапим 'addrbook' $ mv -f $HOME/.gravity/config/addrbook.json $HOME/
# переходим в рабочую директорию $ mkdir $HOME/gravity-bin; cd $HOME/gravity-bin
# скачиваем новые версии исполняемых файлов и наводим красоту одной командой # 'ссылки' мы берём из официального гитхаба, в моём случае это 1.0.4 $ wget https://github.com/Gravity-Bridge/Gravity-Bridge/releases/download/v1.0.4/gravity-linux-amd64 && \ mv gravity-linux-amd64 gravity && \ wget https://github.com/Gravity-Bridge/Gravity-Bridge/releases/download/v1.0.4/gbt && \ chmod +x * && \ sudo mv * /usr/bin/ && \ cd
# ресетим бд к состоянию генезиса $ gravity unsafe-reset-all
# восстанавливаем 'addrbook' $ mv $HOME/addrbook.json $HOME/.gravity/config/
# стартуем сервисы $ sudo systemctl restart orchestrator gravity-node
# проверяем логи сервисов $ journalctl -u orchestrator -f $ journalctl -u gravity-node -f
# некрасивая команда для проверки состояние консесуса $ curl -s localhost:`cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")" \ | tail -c 6`/consensus_state \ | jq '.result.round_state.height_vote_set[0].prevotes_bit_array' \ | grep -oE [0-9].[0-9]* | tail -1
Как только консенсус превысит 67% - запустится сеть.
После старта сети обязательно проверьте баланс оркестратора. Должны быть несколько токенов ugraviton, а также Goerli ETH.
Несколько команд для удобной работы с нодой.
# получаем высоту блоков нашей ноды $ gravity status 2>&1 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ | jq ."SyncInfo"."latest_block_height"
# получаем статус синхронизации ноды $ gravity status 2>&1 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ | jq ."SyncInfo"."catching_up" # 'true' - нода синхронизируется, 'false' - нода синхронизирована
# посмотреть информацию о валидаторе $ gravity query staking \ validator $(gravity keys show $NICKNAME --bech val --address) \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"`
# посмотреть список кошельков $ gravity keys list
# посмотреть баланс основного кошелька $ gravity q bank balances $GB_VALIDATOR \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --chain-id gravity-bridge-test5
# посмотреть баланс орекстратора $ gravity q bank balances $GB_ORCHESTRATOR \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --chain-id gravity-bridge-test5
# локальный эксплорер $ gravity q staking validators \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` -o json --limit=1000 \ | jq -r '.validators[] | select(.status=="BOND_STATUS_BONDED")' \ | jq -r '.tokens + " - " + .description.moniker' \ | sort -gr | nl
# отправить 'ugraviton' на чужой кошелёк $ gravity tx bank send $NICKNAME <gravity_address> 5000000ugraviton \ --gas=auto \ --fees=5000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
# выходим из 'тюрьмы' $ gravity tx slashing unjail \ --from $NICKNAME \ --fees=5000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
# перезапустить сервисы $ sudo systemctl restart gravity-node orchestrator gethd
# остановить сервисы $ sudo systemctl stop gravity-node orchestrator gethd
# проверить логи сервисов $ sudo journalctl -u gravity-node -f $ sudo journalctl -u orchestrator -f $ sudo journalctl -u gethd -f
План работы: выводим реварды за активное валидирование, проверяем баланс, ределегируем собранную награду снова на своего валидатора.
# вывести реварды за валидирование для последующей ределегации $ gravity tx distribution withdraw-all-rewards \ --from $NICKNAME \ --fees=000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
# проверяем баланс $ gravity query bank balances $GB_VALIDATOR \ --denom="ugraviton" \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"`
В amount показывает весь свободный баланс.
Не советую делегировать весь баланс. Помните, что каждая транзакция имеет комиссию.
Я обычно "удаляю" первую цифру от своего баланса и делегирую получившееся значение.
Добавим адрес оператора в переменные для удобства.
# добавляем свой 'operator-address' в переменные $ echo "export GB_OPERATOR="$(gravity query staking \ validator $(gravity keys show $NICKNAME --bech=val -a) \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ | grep "valoper" | awk '{print $2}')"" >> ~/.bash_profile
# чтобы переменная загрузилась, необходимо перезагрузить '.bash_profile' $ source ~/.bash_profile
# проверим значение переменной, выведя её на экран $ echo $GB_OPERATOR
# делегировать токены на своего валидатора $ gravity tx staking delegate $GB_OPERATOR "1000000ugraviton" \ --from $NICKNAME \ --fees=5000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" | \ grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
Проверяем информацию о валидаторе:
$ gravity query staking \ validator $(gravity keys show $NICKNAME --bech val --address) \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"`
Про перенос я написал полноценную статью. Читаем внимательно и вдумчиво.
Если вы вдруг разочаровались в проекте и хотите удалить его с сервера, то можно просто разрушить/удалить сервер из личного кабинета хостинга.
Это сработает, если на сервере нет других важных нод. В случае, если вы хотите оставить сервер, но удалить конкретную ноду - приступаем к её удалению:
# останавливаем и отключаем сервисы $ sudo systemctl stop gravity-node orchestrator gethd && \ sudo systemctl disable gravity-node orchestrator gethd
Не забудьте сделать бэкап папки .gravity, даже если хотите удалить ноду с сервера.
# удаляем папки и исполняемые файлы $ sudo rm -Rvf $HOME/geth $HOME/gravity-bin $HOME/.gbt $HOME/.ethereum \ $HOME/.gravity /usr/bin/geth /usr/bin/gravity /usr/bin/gbt
# удаляем файлы сервиса и перезагружаем демона одной командой $ sudo rm -v /etc/systemd/system/gravity-node.service \ /etc/systemd/system/orchestrator.service \ /etc/systemd/system/gethd.service && sudo systemctl daemon-reload
Добавим аватар и немного описания нашему валидатору.
Советую сначала скопировать команду в блокнот, отредактировать, а затем вставлять в терминал.
$ gravity tx staking edit-validator \ --moniker="new node nickname" \ --website="https://t.me/nickname" \ --identity="1A1A2B2B3C3C4D4D" \ --details="any details" \ --from $NICKNAME \ --fees=5000ugraviton \ --chain-id gravity-bridge-test5 \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"` \ --yes
Если вы не знаете, что такое identity и где его получить - посмотрите на пример из статьи @letskynode.
Проверяем информацию о валидаторе:
$ gravity query staking \ validator $(gravity keys show $NICKNAME --bech val --address) \ --node `cat "$HOME/.gravity/config/config.toml" \ | grep -oPm1 "(?<=^laddr = \")([^%]+)(?=\")"`
мамичу за то, что родила такого гения.
@mzonder за альтернативный гайд.
@how_to_node - канал, где я выкладываю свои гайды.