# Sonic

{% hint style="info" %}
Pensada para que puedas partir desde un servidor limpio (Ubuntu 22.04 LTS o similar) y terminar firmando bloques sin sustos.
{% endhint %}

## Requisitos de hardware y red

| Recurso     | Mínimo recomendado                             |
| ----------- | ---------------------------------------------- |
| CPU         | 4 vCPU                                         |
| RAM         | 32 GB                                          |
| Disco       | 1 TB NVMe/SSD local                            |
| Banda ancha | ≥ 1 Gbps simétrico y redundante                |
| Puertos     | 5050 TCP + UDP (o el que redefinas con --port) |

{% hint style="info" %}
Tip: evita volúmenes en red (EBS, etc.). La latencia penaliza el consenso.
{% endhint %}

## Preparación básica del servidor

\
\# Crear un usuario sin privilegios.

```
sudo adduser --disabled-password sonic
sudo usermod -aG sudo sonic
```

Actualiza sistema, fija zona horaria, habilita UFW y abre solo el puerto 5050.

##

## Instalar herramientas de compilación y Go ≥ 1.22

```
sudo apt-get update && sudo apt-get install -y build-essential git
wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -xzf go1.23.4.linux-amd64.tar.gz -C /usr/local
echo 'export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' | sudo tee /etc/profile.d/golang.sh
source /etc/profile.d/golang.sh
```

## Compilar el cliente sonicd

```
git clone https://github.com/0xsoniclabs/Sonic.git
cd Sonic
git fetch --tags && git checkout -b v2.0.1 tags/v2.0.1   # Sustituye por la última versión estable
make all
sudo mv build/sonic* /usr/local/bin/
sonicd version      # Comprueba la build
```

## Cargar el genesis y preparar la base de datos

```
mkdir -p ~/.sonic && cd ~/.sonic
wget https://genesis.soniclabs.com/sonic-mainnet/genesis/sonic.g
GOMEMLIMIT=54GiB sonictool --datadir ~/.sonic --cache 12000 genesis \
           --mode validator sonic.g
```

{% hint style="success" %}
Esto deja tu base en el state root correcto y lista para sincronizar
{% endhint %}

## Sincronizar hasta la “cabeza” de la cadena

```
GOMEMLIMIT=54GiB sonicd --datadir ~/.sonic --cache 12000 --mode validator
```

Espera a que la diferencia de bloques (“age”) sea de solo unos segundos.

## Crear la wallet del validador

```
sonictool --datadir ~/.sonic account new
```

Transfiere ≥ 500 000 S (self-stake mínimo) a la dirección generada.

## Generar la clave de firma de consenso

```
sonictool --datadir ~/.sonic validator new
```

Guarda la clave y su contraseña fuera del nodo (USB, HSM, etc.)

## Registrar el validador on-chain

1. Abre SonicScan y el contrato SFC\
   `(0xFC00FACE00000000000000000000000000000000).`\ <br>
2. Ejecuta createValidator indicando:\ <br>
3. public key\*, validator name, y la cantidad a stakear (≥ 500 000 S).\ <br>

Espera la confirmación y apunta tu validatorID.

## Arrancar el nodo en modo validador

```
pkill sonicd                 # Detén la instancia de sincronización
GOMEMLIMIT=50GiB sonicd \
  --datadir ~/.sonic --cache 12000 --mode validator \
  --validator.id <ID> \
  --validator.pubkey <PUBKEY> \
  --validator.password <ruta/password.txt>

```

{% hint style="success" %}
Desde este momento tu nodo participa en consenso y comienza a recibir recompensas (\~6 % APR).
{% endhint %}

## Hacerlo “a prueba de reinicios” con systemd

Crea `/etc/systemd/system/sonicd.service`:

```
[Unit]
Description=Sonic Validator Node
After=network-online.target

[Service]
User=sonic
LimitNOFILE=4096
ExecStart=/usr/local/bin/sonicd --datadir /home/sonic/.sonic --cache 12000 \
          --mode validator --validator.id <ID> --validator.pubkey <PUBKEY> \
          --validator.password /home/sonic/.sonic/password.txt
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

```

```
sudo systemctl daemon-reload
sudo systemctl enable --now sonicd
```

La línea LimitNOFILE=4096 evita el típico error de “too many open files”.

## Publicar tu identidad (nombre y logo)

Sube un JSON accesible por HTTPS con este formato:

```
{
  "name": "MiValidador",
  "logoUrl": "https://miweb.com/logo.png",
  "website": "https://miweb.com",
  "contact": "mailto:admin@miweb.com"
}
```

Después, llama a updateInfo en el contrato STI para enlazarlo

## Seguridad: arquitectura de sentry nodes

* ¿Por qué? Aislas tu validador de ataques DDoS.\ <br>
* Cómo: Despliega 2-3 nodos “sentry” en la nube, con IP pública.\ <br>

1. En config.toml del validador pon pex=false y lista los persistent\_peers con los nodeIDs de tus sentries.\ <br>
2. En los sentry deja pex=true, añade el validador en persistent\_peers y su nodeID en private\_peer\_ids para que no se filtre. ([forum.cosmos.network](https://forum.cosmos.network/t/sentry-node-architecture-overview/454))\ <br>

* Mantén las conexiones entre validador ↔ sentry en red privada/VPN.\ <br>

## Monitorización y alertas

Aunque sonicd aún no expone un endpoint Prometheus oficial, la práctica habitual es:

* Node Exporter + Prometheus + Grafana para recursos del servidor.\ <br>
* Logs de journalctl -u sonicd con alertas de inactividad (> 5 min).\ <br>
* Verifica tu voting power y slashing en SonicScan o scripts RPC.<br>

## Actualizaciones y copias de seguridad

1. Backups:\
   \
   \~/.sonic/keystore/\* y la carpeta validator (claves de firma).\ <br>
2. Upgrade de versión:\
   \
   git pull && git fetch --tags && git checkout vX.Y.Z && make all\ <br>

* Para cambios de protocolo, sigue las notas de la release.\ <br>

3. Snapshots: guarda una instantánea comprimida de la DB para restauraciones rápidas (útil al crear nuevos sentries).

## Solución de problemas frecuentes

| Síntoma                | Causa típica       | Solución                                                                                                                  |
| ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| too many open files    | Límite ulimit bajo | Aumenta LimitNOFILE en systemd a 4096+ ([hub.cosmos.network](https://hub.cosmos.network/main/validators/validator-setup)) |
| age de bloques no baja | Puertos/firewall   | Revisa que 5050 TCP/UDP esté abierto y sin filtrado                                                                       |
| Saliste del active set | Caída prolongada   | Levanta el nodo, espera sync y verifica auto-unjail                                                                       |
