# Configuración de un nodo

## Descargar archivos necesarios

Necesitamos como mínimo 5 archivos que son indispensables para poder correr un nodo de Cardano. Estos son:

* config.json
* byron-genesis.json
* shelley-genesis.json
* alonzo-genesis.json
* topology.son

Podemos bajar las ultimas versiones desde:\
<https://hydra.iohk.io/job/Cardano/cardano-node/cardano-deployment/latest-finished/download/1/index.html>

Debemos asegurarnos de bajar las versiones de mainnet o testnet según corresponda.

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

```
mkdir ~/cardano-node/relay
cd ~/cardano-node/relay
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-config.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-byron-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-shelley-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-alonzo-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-topology.json

mv mainnet-byron-genesis.json byron-genesis.json
mv mainnet-shelley-genesis.json shelley-genesis.json
mv mainnet-alonzo-genesis.json alonzo-genesis.json
mv mainnet-config.json config.json
mv mainnet-topology.json topology.json
```

{% endtab %}

{% tab title="BLOCK" %}

```
mkdir ~/cardano-node/block
cd ~/cardano-node/block
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-config.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-byron-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-shelley-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-alonzo-genesis.json
wget https://hydra.iohk.io/build/7654130/download/1/mainnet-topology.json

mv mainnet-byron-genesis.json byron-genesis.json
mv mainnet-shelley-genesis.json shelley-genesis.json
mv mainnet-alonzo-genesis.json alonzo-genesis.json
mv mainnet-config.json config.json
mv mainnet-topology.json topology.json
```

{% endtab %}
{% endtabs %}

## config.json

El siguiente paso es modificar nuestro archivo `config.json` para darle las rutas a los archivos genesis de Shelley y Byron, configurar logging y métricas. Deberemos modificar los valores de los siguientes parámetros:

{% tabs %}
{% tab title="P2P" %}
{% code title="\~/cardano-node/relay/config.json" %}

```
{
  "AlonzoGenesisFile": "alonzo-genesis.json",
  "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874",
  "ApplicationName": "cardano-sl",
  "ApplicationVersion": 1,
  "ByronGenesisFile": "byron-genesis.json",
  "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
  "ConwayGenesisFile": "conway-genesis.json",
  "ConwayGenesisHash": "f28f1c1280ea0d32f8cd3143e268650d6c1a8e221522ce4a7d20d62fc09783e1",
  "LastKnownBlockVersion-Alt": 0,
  "LastKnownBlockVersion-Major": 3,
  "LastKnownBlockVersion-Minor": 0,
  "MaxKnownMajorProtocolVersion": 2,
  "Protocol": "Cardano",
  "RequiresNetworkMagic": "RequiresNoMagic",
  "ShelleyGenesisFile": "shelley-genesis.json",
  "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81",
  "TraceAcceptPolicy": true,
  "TraceBlockFetchClient": false,
  "TraceBlockFetchDecisions": true,
  "TraceBlockFetchProtocol": false,
  "TraceBlockFetchProtocolSerialised": false,
  "TraceBlockFetchServer": false,
  "TraceChainDb": true,
  "TraceChainSyncBlockServer": false,
  "TraceChainSyncClient": false,
  "TraceChainSyncHeaderServer": false,
  "TraceChainSyncProtocol": false,
  "TraceConnectionManager": true,
  "TraceDNSResolver": true,
  "TraceDNSSubscription": true,
  "TraceDiffusionInitialization": true,
  "TraceErrorPolicy": true,
  "TraceForge": true,
  "TraceHandshake": false,
  "TraceInboundGovernor": true,
  "TraceIpSubscription": true,
  "TraceLedgerPeers": true,
  "TraceLocalChainSyncProtocol": false,
  "TraceLocalErrorPolicy": true,
  "TraceLocalHandshake": false,
  "TraceLocalRootPeers": true,
  "TraceLocalTxSubmissionProtocol": false,
  "TraceLocalTxSubmissionServer": false,
  "TraceMempool": false,
  "TraceMux": false,
  "TracePeerSelection": true,
  "TracePeerSelectionActions": true,
  "TracePublicRootPeers": true,
  "TraceServer": true,
  "TraceTxInbound": false,
  "TraceTxOutbound": false,
  "TraceTxSubmissionProtocol": false,
  "TracingVerbosity": "NormalVerbosity",
  "TurnOnLogMetrics": true,
  "TurnOnLogging": true,
  "MempoolCapacityBytesOverride": 1024000,
  "EnableP2P": true,
  "TargetNumberOfActivePeers": 20,
  "TargetNumberOfEstablishedPeers": 50,
  "TargetNumberOfKnownPeers": 100,
  "TargetNumberOfRootPeers": 100,
  "ExperimentalProtocolsEnabled": true,
  "MaxConcurrencyDeadline": 4,
  "defaultBackends": [
    "KatipBK"
  ],
  "defaultScribes": [
    [
      "FileSK",
      "logs/node.json"
    ]
  ],
  "hasEKG": 12789,
  "hasPrometheus": [
    "0.0.0.0",
    12798
  ],
  "minSeverity": "Info",
  "options": {
    "mapBackends": {
      "cardano.node.metrics": [
        "EKGViewBK"
      ],
      "cardano.node.resources": [
        "EKGViewBK"
      ]
    },
    "mapSubtrace": {
      "cardano.node.metrics": {
        "subtrace": "Neutral"
      }
    }
  },
  "rotation": {
    "rpKeepFilesNum": 10,
    "rpLogLimitBytes": 20000000,
    "rpMaxAgeHours": 24
  },
  "setupBackends": [
    "KatipBK"
  ],
  "setupScribes": [
    {
      "scFormat": "ScJson",
      "scKind": "FileSK",
      "scName": "logs/node.json",
      "scRotation": null
    }
  ]
}
```

{% endcode %}
{% endtab %}

{% tab title="BLOCK" %}
{% code title="\~/cardano-node/block/config.json" %}

```
{
  "AlonzoGenesisFile": "alonzo-genesis.json",
  "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874",
  "ApplicationName": "cardano-sl",
  "ApplicationVersion": 1,
  "ByronGenesisFile": "byron-genesis.json",
  "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb",
  "ConwayGenesisFile": "conway-genesis.json",
  "ConwayGenesisHash": "f28f1c1280ea0d32f8cd3143e268650d6c1a8e221522ce4a7d20d62fc09783e1",
  "LastKnownBlockVersion-Alt": 0,
  "LastKnownBlockVersion-Major": 3,
  "LastKnownBlockVersion-Minor": 0,
  "MaxKnownMajorProtocolVersion": 2,
  "Protocol": "Cardano",
  "RequiresNetworkMagic": "RequiresNoMagic",
  "ShelleyGenesisFile": "shelley-genesis.json",
  "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81",
  "TraceAcceptPolicy": true,
  "TraceBlockFetchClient": false,
  "TraceBlockFetchDecisions": true,
  "TraceBlockFetchProtocol": false,
  "TraceBlockFetchProtocolSerialised": false,
  "TraceBlockFetchServer": false,
  "TraceChainDb": true,
  "TraceChainSyncBlockServer": false,
  "TraceChainSyncClient": false,
  "TraceChainSyncHeaderServer": false,
  "TraceChainSyncProtocol": false,
  "TraceConnectionManager": true,
  "TraceDNSResolver": true,
  "TraceDNSSubscription": true,
  "TraceDiffusionInitialization": true,
  "TraceErrorPolicy": true,
  "TraceForge": true,
  "TraceHandshake": false,
  "TraceInboundGovernor": true,
  "TraceIpSubscription": true,
  "TraceLedgerPeers": true,
  "TraceLocalChainSyncProtocol": false,
  "TraceLocalErrorPolicy": true,
  "TraceLocalHandshake": false,
  "TraceLocalRootPeers": true,
  "TraceLocalTxSubmissionProtocol": false,
  "TraceLocalTxSubmissionServer": false,
  "TraceMempool": false,
  "TraceMux": false,
  "TracePeerSelection": true,
  "TracePeerSelectionActions": true,
  "TracePublicRootPeers": true,
  "TraceServer": true,
  "TraceTxInbound": false,
  "TraceTxOutbound": false,
  "TraceTxSubmissionProtocol": false,
  "TracingVerbosity": "NormalVerbosity",
  "TurnOnLogMetrics": true,
  "TurnOnLogging": true,
  "MempoolCapacityBytesOverride": 1024000,
  "EnableP2P": false,
  "TargetNumberOfActivePeers": 20,
  "TargetNumberOfEstablishedPeers": 50,
  "TargetNumberOfKnownPeers": 100,
  "TargetNumberOfRootPeers": 100,
  "ExperimentalProtocolsEnabled": false,
  "MaxConcurrencyDeadline": 4,
  "defaultBackends": [
    "KatipBK"
  ],
  "defaultScribes": [
    [
      "FileSK",
      "logs/node.json"
    ]
  ],
  "hasEKG": 12789,
  "hasPrometheus": [
    "0.0.0.0",
    12798
  ],
  "minSeverity": "Info",
  "options": {
    "mapBackends": {
      "cardano.node.metrics": [
        "EKGViewBK"
      ],
      "cardano.node.resources": [
        "EKGViewBK"
      ]
    },
    "mapSubtrace": {
      "cardano.node.metrics": {
        "subtrace": "Neutral"
      }
    }
  },
  "rotation": {
    "rpKeepFilesNum": 10,
    "rpLogLimitBytes": 20000000,
    "rpMaxAgeHours": 24
  },
  "setupBackends": [
    "KatipBK"
  ],
  "setupScribes": [
    {
      "scFormat": "ScJson",
      "scKind": "FileSK",
      "scName": "logs/node.json",
      "scRotation": null
    }
  ]
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

## topology.json

Aquí definimos los nodos contra los que vamos a establecer conexiones salientes, es importante recordar que para poder propagar tus bloques es necesario tener conexiones entrantes también desde la red. IOHK incluye en su topología a los relays de un pool registrados en la blockchain. Para asegurarte de tener conexiones entrantes contacta otros operadores en los canales de Telegram, el grupo de SPOCRA en Discord o usa el script topologyUpdater.

{% tabs %}
{% tab title="RELAY-STATIC" %}
{% code title="\~/cardano-node/relay/topology.json" %}

```
{
  "Producers": [
    {
      "addr": "ip.de.bp.node",
      "port": 3000,
      "valency": 1
    },
    {
      "addr": "relays-new.cardano-mainnet.iohk.io",
      "port": 3001,
      "valency": 2
    },
    {
      "friendly_name": "TOPO USA1",
      "addr": "relays-us1.topopool.com",
      "port": 3001,
      "valency": 1
    },
    {
      "friendly_name": "TOPO GERMANY1",
      "addr": "relays-de1.topopool.com",
      "port": 3001,
      "valency": 1
    }
  ]
}
```

{% endcode %}
{% endtab %}

{% tab title="RELAY-P2P" %}

{% endtab %}

{% tab title="BLOCK" %}
{% code title="\~/cardano-node/block/topology.json" %}

```
{
  "Producers": [
    {
      "friendly_name": "RELAY1",
      "addr": "ip.de.relay.1",
      "port": 3001,
      "valency": 1
    },
    {
      "friendly_name": "RELAY2",
      "addr": "ip.de.relay.2",
      "port": 3001,
      "valency": 1
    }
  ]
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**IMPORTANTE:** Tu nodo productor de bloques (BP) solamente debe ser accesible desde tus relays, no debe ser accesible desde una IP que no esté bajo tu control y no debes incluir a peers de terceros. Los relays incluyen en sus topology.json a nodos externos pertenecientes a otros operadores y tu BP.
{% endhint %}

## Iniciar el nodo

¡Felicitaciones! Si llegaste hasta aquí ya tienes un nodo completo listo para correr. Si deseas puedes levantar el nodo con el siguiente comando y dejar la base de datos (DB) sincronizando, o puedes preparar tu sistema para correr como servicios, tal como se explica en la [próxima sección](/primeros-pasos/ejecutar-servicio.md).&#x20;

{% hint style="info" %}
Si este es tu primer nodo se recomienda dejes que sincronice completamente antes de continuar con el proceso de [crear tus llaves y certificados](/primeros-pasos/pool-keys-and-certs.md). Prepárate un café por que el sync inicial va a tomar un buen rato :)
{% endhint %}

```
screen -dmS RELAY bash -c 'cardano-node run \
   --topology /home/ubuntu/cardano-node/relay/topology.json \
   --database-path /home/ubuntu/cardano-node/relay/db \
   --socket-path /home/ubuntu/cardano-node/relay/db/socket \
   --port 3001 \
   --config /home/ubuntu/cardano-node/relay/config.json; exec bash'
```

Usamos la aplicación `screen` para poder dejar el nodo corriendo y monitorear el avance. Para desconectar la sesión de screen pero dejarla corriendo en el background puedes usar: \
`Ctrl + a, y luego la tecla "d"`

Para volver a conectarse a la sesión de screen:\
`screen -r RELAY`

Notarás que el nodo esta en línea por que el consumo de CPU baja considerablemente, puedes utilizar el comando `htop` para ver el consumo de recursos.


---

# 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://es-kb.topopool.com/primeros-pasos/configuracion-nodo.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.
