This section will guide you through how to setup a Story node for mainnet. 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 API, 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.
The story and geth binaries, which make up the clients required for running Story nodes, are available from our latest release pages:
# Download and install Go 1.22.0cd $HOME# Set Go versionGO_VERSION="1.22.0"# Download Go binarywget "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz"# Remove existing Go installation and extract new versionsudo rm -rf /usr/local/gosudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"# Clean up downloaded archiverm "go${GO_VERSION}.linux-amd64.tar.gz"# Add Go to PATHecho "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> ~/.bash_profilesource ~/.bash_profile# Verify installationgo version
Below we list a sample Systemd configuration you may use on Linux
# storysudo tee /etc/systemd/system/story.service > /dev/null <<EOF[Unit]Description=Story CosmovisorAfter=network.target[Service]Type=simpleUser=$USERGroup=$GROUPExecStart=/usr/local/bin/cosmovisor run run \--api-enable \--api-address=0.0.0.0:1317Restart=on-failureRestartSec=5sLimitNOFILE=65535Environment="DAEMON_NAME=$DAEMON_NAME"Environment="DAEMON_HOME=$DAEMON_HOME"Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"Environment="DAEMON_RESTART_AFTER_UPGRADE=true"Environment="DAEMON_DATA_BACKUP_DIR=$DAEMON_HOME/cosmovisor/backup"WorkingDirectory=$DAEMON_HOME[Install]WantedBy=multi-user.targetEOF
# storysudo tee /etc/systemd/system/story.service > /dev/null <<EOF[Unit]Description=Story CosmovisorAfter=network.target[Service]Type=simpleUser=${USER}Group=${GROUP}ExecStart=${path_to_story_binary} run run \--api-enable \--api-address=0.0.0.0:1317Restart=on-failureRestartSec=5sLimitNOFILE=65535Environment="DAEMON_NAME=$DAEMON_NAME"Environment="DAEMON_HOME=$DAEMON_HOME"Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"Environment="DAEMON_RESTART_AFTER_UPGRADE=true"Environment="DAEMON_DATA_BACKUP_DIR=$DAEMON_HOME/cosmovisor/backup"WorkingDirectory=$DAEMON_HOME[Install]WantedBy=multi-user.targetEOF
# storysudo tee /etc/systemd/system/story.service > /dev/null <<EOF[Unit]Description=Story CosmovisorAfter=network.target[Service]Type=simpleUser=${USER}Group=${GROUP}ExecStart=${path_to_story_binary} run run \--api-enable \--api-address=0.0.0.0:1317Restart=on-failureRestartSec=5sLimitNOFILE=65535Environment="DAEMON_NAME=$DAEMON_NAME"Environment="DAEMON_HOME=$DAEMON_HOME"Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"Environment="DAEMON_RESTART_AFTER_UPGRADE=true"Environment="DAEMON_DATA_BACKUP_DIR=$DAEMON_HOME/cosmovisor/backup"WorkingDirectory=$DAEMON_HOME[Install]WantedBy=multi-user.targetEOF
# storysudo tee /etc/systemd/system/story.service > /dev/null <<EOF[Unit]Description=Story CosmovisorAfter=network.target[Service]Type=simpleUser=${USER}Group=${GROUP}ExecStart=${path_to_story_binary} runRestart=on-failureRestartSec=5sLimitNOFILE=65535WorkingDirectory=$HOME/.story/story[Install]WantedBy=multi-user.targetEOF
If you would like to check the status of story while it is running, it is helpful to query its internal JSONRPC/HTTP endpoint. Here are a few helpful commands to run: