# 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                                                                       |


---

# 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.ethernodes.io/guias-y-otros/deplega-tu-nodo/sonic.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.
