Story Protocol Mainnet Validator Guide

System Requirements

Running a Story Protocol validator requires robust hardware to ensure reliable performance. We recommend the following specifications:

ComponentRecommendation
CPU8 Cores
RAM32 GB
Storage500 GB
Network25 MBit/s bandwidth

For additional information, the official documentation is available at: Story Foundation Docs

Installation Procedure

Install Required Dependencies

Begin by updating your system and installing necessary packages:

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

Set Up Story-Geth Binary (v1.0.2)

Download and compile the Story-Geth client:

cd $HOME
git clone https://github.com/piplabs/story-geth
cd story-geth
make geth
cp build/bin/geth $HOME/go/bin/story-geth
source $HOME/.bash_profile
story-geth version

After successful installation, you should see version information similar to:

Geth
Version: 1.0.2-stable
Git Commit: 3daeb0c89d72055608b93a94c9f6ca777f5e80f7
Architecture: amd64
Go Version: go1.22.0
Operating System: linux
GOPATH=
GOROOT=

Install Story Binary (v1.1.0)

Download and configure the Story binary:

cd $HOME
rm -rf story-linux-amd64
wget https://github.com/piplabs/story/releases/download/v1.1.0/story-linux-amd64
[ ! -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
chmod +x story-linux-amd64
sudo cp $HOME/story-linux-amd64 $HOME/go/bin/story
source $HOME/.bash_profile
story version

You should see the following version information:

Version       v1.1.0-stable
Git Commit    0949ba7
Git Timestamp 2025-02-05T05:49:22Z

Node Configuration

Reset State (If Needed)

If you need to start from a completely fresh state:

Warning: This will delete your priv_validator_key.json file. Always back up your key at /root/.story/story/config/priv_validator_key.json before removing any node data.

rm -rf $HOME/.story

Initialize Your Node

Initialize a new Story mainnet node:

story init --network story --moniker "Your_moniker_name"

Create Service Files

Set up the Story-Geth service:

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 --story --syncmode full
Restart=on-failure
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

Set up the Story consensus client service:

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

Start Your Services

Start the Story-Geth Service

sudo systemctl daemon-reload && \
sudo systemctl start story-geth && \
sudo systemctl enable story-geth && \
sudo systemctl status story-geth

Start the Story Consensus Service

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

Monitor Your Node

Check Logs

For Story-Geth logs:

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

Allow a minute for peers to connect before checking.

For Story consensus logs:

sudo journalctl -u story -f -o cat

Verify Sync Status

Check if your node is syncing properly:

curl localhost:26657/status | jq

Validator Setup

Export Validator Keys

Access your validator key information:

story validator export

This will display information similar to:

Compressed Public Key (hex): 03bdc7b8940babe9226d52d7fa299a1faf3d64a82f809889256c8f146958a63984
Compressed Public Key (base64): A73HuJQLq+kibVLX+imaH689ZKgvgJiJJWyPFGlYpjmE
Uncompressed Public Key (hex): 04bdc7b8940babe9226d52d7fa299a1faf3d64a82f809889256c8f146958a6398496b9e2af0a3a1d199c3cc1d09ee899336a530c185df6b46a9735b25e79a493af
EVM Address: 0x9EacBe2C3B1eb0a9FC14106d97bd3A1F89efdDCc
Validator Address: storyvaloper1p470h0jtph4n5hztallp8vznq8ehylsw9vpddx
Delegator Address: story1p470h0jtph4n5hztallp8vznq8ehylswtr4vxd

To export your EVM private key:

story validator export --export-evm-key

Note: To participate in consensus, you must stake at least 1 IP (equivalent to 1000000000000000000 wei). You can request tokens from the Story Foundation Faucet.

Create Validator

Create your validator with the specified stake:

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

Important: Make sure to back up your validator key file located at /root/.story/story/config/priv_validator_key.json. This is the most critical key for your validator operation.

Stake Additional Tokens

To stake additional tokens to your validator:

story validator stake \
   --validator-pubkey "VALIDATOR_PUB_KEY_IN_HEX" \
   --stake 1024000000000000000000 \
   --private-key xxxxxxxxxxxxxx

Replace VALIDATOR_PUB_KEY_IN_HEX with your actual validator public key. Note that 1024000000000000000000 equals 1024 IP tokens.

Node Removal (If Needed)

Warning: Always back up your data, private key, and validator key before removing your node.

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