Node Setup
Story draws inspiration from ETH PoS in decoupling execution and consensus clients. The execution client story-geth
relays EVM blocks into the story
consensus client via Engine ABI, using an ABCI++ adapter to make EVM state compatible with that of CometBFT. With this architecture, consensus efficiency is no longer bottlenecked by execution transaction throughput.

Requirements
The minimum hardware requirements for running an Story Node
are:
Ports
Execution process: 30303(p2p)
Consensus process: 26656(p2p)
Install Tools
sudo apt -q update
sudo apt -qy install curl git jq lz4 build-essential aria2 unzip wget
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.22.0.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/gobinpath.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | sudo tee /etc/profile.d/gopath.sh)
Execution Client setup
# switch root user
# Set home dir, example: /data/story-geth
sudo -i
export DIR=/data/story-geth
mkdir -pv $DIR/data
export TAG=v0.10.1
cd $DIR
wget https://github.com/piplabs/story-geth/releases/download/v0.10.1/geth-linux-amd64
mv geth-linux-amd64 story-geth
chmod +x story-geth
./story-geth version
# output
Geth
Version: 0.10.1-stable
Git Commit: b60a3ba8d47e60a6c78ca0570f7dac66e8976d93
Git Commit Date: 20241119
Architecture: amd64
Go Version: go1.22.0
Operating System: linux
GOPATH=
GOROOT=/opt/hostedtoolcache/go/1.22.0/x64
# gen start_node.sh
random_hex=$(openssl rand -hex 32)
echo $random_hex > $DIR/.jwt.hex
tee $DIR/start_node.sh > /dev/null << EOF
#!/bin/bash
${DIR}/story-geth \
--odyssey --syncmode full \
--datadir $DIR/data \
--http \
--http.addr "0.0.0.0" \
--authrpc.jwtsecret=${DIR}/.jwt.hex \
--authrpc.vhosts="*"
EOF
# gen service file
tee /etc/systemd/system/story-geth.service > /dev/null << EOF
[Unit]
Description=story geth client
After=network-online.target
[Service]
User=root
ExecStart=bash start_node.sh
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
WorkingDirectory=$DIR
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start story-geth
# query run log
journalctl -u story-geth.service -f -o cat
Consensus Client Install
IMPORTANT: If you are setting up a new node, you must start with version v0.12.0, as this base version is required before applying any subsequent upgrades. Afterward, install each subsequent upgrade in order. Follow these steps carefully:
Initialize and run version v0.12.0 following the initialization and run instructions provided above.
Download and upgrade to the following releases using this guide:
v0.12.1 upgrade at height 322,000
v0.13.0 upgrade at height 858,000
export Net=odyssey
export DIR=/data/story
mkdir -pv $DIR
ln -sv $DIR /root/.story/story
export old1tag=v0.12.0
export old2tag=v0.12.1
export tag=v0.13.0
cd $DIR
wget https://github.com/piplabs/story/releases/download/${old1tag}/story-linux-amd64 && mv story-linux-amd64 story-${old1tag} && chmod +x story-${old1tag}
wget https://github.com/piplabs/story/releases/download/${old2tag}/story-linux-amd64 && mv story-linux-amd64 story-${old2tag} && chmod +x story-${old2tag}
wget https://github.com/piplabs/story/releases/download/${tag}/story-linux-amd64 && mv story-linux-amd64 story-${tag} && chmod +x story-${tag}
./story-${old1tag} init --network $Net --moniker "xxx"
# update jwt path
sed -i '/^engine-jwt-file/ s|=.*|= "/data/story-geth/.jwt.hex"|' ${DIR}/config/story.toml
Create Service with Cosmovisor
export DIR=/data/story
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
mkdir -pv $DIR/cosmovisor/genesis/bin
mkdir -pv $DIR/cosmovisor/upgrades/${old2tag}/bin
mkdir -pv $DIR/cosmovisor/upgrades/${tag}/bin
ln -sv $DIR/cosmovisor/genesis $DIR/cosmovisor/current
cp story-${old1tag} $DIR/cosmovisor/genesis/bin/story
cp story-${old2tag} $DIR/cosmovisor/upgrades/${old2tag}/bin/story
cp story-${tag} $DIR/cosmovisor/upgrades/${tag}/bin/story
tee /etc/systemd/system/story.service > /dev/null << EOF
[Unit]
Description=story consensus node service
After=network-online.target
[Service]
User=$USER
Restart=on-failure
Type=simple
ExecStart=$(which cosmovisor) run run --network odyssey
WorkingDirectory=$DIR
SyslogIdentifier=story
LimitNOFILE=65545
Environment="DAEMON_NAME=story"
Environment="DAEMON_HOME=$DIR"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_LOG_BUFFER_SIZE=512"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="UNSAFE_SKIP_BACKUP=true"
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable story.service
systemctl start story.service
journalctl -u story.service -f -o cat
Last updated