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

# Installation

Chain ID: aeneid| Node Version: geth v1.2.0 | storyd v1.4.2

#### Setup validator name

```bash
MONIKER=<your_moniker>
```

### Install dependencies

#### Update system and install build tools

```bash
sudo apt -q update
sudo apt -qy install curl git jq lz4 build-essential
sudo apt -qy upgrade
```

#### Install GO

```bash
sudo rm -rf /usr/local/go
curl -Ls https://go.dev/dl/go1.24.6.linux-amd64.tar.gz | sudo tar -xzf - -C /usr/local
eval $(echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/golang.sh)
eval $(echo 'export PATH=$PATH:$HOME/go/bin' | tee -a $HOME/.profile)
echo "export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version
```

#### **Download binary files**

```shellscript
cd $HOME
rm -rf story-geth
wget -O story-geth https://github.com/piplabs/story-geth/releases/download/v1.2.0/geth-linux-amd64
chmod +x $HOME/story-geth
mv $HOME/story-geth $HOME/go/bin/
[ ! -d "$HOME/.story/story" ] && mkdir -p "$HOME/.story/story"
[ ! -d "$HOME/.story/geth" ] && mkdir -p "$HOME/.story/geth"
```

#### **Install Story**

```shellscript
cd $HOME
rm -rf story
git clone https://github.com/piplabs/story
cd story
git checkout v1.4.2
go build -o story ./client 
mv $HOME/story/story $HOME/go/bin/
```

#### **Initialize the node**

```shellscript
story init $MONIKER --network aeneid
```

#### **Set node configuration**

```shellscript
# download genesis and addrbook
wget -O $HOME/.story/story/config/genesis.json https://services-t.skyneticlabs.com/story/genesis.json
wget -O $HOME/.story/story/config/addrbook.json https://services-t.skyneticlabs.com/story/addrbook.json

# set seeds and peers
SEEDS=""
PEERS="23a0ed1762417267c60c63c2a86ea9e84c47c0ca@story-peer-t.skyneticlabs.com:26656,d6c13af818704c64a42f77d74ab6ab6dc4e164dd@65.108.74.218:40656,cee58e7a8724fea3022be98898d7346d12a0ef80@164.152.162.119:36656,aea85cf7e03258e9b02cdd8854f64857e9046d73@89.187.156.100:26698,5f22818fcf0d8cab31a490ae038b4f06a5632685@95.217.225.107:26656,49e0ad1852417267c60c63c2a86ea9e84c47c0ca@13.213.66.56:26656,5c2a752c9b1952dbed075c56c600c3a79b58c395@195.3.221.9:27206,f05e6a065b772dda4c7c0cbed40894a8c43416c7@170.64.159.104:26656,f9e950870eccdb40e2386896d7b6a7687a103c99@88.99.219.120:43656,8badeed7f48eefd5d43af7eb7662f2b578304a27@138.201.63.38:26686,e1b058e5cfa2b836ddaa496b10911da62dcf182e@164.152.161.199:36656,15eb02dd78fe034a9bb35ab325290004ddf67c9a@138.201.122.61:36656,a831cf42d79aded9d25efd71b1a6629311c2f644@95.217.120.205:11656,878e4d1b5300754f5797c23f03e8f95259ed9192@5.9.115.9:21656,8f282e0237ec45dd0a959bd3e2872f088133a58a@31.7.196.17:26656,3b5cfaef16c0affb426c9dd159cd3da6049159c2@217.160.102.31:26656,edafdf47c443344fb940a32ab9d2067c482e59df@84.32.71.47:26656,24f79d2f249d491daae85fdc774203c47b2fbcab@91.191.213.10:26656,66ff3e802fe41b193c9ab367637c71b1be7e2e7b@65.109.49.115:11656"
sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
       -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.story/story/config/config.toml

# enable 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.toml
```

#### **Create getch service file**

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

#### **Create story service file**

```shellscript
sudo tee /etc/systemd/system/story.service > /dev/null <<EOF
[Unit]
Description=story Daemon
After=network-online.target

[Service]
User=$USER
ExecStart=$(which story) run

Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
```

#### **Download latest chain snapshot**

```shellscript
cp $HOME/.story/story/data/priv_validator_state.json $HOME/.story/story/priv_validator_state.json.backup
rm -rf $HOME/.story/story/data
curl https://services-t.skyneticlabs.com/story/testnet/snap.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/story

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

# unpack Geth snapshot
rm -rf $HOME/.story/geth/aeneid/geth/chaindata
mkdir -p $HOME/.story/geth/aeneid/geth
curl https://services-t.skyneticlabs.com/story/testnet/snap_geth.tar.lz4 | lz4 -dc - | tar -xf - -C $HOME/.story/geth/story/geth

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

#### **Start service and check the logs**

```shellscript
sudo systemctl daemon-reload
sudo systemctl enable story story-geth
sudo systemctl restart story-geth && sleep 5 && sudo systemctl restart story
journalctl -u story -u story-geth -f
```

### Create validator <a href="#create-validator" id="create-validator"></a>

View your validator key

```shellscript
story validator export
```

Export EVM private key

```shellscript
story validator export --export-evm-key
```

View EVM private key and make a key backup

```shellscript
cat $HOME/.story/story/config/private_key.txt
```

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

#### Create validator, locked

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --chain-id 1315 --unlocked=false
```

#### Create validator, unlocked

```bash
story validator create --stake 1024000000000000000000 --moniker $MONIKER --chain-id 1315 --unlocked=true
```

Remember to backup your validator priv\_key from here:

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