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:

    1. v0.12.1 upgrade at height 322,000

    2. 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