Story Protocol
- Network Chain ID:
iliad
- Denom:
IP
- Binary:
story
story-geth
- Working directory:
.story
- RPC: https://t-story.archive.rpc.utsa.tech/
- API: https://t-story.archive.api.utsa.tech/
- EVM: https://t-story.archive.evm.utsa.tech:443
- WSS EVM: https://t-story.archive.wss.utsa.tech:443
- Explorers: 1 2 3 4
- Docs: https://docs.story.foundation/docs/node-setup
- Faucet: 1 2
Обновления
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
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
Новая установка ноды
ВАЖНО — в командах ниже все, что в <> меняем на свое значение и убираем сами <>
В настоящее время для работы ноды необходимо запустить два отдельных клиента:
# при необходимости создаем каталог go/bin/ mkdir -p $HOME/go/bin/
cd $HOME mkdir -p $HOME/story && cd story
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*
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
# Проверим генезис sha256sum ~/.story/story/config/genesis.json # 18ab598bbaefaa5af5e998abe14e8660ff6fa3c63a9453f5f40f472b213ed091
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
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)
# добавить монеты в стейк 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}'
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)