COSMOS
September 6

Story Protocol

Web Discord Github

Details

Обновления

Genesis стартует с версии v0.9.11-stable

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

cd $HOME/story

# удаляем старый архив
rm -r story-linux-amd64*

wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/story-public/story-linux-amd64-0.10.0-9603826.tar.gz
tar -xvf story-linux-amd64-0.10.0-9603826.tar.gz
$HOME/story/story-linux-amd64-0.10.0-9603826/story version
# Version       v0.10.0-stable
# Git Commit    9603826

# ПОСЛЕ ОСТАНОВКИ СЕТИ НА НУЖНОМ БЛОКЕ!!!
systemctl stop story
mv $HOME/story/story-linux-amd64-0.10.0-9603826/story $HOME/go/bin/story
story version
# 

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

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

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

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

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.23.1" && \
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
ufw allow 30303 comment story_geth_p2p_port
ufw allow 26656 comment story_p2p_port

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

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

В настоящее время для работы ноды необходимо запустить два отдельных клиента:

  • story-geth, который является forked version geth
  • story, который является consensus client
# при необходимости создаем каталог go/bin/
mkdir -p $HOME/go/bin/
cd $HOME
mkdir -p $HOME/story && cd story

Устанавливаем 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 -xvf geth-linux-amd64-0.9.2-ea9f0d2.tar.gz
mv $HOME/story/geth-linux-amd64-0.9.2-ea9f0d2/geth $HOME/go/bin/story-geth
story-geth version
# Version: 0.9.2-stable
# Git Commit: ea9f0d293f5800e9e0300dfaafc02256de6160ef
# Git Commit Date: 20240826
# удаляем старый архив
rm -r geth-linux-amd64*

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

wget https://story-geth-binaries.s3.us-west-1.amazonaws.com/story-public/story-linux-amd64-0.10.0-9603826.tar.gz
tar -xvf story-linux-amd64-0.10.0-9603826.tar.gz
mv $HOME/story/story-linux-amd64-0.10.0-9603826/story $HOME/go/bin/story
story version
# Version       v0.10.0-stable
# Git Commit    9603826
# удаляем старый архив
rm -r story-linux-amd64*

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

story init --moniker "UTSA_guide" --network iliad

Genesis

# Проверим генезис
sha256sum ~/.story/story/config/genesis.json
# 18ab598bbaefaa5af5e998abe14e8660ff6fa3c63a9453f5f40f472b213ed091

Скачиваем Addr book

wget -O $HOME/.story/story/config/addrbook.json "https://share102.utsa.tech/story/addrbook.json"

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

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

peers="[email protected]:26656"
sed -i -e "s|^persistent_peers *=.*|persistent_peers = \"$peers\"|" $HOME/.story/story/config/config.toml
seeds="6a07e2f396519b55ea05f195bac7800b451983c0@story-seed.mandragora.io:26656"
sed -i.bak -e "s/^seeds =.*/seeds = \"$seeds\"/" $HOME/.story/story/config/config.toml

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

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

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

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

# добавляем пир
peers="[email protected]:26656"
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$peers\"/" $HOME/.empe-chain/config/config.toml
SNAP_RPC=https://t-story.archive.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/.story/story/config/config.toml

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

tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth Client
After=network.target

[Service]
User=$USER
ExecStart=$HOME/go/bin/story-geth --iliad --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 127.0.0.1 --http.port 8545 --ws --ws.api eth,web3,net,txpool --ws.addr 127.0.0.1 --ws.port 8546
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

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

tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=$USER
WorkingDirectory=$HOME/.story/story
ExecStart=$HOME/go/bin/story run
Restart=on-failure
RestartSec=3
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

Запускаем сервисный файлы

systemctl daemon-reload
systemctl enable story
systemctl enable story-geth

# запускаем story-geth
systemctl restart story-geth && journalctl -u story-geth -f -o cat

# запускаем story
systemctl restart story && journalctl -u story -f -o cat

Snapshot Archive

type: archive | time: every 6 days | pruning: nothing | indexer: kv

systemctl stop story
systemctl stop story-geth

cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

rm -rf $HOME/.story/story/data
rm -rf $HOME/.story/geth/iliad/geth/chaindata

# скачиваем story
curl -o - -L https://share102.utsa.tech/story/story_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/story/

# скачиваем story_geth
curl -o - -L https://share102.utsa.tech/story/story_geth_testnet.tar.lz4 | lz4 -c -d - | tar -x -C $HOME/.story/geth/iliad/geth/

mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

systemctl restart story
systemctl restart story-geth

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

Для начала посмотрим публичные validator keys

story validator export

Экспорт EVM key валидатора в каталог конфигурации данных по умолчанию

story validator export --export-evm-key

Если Вы хотите выполнять транзакции от имени валидатора, а не делегатора, то необходимо создать файл .env

story validator export --export-evm-key --evm-key-path $HOME/.story/story/.env

Теперь мы можем посмотреть наш private_key

cat /root/.story/story/config/private_key.txt

Теперь нам необходимо импортировать наш private_key в EVM кошелек и запросить токены из крана

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

story validator create --stake 1000000000000000000

Данная команда создаст валидатора, который соответствует
ключу валидатора, сохраненному в priv_validator_key.json. Обратите внимание, что для участия в консенсусе необходимо сделать ставку как минимум на 1024 $IP IP (что эквивалентно 1024000000000000000000 wei)

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

Не забываем сохранить private_key.txt

# добавить монеты в стейк
story validator stake --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --stake ${AMOUNT_TO_STAKE_IN_WEI}

# unstake
story validator unstake --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --unstake ${AMOUNT_TO_UNSTAKE_IN_WEI}

# stake-on-behalf
# Ставка от имени другого делегатора. Это сделает ставку ${AMOUNT_TO_STAKE_IN_WEI} IP валидатору от имени предоставленного делегатора
story validator stake-on-behalf --delegator-pubkey ${DELEGATOR_PUB_KEY_IN_BASE64} --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --stake ${AMOUNT_TO_STAKE_IN_WEI}

# unstake-on-behalf
story validator unstake-on-behalf --delegator-pubkey ${DELEGATOR_PUB_KEY_IN_BASE64} --validator-pubkey ${VALIDATOR_PUB_KEY_IN_BASE64} --unstake ${AMOUNT_TO_STAKE_IN_WEI}
To unstake on behalf of delegators you must be registered as an authorized operator for that delegator

# добавить оператора
story validator add-operator --operator ${OPERATOR_EVM_ADDRESS}

# удалить оператора
story validator remove-operator --operator ${OPERATOR_EVM_ADDRESS}

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

Информация

# проверить статус story
curl localhost:26657/status | jq
curl localhost:26657/status | jq .result.sync_info


# проверить статус story-geth
curl -X POST -H "Content-Type: application/json" http://localhost:8545 --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

Удалить story

systemctl stop story
systemctl stop story-geth

systemctl disable story
systemctl disable story-geth

rm /etc/systemd/system/story.service
rm /etc/systemd/system/story-geth.service

systemctl daemon-reload

cd $HOME
rm -rf .story story
rm -rf $(which story)
rm -rf $(which story-geth)

Поддержим природу вместе: 0xa7476EC14cD663C742d527113638C77a1631Cc89 cosmos1m2mm7kzvw6m3464h94ryqg8xvr6tyeyyecppnq