> For the complete documentation index, see [llms.txt](https://es-kb.topopool.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://es-kb.topopool.com/primeros-pasos/configuracion-nodo.md).

# Configuración de un nodo

Vamos a preparar los archivos de configuración que necesita cada nodo para arrancar y conectarse a la red principal de Cardano. Tenemos dos tipos de nodo: el **relay** (expuesto a internet) y el **block producer** (aislado, solo habla con tus relays).

***

## Estructura de directorios

Antes de descargar nada, creamos la estructura base:

```bash
mkdir -p $HOME/cardano/relay/config
mkdir -p $HOME/cardano/bp/config
mkdir -p $HOME/cardano/relay/db
mkdir -p $HOME/cardano/bp/db
```

{% hint style="info" %}
Usamos `$HOME` para evitar rutas hardcodeadas. Si prefieres una ubicación distinta (por ejemplo `/opt/cardano`), simplemente reemplaza `$HOME/cardano` en todos los comandos.
{% endhint %}

***

## Descargar los archivos de configuración

Los archivos oficiales de mainnet están en:

**`https://book.world.dev.cardano.org/environments/mainnet/`**

Descargamos cada archivo explícitamente:

```bash
cd $HOME/cardano/relay/config

wget https://book.world.dev.cardano.org/environments/mainnet/config.json
wget https://book.world.dev.cardano.org/environments/mainnet/byron-genesis.json
wget https://book.world.dev.cardano.org/environments/mainnet/shelley-genesis.json
wget https://book.world.dev.cardano.org/environments/mainnet/alonzo-genesis.json
wget https://book.world.dev.cardano.org/environments/mainnet/conway-genesis.json
wget https://book.world.dev.cardano.org/environments/mainnet/topology.json
```

{% hint style="warning" %}
Necesitamos los seis archivos. Desde el hard fork Chang, `conway-genesis.json` es obligatorio — el nodo no arranca sin él.
{% endhint %}

Luego copiamos los mismos archivos de génesis al BP (la topología será diferente):

```bash
cp $HOME/cardano/relay/config/*.json $HOME/cardano/bp/config/
```

***

## Archivos de génesis

No necesitamos modificar estos archivos. Son parámetros de red firmados y el nodo los verifica al arrancar:

| Archivo                | Qué contiene                                              |
| ---------------------- | --------------------------------------------------------- |
| `byron-genesis.json`   | Parámetros de la era Byron                                |
| `shelley-genesis.json` | Parámetros de Shelley (epoch length, slot duration, etc.) |
| `alonzo-genesis.json`  | Parámetros de smart contracts (Plutus)                    |
| `conway-genesis.json`  | Parámetros de gobernanza (Chang/Conway era)               |

***

## config.json — qué necesitamos cambiar

El archivo descargado tiene más de 100 campos. No lo reemplazamos entero — abrimos el que descargamos y tocamos los campos que nos interesan:

```bash
nano $HOME/cardano/relay/config/config.json
```

### Campos clave a revisar y ajustar

**P2P habilitado (obligatorio):**

```json
"EnableP2P": true
```

**Puerto de Prometheus** (métricas para Grafana):

```json
"hasPrometheus": ["127.0.0.1", 12798]
```

**Puerto EKG** (panel interno, útil para debug):

```json
"hasEKG": 12789
```

**Nivel mínimo de logs** — `Info` es suficiente en producción:

```json
"minSeverity": "Info"
```

**Rotación de logs:**

```json
"rotation": {
  "rpLogLimitBytes": 5000000,
  "rpMaxAgeHours": 24,
  "rpKeepFilesNum": 10
}
```

{% hint style="info" %}
Para el BP, podemos usar el mismo `config.json` del relay. La diferencia real está en la topología, no en la configuración del nodo.
{% endhint %}

***

## Topología

Aquí es donde relay y BP tienen configuraciones completamente distintas.

### Relay — P2P (formato actual)

El formato antiguo con `"Producers"` es legacy. Con P2P activo en mainnet, necesitamos el formato con `localRoots`, `publicRoots` y `bootstrapPeers`.

```bash
nano $HOME/cardano/relay/config/topology.json
```

{% tabs %}
{% tab title="RELAY — P2P" %}

```json
{
  "bootstrapPeers": [
    {"address": "backbone.cardano.iog.io", "port": 3501},
    {"address": "backbone.mainnet.emurgornd.com", "port": 3717}
  ],
  "localRoots": [
    {
      "accessPoints": [
        {"address": "IP-DE-TU-BP", "port": 3000}
      ],
      "advertise": false,
      "valency": 1
    }
  ],
  "publicRoots": [
    {
      "accessPoints": [
        {"address": "backbone.cardano.iog.io", "port": 3501}
      ],
      "advertise": false
    }
  ],
  "useLedgerAfterSlot": 128908821
}
```

{% endtab %}
{% endtabs %}

**Qué significa cada sección:**

* **`bootstrapPeers`** — peers confiables para el arranque inicial, antes de tener el ledger sincronizado.
* **`localRoots`** — peers que siempre queremos mantener conectados (nuestro BP). `advertise: false` significa que no anunciamos esta dirección a la red.
* **`publicRoots`** — peers públicos para descubrimiento.
* **`useLedgerAfterSlot`** — a partir de este slot, el nodo usa el ledger para descubrir peers. Dejamos el valor por defecto.

Reemplaza `IP-DE-TU-BP` con la IP privada de tu block producer.

{% hint style="warning" %}
Si tienes varios relays, añade cada uno en `localRoots` del otro relay con `advertise: true` para que tu pool sea descubrible en la red.
{% endhint %}

***

### Block Producer — topología simple

El BP solo necesita conectarse a sus propios relays. Sin peers públicos, sin bootstrapPeers:

{% tabs %}
{% tab title="BP — Topología" %}

```json
{
  "localRoots": [
    {
      "accessPoints": [
        {"address": "IP-DE-TU-RELAY-1", "port": 3000}
      ],
      "advertise": false,
      "valency": 1
    }
  ],
  "publicRoots": [],
  "useLedgerAfterSlot": -1
}
```

{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**El BP no debe tener conexión directa a internet ni a peers públicos.** Solo debe hablar con tus propios relays. Si tu BP es accesible desde fuera, estás exponiendo las claves operacionales.
{% endhint %}

***

## Sincronización inicial — usa Mithril

Sincronizar el nodo desde cero puede llevar varios días. En lugar de esperar, vamos a usar Mithril para descargar un snapshot verificado criptográficamente.

{% content-ref url="/pages/o0aYviFsObEfLdvShtxp" %}
[Bootstrap con Mithril](/primeros-pasos/mithril.md)
{% endcontent-ref %}

{% hint style="info" %}
Mithril es el método recomendado para la sincronización inicial. Reduce el tiempo de espera de días a menos de una hora.
{% endhint %}

***

## Verificar los archivos

Antes de continuar, confirmamos que tenemos todo lo necesario:

```bash
ls $HOME/cardano/relay/config/
# config.json  byron-genesis.json  shelley-genesis.json
# alonzo-genesis.json  conway-genesis.json  topology.json

ls $HOME/cardano/bp/config/
# config.json  byron-genesis.json  shelley-genesis.json
# alonzo-genesis.json  conway-genesis.json  topology.json
```

Con los archivos en su lugar, el siguiente paso es configurar los servicios de systemd.
