Installation

System Specs
Hardware | Requirement |
---|---|
CPU | 4 Cores |
RAM | 16 GB |
Disk | 500 GB |
Bandwidth | 25 MBit/s |
https://docs.story.foundation/docs/node-setup
Install dependencies
sudo apt updatesudo apt-get updatesudo apt install curl git make jq build-essential gcc unzip wget lz4 aria2 -y
Download Story-Geth binary v1.0.1
cd $HOMEgit clone https://github.com/piplabs/story-gethcd story-gethmake gethcp build/bin/geth $HOME/go/bin/story-gethsource $HOME/.bash_profilestory-geth version
You will see the version of the geth binary:
⚡ root@josephtran ~ story-geth versionGethVersion: 1.0.1-stableGit Commit: c50b42fc245adbd03b2b51b84e6c1ba47b624f09Git Commit Date: 20250130Architecture: amd64Go Version: go1.22.0Operating System: linuxGOPATH=GOROOT=
Download Story binary v1.1.0
cd $HOMErm -rf story-linux-amd64wget https://github.com/piplabs/story/releases/download/v1.1.0/story-linux-amd64[ ! -d "$HOME/go/bin" ] && mkdir -p $HOME/go/binif ! grep -q "$HOME/go/bin" $HOME/.bash_profile; then echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profilefichmod +x story-linux-amd64sudo cp $HOME/story-linux-amd64 $HOME/go/bin/storysource $HOME/.bash_profilestory version
You should expect to see version 1.0.0-stable:
⚡ root@josephtran ~ story versionVersion v1.1.0-stableGit Commit 0949ba7Git Timestamp 2025-02-05T05:49:22Z
Clear state:
If you ever run into issues and would like to try joining the network from a COMPLETELY fresh state
rm -rf $HOME/.story
Init Story Testnet Aeneid node
story init --network aeneid --moniker "Your_moniker_name"
Create story-geth service file
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF[Unit]Description=Story Geth ClientAfter=network.target
[Service]User=rootExecStart=/root/go/bin/story-geth --aeneid --syncmode fullRestart=on-failureRestartSec=3LimitNOFILE=4096
[Install]WantedBy=multi-user.targetEOF
Create story service file
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF[Unit]Description=Story Consensus ClientAfter=network.target
[Service]User=rootExecStart=/root/go/bin/story runRestart=on-failureRestartSec=3LimitNOFILE=4096
[Install]WantedBy=multi-user.targetEOF
Download snapshot
# download Story snapshotcd $HOMErm -f Story_snapshot.lz4aria2c -x 16 -s 16 -k 1M https://story.j-node.net/testnet/Story_snapshot.lz4
# download Geth snapshotcd $HOMErm -f Geth_snapshot.lz4aria2c -x 16 -s 16 -k 1M https://story.j-node.net/testnet/Geth_snapshot.lz4
# backup priv_validator_state.jsoncp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/priv_validator_state.json.backup
# remove old datarm -rf $HOME/.story/story/datarm -rf $HOME/.story/geth/aeneid/geth/chaindata
# decompress Story snapshotsudo mkdir -p $HOME/.story/story/datalz4 -d -c Story_snapshot.lz4 | pv | sudo tar xv -C $HOME/.story/story/ > /dev/null
# decompress Geth snapshotsudo mkdir -p $HOME/.story/geth/aeneid/geth/chaindatalz4 -d -c Geth_snapshot.lz4 | pv | sudo tar xv -C $HOME/.story/geth/aeneid/geth/ > /dev/null
# restore priv_validator_state.jsoncp $HOME/.story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json
Reload and start story-geth
sudo systemctl daemon-reload && \sudo systemctl start story-geth && \sudo systemctl enable story-geth && \sudo systemctl status story-geth

Reload and start story
sudo systemctl daemon-reload && \sudo systemctl start story && \sudo systemctl enable story && \sudo systemctl status story

Check logs
sudo journalctl -u story-geth -f -o cat

Wait a minute for connect peers
sudo journalctl -u story -f -o cat

Check sync status
curl localhost:26657/status | jq
Check block sync left:
while true; do local_height=$(curl -s localhost:26657/status | jq -r '.result.sync_info.latest_block_height'); network_height=$(curl -s https://aeneid.storyrpc.io/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

Faucet token
- Faucet link:
Story | Google Cloud Faucet
- Explorer:
STORY Explorer
Create validator
Export validator Public Key & Private key
By default, when you run story init
a validator key is created for you. To view your validator key, run the following command:
story validator export
This will print out your validator public key file in compressed and uncompressed formats. By default, we use the hex-encoded compressed key for public identification.
Compressed Public Key (hex): 03bdc7b8940babe9226d52d7fa299a1faf3d64a82f809889256c8f146958a63984Compressed Public Key (base64): A73HuJQLq+kibVLX+imaH689ZKgvgJiJJWyPFGlYpjmEUncompressed Public Key (hex): 04bdc7b8940babe9226d52d7fa299a1faf3d64a82f809889256c8f146958a6398496b9e2af0a3a1d199c3cc1d09ee899336a530c185df6b46a9735b25e79a493afEVM Address: 0x9EacBe2C3B1eb0a9FC14106d97bd3A1F89efdDCcValidator Address: storyvaloper1p470h0jtph4n5hztallp8vznq8ehylsw9vpddxDelegator Address: story1p470h0jtph4n5hztallp8vznq8ehylswtr4vxd
In addition, if you want to export the derived EVM private key of your validator into the default data config directory, please run the following:
story validator export --export-evm-key
Note that to participate in consensus, at least 1024 IP must be staked (equivalent to 1024000000000000000000 wei
)!
Faucet link: https://cloud.google.com/application/web3/faucet/story/aeneid/

Create validator
story validator create --stake 1024000000000000000000 --private-key "your_private_key" --moniker "your_moniker_name"

Validator Staking
story validator stake \ --validator-pubkey "VALIDATOR_PUB_KEY_IN_HEX" \ --stake 1024000000000000000000 \ --private-key xxxxxxxxxxxxxx
Replace VALIDATOR_PUB_KEY_IN_HEX
Amount: 1024000000000000000000
=1024 IP Token
# Delete node
sudo systemctl stop story-gethsudo systemctl stop storysudo systemctl disable story-gethsudo systemctl disable storysudo rm /etc/systemd/system/story-geth.servicesudo rm /etc/systemd/system/story.servicesudo systemctl daemon-reloadsudo rm -rf $HOME/.storysudo rm $HOME/go/bin/story-gethsudo rm $HOME/go/bin/story