August 30

Story Protocol. Устанавливаем ноду

CryptoFortochka — гайды, ноды, новости, тестнеты

StoryProtocol — это протокол для создания, управления и лицензирования новой интеллектуальной собственности на чейне

  • Инвестировали: $134 300 000
  • Инвесторы: a16z, Polychain Capital, Samsung Next и другие
  • Характеристики: 4CPU/8RAM/200SSD — рекомендованные
  • Арендовать сервер: PqHosting, XorekCloud
  • Чат и канал с поддержкой: https://t.me/fortochat / https://t.me/cryptoforto
  • Операционная сеть: Ubuntu 22.04

Очередная годная активность, от нашумевшего проекта, который собрал более $130M о тир1 фондов

Сейчас, есть возможность установить валидаторскую ноду в новой тестовой сети Story, который вот запустилась на днях. Если вы хотели углубится в сферу нод, то этот проект для вас

Расписал для вас понятный гайд с установкой ноды, ставиться достаточно, советую сервак брать (минимум как требуется в рекомендации), чтобы избежать дальнейшие траблы с синхронизацией

На XorekCloud арендовать подходящий сервер за 749 рублей в месяц + написать в поддержку, чтобы вам повысили Disk space до 200 GiB за доп. оплату

Обновление 21.09

Данную обнову лучше устанавливать, если вы ранее уже устанавливали ноду по моему гайду до 03.10. Если вы ставите ноду с нуля, пропустите этот пункт и начнет с пункта "Устанавливаем ноду"

Не обновляйте до высоты блока 626 575

  • Стопа ноду и устанавливаем новый бинарик
sudo systemctl stop story
cd $HOME
wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/story-public/story-linux-amd64-0.10.1-57567e5.tar.gz
tar -xzvf story-linux-amd64-0.10.1-57567e5.tar.gz
cp $HOME/story-linux-amd64-0.10.1-57567e5/story $HOME/go/bin
source $HOME/.bash_profile
story version
  • Устанавливаем Cosmovisor
source $HOME/.bash_profile
#requirement go version above v.1.22
go version
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
  • Устанавливаем новый бинарик
cd $HOME
wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/story-public/story-linux-amd64-0.10.0-9603826.tar.gz
tar -xzvf story-linux-amd64-0.10.0-9603826.tar.gz
  • Настраиваем Cosmovisor
mkdir -p $HOME/.story/story/cosmovisor/genesis/bin
mkdir -p $HOME/.story/story/cosmovisor/upgrades/v0.10.0/bin
  • Копируем новый бинарик
cp $HOME/story-linux-amd64-0.10.1-57567e5/story $HOME/.story/story/cosmovisor/upgrades/v0.10.1/bin
  • Добавляем информацию об обновлении
echo '{"name":"v0.10.1","time":"0001-01-01T00:00:00Z","height":626575}' > /root/.story/story/cosmovisor/upgrades/v0.10.1/upgrade-info.json
  • Собираем и настраиваем переменные
export DAEMON_NAME=story >> $HOME/.bash_profile
export DAEMON_HOME=/root/.story/story >> $HOME/.bash_profile
export DAEMON_DATA_BACKUP_DIR=/root/.story/story/data >> $HOME/.bash_profile
source $HOME/.bash_profile

echo $DAEMON_NAME
echo $DAEMON_HOME
echo $DAEMON_DATA_BACKUP_DIR
  • Верифицируем и устанавливаем
rm /root/.story/story/cosmovisor/current
ln -s /root/.story/story/cosmovisor/upgrades/v0.10.1 /root/.story/story/cosmovisor/current
  • Редактируем сервисный файл
nano /etc/systemd/system/story.service
  • Вставляем этот текст

    Сохраняем текст Cntr+X, Y, Enter
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=root
Environment="DAEMON_NAME=story"
Environment="DAEMON_HOME=/root/.story/story"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_DATA_BACKUP_DIR=/root/.story/story/data"
Environment="UNSAFE_SKIP_BACKUP=true"
ExecStart=/root/go/bin/cosmovisor run run
Restart=always
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
  • Запускаем ноду
sudo systemctl daemon-reload
sudo systemctl restart story && sudo systemctl status story
  • Проверяем логи
sudo journalctl -u story -f -o cat

Устанавливаем ноду

  • Подключаемся на арендованный сервер через root
  • Выполняем команды по списку
  • Обновляем и устанавливаем необходимые пакеты
sudo apt update
sudo apt-get update
sudo apt install curl git make jq build-essential gcc unzip wget lz4 aria2 -y
  • Устанавливаем Story-Geth
wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/geth-public/geth-linux-amd64-0.9.2-ea9f0d2.tar.gz
tar -xzvf geth-linux-amd64-0.9.2-ea9f0d2.tar.gz
[ ! -d "$HOME/go/bin" ] && mkdir -p $HOME/go/bin
if ! grep -q "$HOME/go/bin" $HOME/.bash_profile; then
  echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profile
fi
sudo cp geth-linux-amd64-0.9.2-ea9f0d2/geth $HOME/go/bin/story-geth
source $HOME/.bash_profile
story-geth version
  • Устанавливаем Story
wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/story-public/story-linux-amd64-0.9.13-b4c7db1.tar.gz
tar -xzvf story-linux-amd64-0.9.13-b4c7db1.tar.gz
[ ! -d "$HOME/go/bin" ] && mkdir -p $HOME/go/bin
if ! grep -q "$HOME/go/bin" $HOME/.bash_profile; then
  echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profile
fi
sudo cp story-linux-amd64-0.9.13-b4c7db1/story $HOME/go/bin
source $HOME/.bash_profile
story version
  • Даём моникер — замените слово MONIKER на любое слово
story init --network iliad --moniker MONIKER
  • Создаем сервисный файл story-geth
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target

[Service]
User=root
ExecStart=/root/go/bin/story-geth --iliad --syncmode full
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF
  • Создаем сервисный файл story
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=root
ExecStart=/root/go/bin/story run
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF
  • Перезапускаем и запускаем story-geth
sudo systemctl daemon-reload && \
sudo systemctl start story-geth && \
sudo systemctl enable story-geth && \
sudo systemctl status story-geth
  • Перезапускаем и запускаем story
sudo systemctl daemon-reload && \
sudo systemctl start story && \
sudo systemctl enable story && \
sudo systemctl status story
  • Тыкаем на Cntr+C и смотрим статус
curl localhost:26657/status | jq
  • Первые минут 5–10 будет статус true и 0 block_height — это нормально, постепенно будут блоки расти
Далее мы просто ждём несколько часов, пока не отобразиться статус: false

Устанавливаем снепшот (по желанию)

Снепшот поможет вам сократит время ожидание синхронизации

Внимание! Снепшот стоит устанавливать, когда только начали расти “latest_block_height”:, если пишет 0, то стоит дождаться первого блока
  • Устанавливаем Tool
sudo apt-get install wget lz4 aria2 pv -y
  • Останавливаем ноду
sudo systemctl stop story
sudo systemctl stop story-geth
  • Устанавливаем Story-data
cd $HOME
rm -f Story_snapshot.lz4
wget --show-progress https://josephtran.co/Story_snapshot.lz4
  • Устанавливаем Geth-data
cd $HOME
rm -f Geth_snapshot.lz4
wget --show-progress https://josephtran.co/Geth_snapshot.lz4
  • Делаем бэкап
cp ~/.story/story/data/priv_validator_state.json ~/.story/priv_validator_state.json.backup
  • Удаляем старую data
rm -rf ~/.story/story/data
rm -rf ~/.story/geth/iliad/geth/chaindata
  • Извлекаем Story-data
sudo mkdir -p /root/.story/story/data
lz4 -d Story_snapshot.lz4 | pv | sudo tar xv -C /root/.story/story/
  • Извлекаем Geth-data
sudo mkdir -p /root/.story/geth/iliad/geth/chaindata
lz4 -d Geth_snapshot.lz4 | pv | sudo tar xv -C /root/.story/geth/iliad/geth/
  • Возвращаемся бэкап
cp ~/.story/priv_validator_state.json.backup ~/.story/story/data/priv_validator_state.json
  • Перезапускаем ноду
sudo systemctl start story
sudo systemctl start story-geth
  • Проверяем статус ноды, видим появилось больше блоков
curl localhost:26657/status | jq
  • Появится статус false
  • Проверяем блоки
while true; do 
  local_height=$(curl -s localhost:26657/status | jq -r '.result.sync_info.latest_block_height');
  network_height=$(curl -s https://rpc-story.josephtran.xyz/status | jq -r '.result.sync_info.latest_block_height');
  blocks_left=$((network_height - local_height));
  echo -e "\033[1;38mYour node height:\033[0m \033[1;34m$local_height\033[0m | \033[1;35mNetwork height:\033[0m \033[1;36m$network_height\033[0m | \033[1;29mBlocks left:\033[0m \033[1;31m$blocks_left\033[0m";
  sleep 5;
done

Создаем валидатора. Детальная инструкция

Если у вас статус false, то вы можете приступить к созданию валидатора
  • Делаем export валидаторского аккаунта — сохраняем данные
story validator export
  • Далее вытаскиваем приватник
sudo cat /root/.story/story/config/private_key.txt

story validator export --export-evm-key
  • Копируем приватник и импортируем его в EVM кошельке
  • Запрашиваем c крана на этот аккаунт тестовые токены $IP

Для валидатора, нам понадобиться более 1 $IP (1 токена для создание валидатора + отдельно на комиссию), то есть, вам нужно будет 2 раза запросить токены с крана или отправить с другого аккаунта немного $IP на ваш валидатор

  • Стекаем в своего валидатора your_private_key замените на приваткей вашего EVM аккаунта, который вам выдали (кавычки оставляем)
story validator create --stake 1000000000000000000 --private-key "your_private_key"
  • Вытаскиваем еще один приваткей нашего валидатора и сохраняем в надежное место
sudo cat /root/.story/story/config/priv_validator_key.json

Команды для стейкинга в валидатора

  • Вписываем команду, заменив VALIDATOR_PUB_KEY на ваш пабкейвалидатора, который находится в логах статусной строке (прикреплю скрин)
  • Также замените private-key на ваш приватник от EVM, который мы ранее импортировали
1000000000000000000 = 1 токен $IP, прежде чем стейкать, у вас должно быть минимум 1,01 токенов $IP для успешного стейкинга
story validator stake \
   --validator-pubkey "VALIDATOR_PUB_KEY_IN_BASE64" \
   --stake 1000000000000000000 \
   --private-key xxxxxxxxxxxxxx
  • АПДЕЙТ 31.08 (команда изменила условия стейкинга) Теперь минимальный стейк составляет - 1024 $IP
  • Проверить статус
curl localhost:26657/status | jq
  • Должно получиться во так

В Explorer наблюдаем за своим валидатором

  • Узнать адрес вашего валидатора можно по этой команде
sudo cat /root/.story/story/config/priv_validator_key.json

Дополнительный команды

  • Остановить ноду
sudo systemctl stop story
sudo systemctl stop story-geth
  • Перезапустить ноду
sudo systemctl start story
sudo systemctl start story-geth
  • Проверить статус ноды
curl localhost:26657/status | jq
  • Посмотреть логи
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o cat
  • Живые пиры
PEERS=$(curl -s -X POST https://rpc-story.josephtran.xyz -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"net_info","params":[],"id":1}' | jq -r '.result.peers[] | select(.connection_status.SendMonitor.Active == true) | "\(.node_info.id)@\(if .node_info.listen_addr | contains("0.0.0.0") then .remote_ip + ":" + (.node_info.listen_addr | sub("tcp://0.0.0.0:"; "")) else .node_info.listen_addr | sub("tcp://"; "") end)"' | tr '\n' ',' | sed 's/,$//' | awk '{print "\"" $0 "\""}')

sed -i "s/^persistent_peers *=.*/persistent_peers = $PEERS/" "$HOME/.story/story/config/config.toml"

if [ $? -eq 0 ]; then
    echo -e "Configuration file updated successfully with new peers"
else
    echo "Failed to update configuration file."
fi
  • Удалить ноду
sudo systemctl stop story-geth
sudo systemctl stop story
sudo systemctl disable story-geth
sudo systemctl disable story
sudo rm /etc/systemd/system/story-geth.service
sudo rm /etc/systemd/system/story.service
sudo systemctl daemon-reload
sudo rm -rf $HOME/.story
sudo rm $HOME/go/bin/story-geth
sudo rm $HOME/go/bin/story

Данная статья была написана каналом Crypto Fortochka