> 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/pool-keys-and-certs.md).

# Keys y certificado del pool

Las claves son el corazón de tu pool. Si las pierdes o las expones, pierdes el control del pool. Tómate este paso con calma.

{% hint style="danger" %}
**Máquina air-gapped obligatoria.** Las cold keys nunca deben tocar una máquina conectada a internet. Genera las cold keys y el contador de operaciones en una máquina completamente offline y mantenlas ahí permanentemente. Solo las sacas para firmar un nuevo certificado operacional, y vuelven offline de inmediato.
{% endhint %}

## Qué claves necesitas

| Clave                            | Dónde vive    | Para qué sirve                        |
| -------------------------------- | ------------- | ------------------------------------- |
| Cold key (node.skey / node.vkey) | Air-gapped    | Firma certificados operacionales      |
| KES key (kes.skey / kes.vkey)    | Nodo caliente | Firma bloques (caduca cada \~62 días) |
| VRF key (vrf.skey / vrf.vkey)    | Nodo caliente | Prueba de elección de slot            |
| Op-cert (node.cert)              | Nodo caliente | Vincula KES con cold key              |
| Counter (cold.counter)           | Air-gapped    | Evita replay attacks en op-certs      |

***

## 1. Generar las cold keys

En la máquina **air-gapped**:

```bash
cardano-cli node key-gen \
  --cold-verification-key-file $HOME/cold-keys/node.vkey \
  --cold-signing-key-file      $HOME/cold-keys/node.skey \
  --operational-certificate-issue-counter-file $HOME/cold-keys/cold.counter
```

Protege los archivos en cuanto los generes:

```bash
chmod 400 $HOME/cold-keys/node.skey
chmod 400 $HOME/cold-keys/cold.counter
```

{% hint style="warning" %}
El archivo `cold.counter` es tan crítico como la propia cold key. Cada vez que emites un op-cert, el contador se incrementa. Si emites un certificado con un contador inferior al actual en la cadena, el nodo queda invalidado. Guárdalo junto a las cold keys, siempre offline.
{% endhint %}

***

## 2. Generar las claves VRF

En la máquina **air-gapped**:

```bash
cardano-cli node key-gen-VRF \
  --verification-key-file $HOME/pool-keys/vrf.vkey \
  --signing-key-file      $HOME/pool-keys/vrf.skey
```

```bash
chmod 400 $HOME/pool-keys/vrf.skey
```

***

## 3. Generar las claves KES

En el **nodo caliente**:

```bash
cardano-cli node key-gen-KES \
  --verification-key-file $HOME/pool-keys/kes.vkey \
  --signing-key-file      $HOME/pool-keys/kes.skey
```

```bash
chmod 400 $HOME/pool-keys/kes.skey
```

Las claves KES caducan por diseño: cada período KES dura un número fijo de slots. Cuando caducan, el nodo deja de forjar bloques hasta que emites un nuevo op-cert.

***

## 4. Calcular el período KES actual

Necesitas saber en qué período KES estás para emitir el certificado correctamente. En el nodo caliente:

```bash
expr $(cardano-cli query tip --mainnet | jq .slot) / $(cat $HOME/cardano/relay/config/shelley-genesis.json | jq .slotsPerKESPeriod)
```

{% hint style="info" %}
El campo correcto es `.slot`, no `.slotNo`. El formato de salida del CLI cambió en versiones recientes y `.slotNo` ya no existe.
{% endhint %}

El resultado es un número entero, por ejemplo `4385`. Ese es el `--kes-period` que usarás en el siguiente paso.

***

## 5. Emitir el certificado operacional

Este paso requiere juntar el `kes.vkey` (del nodo caliente) con el `cold.counter` y `node.skey` (del air-gapped) en el mismo lugar — idealmente el air-gapped con el `kes.vkey` copiado temporalmente.

En la máquina **air-gapped**:

```bash
cardano-cli node issue-op-cert \
  --kes-verification-key-file      $HOME/pool-keys/kes.vkey \
  --cold-signing-key-file          $HOME/cold-keys/node.skey \
  --operational-certificate-issue-counter-file $HOME/cold-keys/cold.counter \
  --kes-period                     <KES_PERIOD_ACTUAL> \
  --out-file                       $HOME/pool-keys/node.cert
```

Sustituye `<KES_PERIOD_ACTUAL>` por el número que calculaste antes.

Después de firmar:

* El `cold.counter` se incrementa automáticamente — no lo toques manualmente.
* Copia el `node.cert` resultante al nodo caliente.
* Las cold keys y el counter vuelven offline de inmediato.

```bash
chmod 400 $HOME/pool-keys/node.cert
```

***

## 6. Configurar el nodo para usar las claves

En el archivo de servicio del BP, referencia las tres claves calientes:

```bash
cardano-node run \
  ...
  --shelley-kes-key          $HOME/pool-keys/kes.skey \
  --shelley-vrf-key          $HOME/pool-keys/vrf.skey \
  --shelley-operational-certificate $HOME/pool-keys/node.cert
```

***

## Cuándo renovar el op-cert

Cardano mainnet tiene `slotsPerKESPeriod = 129600` y `maxKESEvolutions = 62`. Un op-cert dura aproximadamente **62 días**. Cuando el período KES del certificado supera el máximo, el nodo para de forjar.

Puedes verificar cuánto tiempo te queda en cualquier momento:

```bash
cardano-cli query kes-period-info \
  --mainnet \
  --op-cert-file $HOME/pool-keys/node.cert
```

Proceso de renovación:

1. Genera nuevas claves KES en el nodo caliente.
2. Calcula el período KES actual.
3. Lleva el `kes.vkey` al air-gapped.
4. Emite nuevo op-cert con `node issue-op-cert`.
5. Copia el nuevo `node.cert` al nodo caliente y reinicia el nodo.

{% hint style="warning" %}
Nunca reutilices un par de claves KES para emitir un segundo op-cert. Genera claves KES nuevas cada vez que renuevas el certificado.
{% endhint %}

***

## Resumen de permisos

```bash
chmod 400 $HOME/cold-keys/node.skey
chmod 400 $HOME/cold-keys/cold.counter
chmod 400 $HOME/pool-keys/vrf.skey
chmod 400 $HOME/pool-keys/kes.skey
chmod 400 $HOME/pool-keys/node.cert
```

Los `.skey` y el counter son siempre 400, sin excepciones.
