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
NODE | CPU | RAM | SSD | OS |
---|---|---|---|---|
Story | 4 | 16 | 400 GB | Ubuntu 22.04 LTS |
sudo apt update
sudo apt-get update
sudo apt install curl git make jq build-essential gcc unzip wget lz4 aria2 -y
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
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
story init --network odyssey --moniker "moniker"
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
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
# 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
sudo systemctl daemon-reload
sudo systemctl start story-geth
sudo systemctl enable story-geth
sudo systemctl status story-geth
sudo systemctl daemon-reload
sudo systemctl start story
sudo systemctl enable story
sudo systemctl status story
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o cat
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
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))))")"
story validator export --export-evm-key
cat /root/.story/story/config/private_key.txt
# 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
# 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
# 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
https://odyssey.storyscan.xyz/block/countdown/858000
# 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
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