Too Late
September 5, 2021

Althea (gravity) /// v1.0.6

Устанавливаем ноду Althea (gravity) для участия в тестнете gravity.

Если вы не знаете, что такое нода — читаем статью.
Если вы не знаете, где арендовать сервер для ноды — читаем статью.
Если вы не знаете, как подключиться к серверу — читаем статью.
Если вы всё знаете — открываем MobaXterm и создаём сессию.

    • Нода: устанавливаем программное обеспечение.
    • Кошелёк: генерируем аккаунт.
    • Genesis: скачиваем файл генезиса и обновляем сиды в файле конфига.
Содержание

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.

--gravity-contract-address - не трогаем.

# запускаем сервис и смотрим логи одной командой
$ 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 - канал, где я выкладываю свои гайды.

Полезные ресурсы.

Крипто-кошельки автора гайда.