> For the complete documentation index, see [llms.txt](https://docs.x1.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.x1.xyz/validating/create-a-read-only-node.md).

# Create a read-only node

Tutorial\*

{% embed url="<https://www.youtube.com/watch?v=o61ROj-H0zY>" %}

\*below are additional steps not covered in tutorial

Open a Terminal application

## 1. Install rust, cargo, rustfmt etc

Install rustc, cargo and rustfmt.

```sh
curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
rustup component add rustfmt
```

Make sure you are using the latest stable rust version by running:

```sh
rustup update
```

Also install git, libssl-dev, pkg-config, zlib1g-dev, protobuf etc.

```sh
sudo apt-get update
sudo apt-get build-essential pkg-config libudev-dev llvm libclang-dev protobuf-compiler
```

## 2. Install Tachyon v3.0 and Solana tools

Clone the Tachyon repository:

```bash
git clone https://github.com/x1-labs/tachyon.git
```

Build Tachyon and the solana tools:

```shell
cd tachyon
git checkout v3.0
cargo build --release
```

Update your `PATH` environment variable:

```bash
export PATH=$PATH:$(pwd)/target/release
echo "export PATH=$PATH:$(pwd)/target/release" >> ~/.bashrc
```

Verify the installation:

```bash
solana --version
tachyon-validator --version
```

> If you see the versions listed below, the installation was successful:

```
solana-cli 2.0.21 (src:00000000; feat:607245837, client:Tachyon)
x1-validator 3.0.15 (src:647a99eb; feat:2146664478, client:Tachyon)
```

## 3. System Tuning (Linux)

Your system will need to be tuned in order to run properly. Your validator may not start without the settings below.

#### Optimize sysctl knobs

```sh
sudo bash -c "cat >/etc/sysctl.d/21-tachyon-validator.conf <<EOF
# Increase UDP buffer sizes
net.core.rmem_default = 134217728
net.core.rmem_max = 134217728
net.core.wmem_default = 134217728
net.core.wmem_max = 134217728

# Increase memory mapped files limit
vm.max_map_count = 1000000

# Increase number of allowed open file descriptors
fs.nr_open = 1000000
EOF"
```

```sh
sudo sysctl -p /etc/sysctl.d/21-tachyon-validator.conf
```

#### **Increase systemd and session file limits**

Add

```sh
LimitNOFILE=1000000
```

to the `[Service]` section of your systemd service file, if you use one, otherwise add

```sh
DefaultLimitNOFILE=1000000
```

to the `[Manager]` section of `/etc/systemd/system.conf, using`

```
nano /etc/systemd/system.conf
```

#### Execute configuration

```
sudo systemctl daemon-reload
```

```
sudo bash -c "cat >/etc/security/limits.d/90-tachyon-nofiles.conf <<EOF
# Increase process file descriptor count limit
* - nofile 1000000
EOF"
```

Close all open sessions (log out then, in again)

## 4. Set to X1 Testnet network

```sh
solana config set -u https://rpc.mainnet.x1.xyz
```

To verify set network, use:

```sh
solana config get
```

## 5. Create keypairs

Using command **solana-keygen** to generate a new wallet. It will generate a 12-word seed (aka. mnemonic, or recovery) phrase. Save it safe.

```sh
solana-keygen new --no-passphrase -o ~/.config/solana/id.json
solana-keygen new --no-passphrase -o ~/.config/solana/identity.json
solana-keygen new --no-passphrase -o ~/.config/solana/vote.json
solana-keygen new --no-passphrase -o ~/.config/solana/stake.json
```

<figure><img src="/files/EqoRLQl6jpraJOvRjC7z" alt=""><figcaption><p>4 created keypairs are needed to run a validator. id can be used at withdrawer.</p></figcaption></figure>

To switch between keypairs:

```sh
solana config set -k id.json
```

## 6. Fund wallet

Make sure you have XNT in your wallet before you continue.

Check balance:

```sh
solana balance
```

## 7. Create a validator startup script & start node

In your ubuntu home directory (e.g. `/home/ubuntu/`), create a folder called `bin`. Inside that folder create a file called `validator.sh` and make it executable:

```sh
mkdir -p $HOME/bin
touch $HOME/bin/validator.sh
```

Next, open the `validator.sh` file for editing:

```sh
nano $HOME/bin/validator.sh
```

Copy and paste the following contents into `validator.sh` then save the file:

```sh
#!/bin/bash
export RUST_LOG=solana_metrics=warn,info
exec tachyon-validator \
  --identity $HOME/.config/solana/identity.json \
  --vote-account $HOME/.config/solana/vote.json \
  --entrypoint entrypoint0.mainnet.x1.xyz:8001 \
  --entrypoint entrypoint1.mainnet.x1.xyz:8001 \
  --entrypoint entrypoint2.mainnet.x1.xyz:8001 \
  --entrypoint entrypoint3.mainnet.x1.xyz:8001 \
  --entrypoint entrypoint4.mainnet.x1.xyz:8001 \
  --known-validator 2skZy1HiefFby6a8raendfWGKGRmpcDiwvuPj1v7atch \
  --known-validator 9zkHekQ7TS1JddcGMgMsZYDUc3xvGzUnXCAfKERvuwUR \
  --known-validator ErccS37ii8NbPjsDdGso93vGj7rkF8WhuCV7GhoWmqsS \
  --known-validator 8MUdMKKnod3zD1errE1jjeswLtuZ7jNiTvN2EC5cqbCG \
  --known-validator 3ka4FFFTm3YgTJ17598ApHuzxELd7PcHnHQsY8uqbDsu \
  --known-validator wwcXJz47MTnZacxJ4WSxbhtKuiZvHVqDrBbNCCpjVp1 \
  --only-known-rpc \
  --log $HOME/validator.log \
  --ledger $HOME/ledger \
  --rpc-port 8899 \
  --full-rpc-api \
  --dynamic-port-range 8000-8020 \
  --wal-recovery-mode skip_any_corrupted_record \
  --limit-ledger-size 50000000 \
  --enable-rpc-transaction-history \
  --enable-extended-tx-metadata-storage \
  --rpc-pubsub-enable-block-subscription \
  --full-snapshot-interval-slots 5000 \
  --maximum-incremental-snapshots-to-retain 10 \
  --maximum-full-snapshots-to-retain 50
```

Make validator startup script executable:

```sh
chmod +x $HOME/bin/validator.sh
```

Make sure you're in the home directory:

```sh
cd $HOME
```

Start validator with nohup:

```sh
nohup $HOME/bin/validator.sh &
```

Check validator logs to see if it's running:

```sh
tail -f $HOME/validator.log
```

Check catch up status:

```
solana catchup --our-localhost
```

Use monitor command to check validator operations:

```sh
tachyon-validator --ledger ./ledger monitor
```

See all nodes connected to network, whether they are staked or not. Your identity.json should show up there.

```sh
solana gossip
```

Check validator process:

```sh
ps aux | grep validator
```

Kill validator process:

```sh
tachyon-validator exit -f
```
