Manual Installation (Cosmovisor)

Recommended Hardware: 8 Cores, 32GB RAM, 500GB of storage (NVME), 25 MBit/s

1. Install dependencies, if required

sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget build-essential jq make lz4 gcc unzip pv -y

2. Install Go, if required

cd $HOME && \
ver="1.22.3"
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" >> ~/.bash_profile && \
source ~/.bash_profile && \
go version
mkdir -p $HOME/go/bin

3. Download Story binary (v1.3.0)

cd $HOME
wget https://github.com/piplabs/story/releases/download/v1.3.0/story-linux-amd64
chmod +x story-linux-amd64
sudo mv $HOME/story-linux-amd64 $HOME/go/bin/story
source $HOME/.bash_profile
story version

4. Install Cosmovisor v1.7.0

go install cosmossdk.io/tools/cosmovisor/cmd/[email protected]

5. Create directories

mkdir -p $HOME/go/bin
mkdir -p $HOME/.story/story/cosmovisor/upgrades
mkdir -p $HOME/.story/story/cosmovisor/backup

6. Set temporary environment variables

export DAEMON_NAME=story
export DAEMON_HOME=$HOME/.story/story
export DAEMON_DATA_BACKUP_DIR=$HOME/.story/story/data
export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin

7. Initialize Cosmovisor

cosmovisor init $HOME/go/bin/story

8. Download Story-Geth binary (v1.1.0)

wget https://github.com/piplabs/story-geth/releases/download/v1.1.0/geth-linux-amd64
chmod +x geth-linux-amd64
mv $HOME/geth-linux-amd64 $HOME/go/bin/story-geth
source $HOME/.bash_profile
story-geth version
mkdir -p "$HOME/.story/geth"

9. Initialize story

story init --network aeneid --moniker "<moniker>"

10. Set Custom ports

echo "export STORY_PORT="47"" >> $HOME/.bash_profile
source $HOME/.bash_profile
sed -i.bak -e "s%:1317%:${STORY_PORT}317%g;
s%:8551%:${STORY_PORT}551%g" $HOME/.story/story/config/story.toml
sed -i.bak -e "s%:26658%:${STORY_PORT}658%g;
s%:26657%:${STORY_PORT}657%g;
s%:26656%:${STORY_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${STORY_PORT}656\"%;
s%:26660%:${STORY_PORT}660%g" $HOME/.story/story/config/config.toml

11. Disable indexing

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

12. Add fresh peers

sed -i.bak -e 's/^seeds *=.*/seeds = ""/' $HOME/.story/story/config/config.toml
PEERS=$(curl -sS https://story-testnet-rpc.shachopra.com/net_info | jq -r '.result.peers[] | "\(.node_info.id)@\(.remote_ip):\(.node_info.listen_addr)"' | awk -F ':' '{print $1":"$(NF)}' | paste -sd, -)
echo $PEERS
sed -i.bak -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.story/story/config/config.toml

13. Create story-geth service file

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 --aeneid --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 0.0.0.0 --authrpc.addr 0.0.0.0 --http.port ${STORY_PORT}545 --authrpc.port ${STORY_PORT}551 --authrpc.vhosts '*' --ws --ws.api eth,web3,net,txpool --ws.addr 0.0.0.0 --ws.port ${STORY_PORT}546 --port 30308
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

14. Create story service file

sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[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
EOF

15. Download snapshot

sudo cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/priv_validator_state.json.backup
sudo rm -rf $HOME/.story/story/data
sudo rm -rf $HOME/.story/geth/aeneid/geth/chaindata
mkdir -p $HOME/.story/geth/aeneid/geth
wget -O snapshot_story.lz4 https://story-snapshot.shachopra.com:8443/downloads/snapshot_story.lz4
wget -O snapshot_storygeth.lz4.lz4 https://story-snapshot.shachopra.com:8443/downloads/snapshot_storygeth.lz4
lz4 -c -d snapshot_story.lz4 | pv | sudo tar -xv -C $HOME/.story/story/
lz4 -c -d snapshot_storygeth.lz4 | pv | sudo tar -xv -C $HOME/.story/geth/aeneid/geth/
sudo cp $HOME/.story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

16. Add geth enode

story-geth --exec 'admin.addPeer("enode://463a4e6d9c962e3f69a1c6a7e1bd4be248ac658e4b676b7e1010d7b50731f3067ca26335ca49ac3400ea7d98dab91a7379d79980d12ad9c74ae6d98e2045c055@107.181.252.150:30308")' attach ~/.story/geth/aeneid/geth.ipc

17. Start Story & Story-Geth node

sudo systemctl daemon-reload && \
sudo systemctl enable story-geth && \
sudo systemctl enable story && \
sudo systemctl start story-geth && \
sudo systemctl start story
# check status & logs
sudo systemctl status story-geth
sudo systemctl status story
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o cat

18. Check sync status

curl localhost:${STORY_PORT}657/status | jq

19. Create Validator (if you have 1024 tokens)

story validator export --export-evm-key --evm-key-path .env
story validator create --stake 1024000000000000000000 --moniker "<moniker>" --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=true

20. Export your Validator key & EVM Private key

story validator export
story validator export --export-evm-key

Last updated