# 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 install -y git libssl-dev libudev-dev pkg-config zlib1g-dev llvm clang cmake make libprotobuf-dev protobuf-compiler
```

## 2. Install Tachyon v2.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
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)
tachyon-validator 2.0.21 (src:00000000; feat:2908148756, 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="https://1886332998-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fis100gr6YdQFA0E9ARbX%2Fuploads%2FonqmgqkNtGaoogOCLiRw%2Fid-1.png?alt=media&#x26;token=0e0d39f6-6690-4072-8cee-a3ce5d93d34b" 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
```
