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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cryptomolot.gitbook.io/cryptomolot-docs/testnets/story-protocol.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
