Story Protocol
Aeneid Testnet
Story is making the legal system for creative Intellectual Property (IP) more efficient by turning IP "programmable" on the blockchain. To do this, we have created Story Network: a purpose-built layer 1 blockchain where people or programs alike can license, remix, and monetize IP according to transparent terms set by creators themselves. Resources
Hardware requirements
8 cores
32 GB
500 GB NVME
25 MBit/s
Linux (Ubuntu 24.04 x64)
Installation 💾
Update repositories
apt update && apt upgrade -yInstall dependencies
sudo apt install curl git make jq build-essential gcc unzip wget lz4 aria2 -yInstall GO
cd $HOME
VER="1.22.11"
wget "https://golang.org/dl/go$VER.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go$VER.linux-amd64.tar.gz"
rm "go$VER.linux-amd64.tar.gz"
[ ! -f ~/.bash_profile ] && touch ~/.bash_profile
echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profile
source $HOME/.bash_profile
[ ! -d ~/go/bin ] && mkdir -p ~/go/binSet var (replace your Moniker and custom port)
echo "export MONIKER="Moniker"" >> $HOME/.bash_profile
echo "export STORY_CHAIN_ID="aeneid"" >> $HOME/.bash_profile
echo "export STORY_PORT="26"" >> $HOME/.bash_profile
source $HOME/.bash_profileGet binaries
# Get Story-geth
cd $HOME
rm -rf story-geth
git clone https://github.com/piplabs/story-geth.git
cd story-geth
git checkout v1.1.1
make geth
mv build/bin/geth $HOME/go/bin/
[ ! -d "$HOME/.story/geth" ] && mkdir -p "$HOME/.story/geth"
story-geth version
# Get Story
cd $HOME
rm -rf story
git clone https://github.com/piplabs/story
cd story
git checkout v1.3.3
go build -o story ./client
mkdir -p $HOME/go/bin/
mv $HOME/story/story $HOME/go/bin/
[ ! -d "$HOME/.story/story" ] && mkdir -p "$HOME/.story/story"
story versionInitialize
story init --moniker $MONIKER --network $STORY_CHAIN_IDSet custom ports in story.toml and config.toml file (if needed)
sed -i.bak -e "s%:1317%:${STORY_PORT}317%g;
s%:8551%:${STORY_PORT}551%g" $HOME/.story/story/config/story.tomlsed -i.bak -e "s%:26658%:${STORY_PORT}658%g;
s%:26657%:${STORY_PORT}657%g;
s%:26656%:${STORY_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${STORY_PORT}656\"%;
s%:26660%:${STORY_PORT}660%g" $HOME/.story/story/config/config.tomlEnable prometheus and disable indexing
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.story/story/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.story/story/config/config.tomlCreate a service Story-geth
sudo tee /etc/systemd/system/story-geth.service > /dev/null <<EOF
[Unit]
Description=Story Geth daemon
After=network-online.target
[Service]
User=$USER
ExecStart=$HOME/go/bin/geth --aeneid --syncmode full --http --http.api eth,net,web3,engine --http.vhosts '*' --http.addr 0.0.0.0 --http.port ${STORY_PORT}545 --authrpc.port ${STORY_PORT}551 --ws --ws.api eth,web3,net,txpool --ws.addr 0.0.0.0 --ws.port ${STORY_PORT}546
Restart=on-failure
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOFCreate a service Story
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=Story Service
After=network.target
[Service]
User=$USER
WorkingDirectory=$HOME/.story/story
ExecStart=$(which story) run
Restart=on-failure
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOFRestart and run
# Story-geth
sudo systemctl daemon-reload && \
sudo systemctl start story-geth && \
sudo systemctl enable story-geth && \
sudo systemctl status story-geth
# Story
sudo systemctl daemon-reload && \
sudo systemctl start story && \
sudo systemctl enable story && \
sudo systemctl status storyCheck status
curl localhost:${STORY_PORT}657/status | jqCheck logs
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o catSync from snapshot
Your node must be synchronized for at least one block
Download the latest snapshot provided by the ITRocket team:https://itrocket.net/services/testnet/story/
Create a validator
View validator key
story validator exportExport EVM private key
story validator export --export-evm-keyYou can import the private key into an EVM wallet
For create the validator, we need 1024 $IP token.
Form
We ask interested teams to complete this form here for testnet token (this is not gated) https://docs.google.com/forms/d/e/1FAIpQLSdCgT7rSxGTkWXbBjzAZco8UyTBuTtjb87s5k0BEp5n6PF6jA/viewform Submission is also required to receive Aeneid tokens.
Create a validator
Move your txt file to .env file with your private key
mv $HOME/.story/story/config/private_key.txt $HOME/.envCreate validator, locked:
story validator create --stake 1024000000000000000000 --moniker $MONIKER --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=falseOr create validator, unlocked:
story validator create --stake 1024000000000000000000 --moniker $MONIKER --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=trueRemember to backup your validator priv_key from here
cat $HOME/.story/story/config/priv_validator_key.jsonUseful commands ⚙️
node info
curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jqlogs
sudo journalctl -u story-geth -f -o cat
sudo journalctl -u story -f -o catrestart service
sudo systemctl restart story-geth
sudo systemctl restart storystop service
sudo systemctl stop story-geth
sudo systemctl stop storyenable service
sudo systemctl enable story-geth
sudo systemctl enable storydisable service
sudo systemctl disable story-geth
sudo systemctl disable storyDelete 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/storyLast updated