Back to Home

STORY

Story is the World's IP Blockchain platform designed to onramp Programmable IP for powering next-generation AI, DeFi, and consumer applications through tokenization of intellectual property. Through its Proof of Creativity mechanism and EVM-compatible L1 blockchain, it enables creators to tokenize, monetize, and distribute their IP while ensuring proper attribution and compensation across collaborative scenarios and AI-powered remixes

Official | Discord | Twitter

Auto Script Cosmovisor RPC API Enode Peers Snapshot Addressbook Genesis RPC EVM Rest API Sync Left Faucet Explorer Monitoring Uptime Other Tool

Minimum Hardware

NODE CPU RAM SSD OS
Story 4 16 400 GB Ubuntu 22.04 LTS

Install dependencies

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

Story-Geth binary v0.10.1

cd $HOME
wget https://github.com/piplabs/story-geth/releases/download/v0.10.1/geth-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 geth-linux-amd64
mv $HOME/geth-linux-amd64 $HOME/go/bin/story-geth
source $HOME/.bash_profile
story-geth version

Story binary v0.13.0

cd $HOME
rm -rf story-linux-amd64
wget https://github.com/piplabs/story/releases/download/v0.13.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

Init Story

story init --network odyssey --moniker "moniker"

Create story-geth

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

[Install]
WantedBy=multi-user.target
EOF

Create story

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

Snapshot

# install dependencies, and disable statesync to avoid sync issues
sudo apt install curl tmux jq lz4 unzip -y
sed -i.bak -E "s|^(enable[[:space:]]+=[[:space:]]+).*$|\\1false|" $HOME/.story/story/config/config.toml

# stop node and backup priv_validator_state.json
sudo systemctl stop story story-geth
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup

# remove old data and unpack Story snapshot
rm -rf $HOME/.story/story/data
wget --spider https://files-story.catsmile.tech/story_data.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/story

# restore priv_validator_state.json
mv $HOME/.story/story/priv_validator_state.json.backup $HOME/.story/story/data/priv_validator_state.json

# delete geth data and unpack Geth snapshot
rm -rf $HOME/.story/geth/odyssey/geth/chaindata
wget --spider https://files-story.catsmile.tech/geth_chaindata.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/geth/odyssey/geth

# restart node and check logs
sudo systemctl restart story story-geth
sudo journalctl -u story-geth -u story -f

Restart story-geth

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

Restart story

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

Check logs story-geth

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

Check logs story

sudo journalctl -u story -f -o cat

Check sync

RPC_PORT=$(cat $HOME/.story/story/config/config.toml | grep "laddr = \"tcp" | head -n1 | cut -d: -f3 | tr -d '"')
curl localhost:$RPC_PORT/status | jq

Block sync left

echo "Moniker: $(curl -s localhost:$(grep -A3 "\[rpc\]" /root/.story/story/config/config.toml | grep "laddr" | cut -d'"' -f2 | cut -d':' -f3)/status | jq -r .result.node_info.moniker) | Story: v0.13.0-stable | Geth: v0.10.1 | $(RPC_PORT=$(grep -A3 "\[rpc\]" /root/.story/story/config/config.toml | grep "laddr" | cut -d'"' -f2 | cut -d':' -f3) && echo "Sync: $(curl -s localhost:$RPC_PORT/status | jq -r .result.sync_info.catching_up) | Local: $(curl -s localhost:$RPC_PORT/status | jq -r .result.sync_info.latest_block_height) | Remote: $(curl -s https://story-testnet-rpc.itrocket.net/status | jq -r .result.sync_info.latest_block_height) | Behind: $(($(curl -s https://odyssey.storyrpc.io/status | jq -r .result.sync_info.latest_block_height) - $(curl -s localhost:$RPC_PORT/status | jq -r .result.sync_info.latest_block_height))))")"

Export validator Public Key & Private key

story validator export --export-evm-key
cat /root/.story/story/config/private_key.txt

Check Balance

# Get EVM Address and check balance
EVM_ADDRESS=$(story validator export --export-evm-key 2>/dev/null | grep "EVM Address:" | cut -d: -f2 | tr -d ' ')
story-geth --exec "eth.getBalance('$EVM_ADDRESS')" attach ~/.story/geth/odyssey/geth.ipc

Create validator

# Get private key
PRIVATE_KEY=$(cat $HOME/.story/story/config/private_key.txt | grep -oP 'PRIVATE_KEY=\K.*')

# Get moniker
MONIKER=$(story status | jq -r .NodeInfo.moniker)

# Create validator
story validator create \
    --stake 1024000000000000000000 \
    --private-key "$PRIVATE_KEY" \
    --moniker "$MONIKER" \
    --chain-id 1516

Create Staking

# Get validator public key (hex)
VALIDATOR_PUBKEY=$(story validator export --export-evm-key 2>/dev/null | grep "Compressed Public Key (hex):" | cut -d: -f2 | tr -d ' ')

# Get private key
PRIVATE_KEY=$(cat $HOME/.story/story/config/private_key.txt | grep -oP 'PRIVATE_KEY=\K.*')

# Create staking
story validator stake \
    --validator-pubkey "$VALIDATOR_PUBKEY" \
    --stake 1024000000000000000000 \
    --private-key "$PRIVATE_KEY" \
    --chain-id 1516

Countdown Block upgrade Story v0.13.0

https://odyssey.storyscan.xyz/block/countdown/858000

Cosmovisor Tool Upgrade

# 1. Install Cosmovisor v1.7.0
source $HOME/.bash_profile
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
cosmovisor version

# 2. Setup directories and upgrade info
mkdir -p $HOME/.story/story/cosmovisor/upgrades/v0.13.0/bin
echo '{"name":"v0.13.0","time":"0001-01-01T00:00:00Z","height":858000}' > $HOME/.story/story/cosmovisor/upgrades/v0.13.0/upgrade-info.json

# 3. Download and setup binary v0.13.0
cd $HOME
rm -f story-linux-amd64
wget https://github.com/piplabs/story/releases/download/v0.13.0/story-linux-amd64
chmod +x story-linux-amd64
sudo cp $HOME/story-linux-amd64 $HOME/.story/story/cosmovisor/upgrades/v0.13.0/bin/story

# 4. Add Environment Variables
echo "export DAEMON_NAME=story" >> $HOME/.bash_profile
echo "export DAEMON_HOME=$HOME/.story/story" >> $HOME/.bash_profile
source $HOME/.bash_profile

# 5. Update Story Service for Cosmovisor
sudo tee /etc/systemd/system/story.service > /dev/null << EOF
[Unit]
Description=Story Consensus Client
After=network.target

[Service]
User=root
Environment="DAEMON_NAME=story"
Environment="DAEMON_HOME=/root/.story/story"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="DAEMON_DATA_BACKUP_DIR=/root/.story/story/data"
ExecStart=/root/go/bin/cosmovisor run run
Restart=always
RestartSec=3
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target
EOF

# Reload daemon and restart service
sudo systemctl daemon-reload
sudo systemctl restart story

# 6. Verify setup
sudo apt install tree
tree $HOME/.story/story/cosmovisor
ls -l $HOME/.story/story/cosmovisor/current
$HOME/.story/story/cosmovisor/upgrades/v0.12.1/bin/story version  # current version
$HOME/.story/story/cosmovisor/upgrades/v0.13.0/bin/story version  # upgrade version
cat $HOME/.story/story/cosmovisor/upgrades/v0.13.0/upgrade-info.json

# 7. Setup upgrade
source $HOME/.bash_profile
cosmovisor add-upgrade v0.13.0 $HOME/.story/story/cosmovisor/upgrades/v0.13.0/bin/story --force --upgrade-height 858000

# 8. Monitor upgrade status
sudo systemctl status story
sudo journalctl -u story -f

Delete 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