> For the complete documentation index, see [llms.txt](https://cryptomolot.gitbook.io/cryptomolot-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cryptomolot.gitbook.io/cryptomolot-docs/testnets/story-protocol.md).

# Story Protocol

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

<table><thead><tr><th>Website</th><th data-type="content-ref">https://www.storyprotocol.xyz/</th></tr></thead><tbody><tr><td>Github</td><td><a href="https://github.com/piplabs/story">https://github.com/piplabs/story</a></td></tr><tr><td>Explorer</td><td><a href="https://explorer.story.foundation/">https://explorer.story.foundation/</a></td></tr><tr><td>Docs</td><td><a href="https://docs.story.foundation/docs/">https://docs.story.foundation/docs/</a></td></tr><tr><td>Discord</td><td><a href="https://discord.gg/storyprotocol">https://discord.gg/storyprotocol</a></td></tr></tbody></table>

## Hardware requirements

<table data-view="cards"><thead><tr><th>CPU</th><th>RAM</th><th>Storage</th><th>Network</th><th>OS</th></tr></thead><tbody><tr><td>8 cores</td><td>32 GB</td><td>500 GB NVME</td><td>25 MBit/s</td><td>Linux (Ubuntu 24.04 x64)</td></tr></tbody></table>

## Installation 💾

## Update repositories

```bash
apt update && apt upgrade -y
```

## Install dependencies

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

Install GO

```bash
cd $HOME && ver="1.24.10" && \
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" && \
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bash_profile && \
source ~/.bash_profile && go version
```

Set var (replace your Moniker and custom port)

```bash
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_profile
```

Get binaries

```bash
# Get Story-geth
cd $HOME
rm -rf story-geth
git clone https://github.com/piplabs/story-geth.git
cd story-geth
git checkout v1.2.1
make geth
mv build/bin/geth  $HOME/go/bin/story-geth
[ ! -d "$HOME/.story/story-geth" ] && mkdir -p "$HOME/.story/story-geth"
story-geth version


# Get Story
cd $HOME
rm -rf story
git clone https://github.com/piplabs/story
cd story
git checkout v1.6.1
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 version
```

## Initialize

```bash
story init --moniker $MONIKER --network $STORY_CHAIN_ID
```

Set custom ports in story.toml and config.toml file (if needed)

```bash
sed -i.bak -e "s%:1317%:${STORY_PORT}317%g;
s%:8551%:${STORY_PORT}551%g" $HOME/.story/story/config/story.toml
```

```bash
sed -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.toml
```

Enable prometheus and disable indexing

```bash
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.toml
```

## Create a service Story-geth

```bash
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/story-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
EOF
```

## Create a service Story

```bash
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
EOF
```

Restart and run

```bash
# 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 story
```

Check status

```bash
curl localhost:${STORY_PORT}657/status | jq
```

Check logs

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

## Sync 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/>

{% hint style="info" %}
Wait for full synchronization before proceeding to the next step
{% endhint %}

## Create a validator

View validator key

```bash
story validator export
```

## Export EVM private key

```bash
story validator export --export-evm-key
```

You 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

{% hint style="info" %}
The `.env` file should look like the following *(make sure not to add a 0x prefix):*

PRIVATE\_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{% endhint %}

```bash
mv $HOME/.story/story/config/private_key.txt $HOME/.env
```

Create validator, locked:

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=false
```

Or create validator, unlocked:

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --rpc https://aeneid.storyrpc.io --chain-id 1315 --unlocked=true
```

Remember to backup your **validator priv\_key** from here

```bash
cat $HOME/.story/story/config/priv_validator_key.json
```

## Useful commands ⚙️

node info

```bash
curl localhost:$(sed -n '/\[rpc\]/,/laddr/ { /laddr/ {s/.*://; s/".*//; p} }' $HOME/.story/story/config/config.toml)/status | jq
```

logs

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

restart service

<pre class="language-bash"><code class="lang-bash">sudo systemctl restart story-geth
<strong>sudo systemctl restart story
</strong></code></pre>

stop service

```bash
sudo systemctl stop story-geth
sudo systemctl stop story
```

enable service

```bash
sudo systemctl enable story-geth
sudo systemctl enable story
```

disable service

```bash
sudo systemctl disable story-geth
sudo systemctl disable story
```

## Delete node 🗑️

```bash
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
```
