# 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 7ufaUVtQKzGu5tpFtii9Cg8kR4jcpjQSXwsF3oVPSMZA \
  --known-validator 5Rzytnub9yGTFHqSmauFLsAbdXFbehMwPBLiuEgKajUN \
  --known-validator 4V2QkkWce8bwTzvvwPiNRNQ4W433ZsGQi9aWU12Q8uBF \
  --known-validator CkMwg4TM6jaSC5rJALQjvLc51XFY5pJ1H9f1Tmu5Qdxs \
  --known-validator 7J5wJaH55ZYjCCmCMt7Gb3QL6FGFmjz5U8b6NcbzfoTy \
  --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
```


---

# 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://docs.x1.xyz/validating/create-a-read-only-node.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.
