Saltar al contenido principal

Configuración Avanzada de Nodos Validador

La configuración de un nodo validador en KodeChain va más allá de la instalación básica. Esta guía revela cómo el código en main.go y los módulos de configuración transforman un servidor común en un participante crítico de la red blockchain.

Arquitectura del Nodo

El Punto de Entrada: main.go

Cuando ejecutas ./kodechain-node-validator, el código en main.go inicia una secuencia compleja:

func main() {
// Crear nueva instancia de aplicación
application := app.NewApplication()

// Inicializar aplicación (parse flags, crear config)
if err := application.Initialize(); err != nil {
fmt.Printf("❌ Error initializing application: %v\n", err)
os.Exit(1)
}

// Ejecutar la aplicación
if err := application.Run(); err != nil {
fmt.Printf("❌ Error running application: %v\n", err)
os.Exit(1)
}
}

Esta función simple oculta una inicialización compleja que incluye:

  • Parsing de argumentos de línea de comandos
  • Carga de configuración desde archivos
  • Inicialización de módulos (blockchain, P2P, consenso)
  • Configuración de logging y monitoreo

Módulos Core del Nodo

1. Blockchain Engine

El módulo blockchain se inicializa con el estado génesis y configura:

blockchainInstance := blockchain.NewBlockchain(genesisFile, dataDir)
blockchainInstance.SetVMIntegration(vmIntegration)
blockchainInstance.SetP2PManager(p2pManager)

2. Sistema de Consenso

Dependiendo del tipo de consenso, se inicializa DPoS o PBFT:

if consensusType == "DPOS" {
dpos := consensus.NewDPoS(stakingContract)
dpos.SetBlockchainInstance(blockchainInstance)
dpos.SetPassiveDelegationManager(passiveDelegationManager)
consensusEngine = dpos
} else {
pbft := consensus.NewPBFT(nodeID, validatorAddresses)
consensusEngine = pbft
}

3. Red P2P con Hole Punching

La red peer-to-peer se configura con capacidades avanzadas de NAT traversal:

p2pManager := p2p.NewP2PManager(nodeID, privateKey)
p2pManager.SetHolePunchingManager(holePunchingManager)
p2pManager.SetUPnPManager(upnpManager)

4. API REST y WebSocket

El servidor HTTP expone endpoints para interacción:

apiServer := api.NewServer(blockchainInstance, consensusEngine, p2pManager)
apiServer.Start(port)

Configuración de Red

Puertos y Conectividad

Un nodo validador utiliza múltiples puertos para diferentes funciones:

PuertoProtocoloFunciónImportancia
8080HTTPAPI RESTCrítico para operaciones
30303TCPP2P ConnectionsEsencial para consenso
30303UDPDiscoveryNecesario para encontrar peers
9090HTTPMétricas PrometheusImportante para monitoreo

Configuración de Firewall

Para máxima seguridad y funcionalidad:

# Ubuntu/Debian
sudo ufw allow 8080/tcp
sudo ufw allow 30303/tcp
sudo ufw allow 30303/udp
sudo ufw allow 9090/tcp

# Verificar configuración
sudo ufw status

UPnP y NAT Traversal

El sistema automáticamente configura port forwarding:

upnpManager := p2p.NewUPnPManager()
if err := upnpManager.DiscoverGateway(); err == nil {
upnpManager.AddPortMapping(30303, "TCP", "KodeChain P2P")
upnpManager.AddPortMapping(30303, "UDP", "KodeChain Discovery")
}

Configuración de Almacenamiento

Estructura de Directorios

~/.kodechain/
├── data/
│ ├── blockchain.db # Base de datos LevelDB
│ ├── blocks/ # Archivos de bloques
│ └── state/ # Estado de contratos
├── keystore/ # Claves privadas encriptadas
├── logs/ # Archivos de log
└── config.json # Configuración del nodo

Optimización de LevelDB

{
"leveldb": {
"cache_size": 1024,
"write_buffer_size": 64,
"max_open_files": 1000,
"compression": "snappy"
}
}

Configuración de Consenso

Nodo DPoS

{
"consensus": {
"type": "dpos",
"round_length": 21,
"block_time": 3,
"delegates": 21
}
}

Nodo PBFT

{
"consensus": {
"type": "pbft",
"view_change_timeout": 10000,
"max_faulty_nodes": 1,
"request_timeout": 5000
}
}

Monitoreo y Logging

Sistema de Logging Estructurado

logger := utils.NewLogger()
logger.SetLevel("info")
logger.SetOutputFile("~/.kodechain/logs/node.log")

// Logging contextual
logger.WithFields(map[string]interface{}{
"node_id": nodeID,
"height": blockchain.Height(),
}).Info("Block created")

Métricas Prometheus

metrics := monitoring.NewMetricsCollector()
metrics.RegisterGauge("blockchain_height", blockchain.Height)
metrics.RegisterCounter("transactions_processed", txCount)
metrics.RegisterHistogram("block_time", blockTimeDistribution)

Seguridad del Nodo

Gestión de Claves

# Crear directorio seguro para keystore
mkdir -p ~/.kodechain/keystore
chmod 700 ~/.kodechain/keystore

# Verificar permisos
ls -la ~/.kodechain/keystore/

Configuración SSL/TLS (Opcional)

{
"api": {
"ssl": {
"enabled": true,
"cert_file": "/path/to/cert.pem",
"key_file": "/path/to/key.pem"
}
}
}

Optimización de Performance

Configuración de Go

export GOGC=50          # GC más frecuente
export GOMAXPROCS=4 # Usar 4 cores
export GODEBUG=gctrace=1 # Tracing de GC

Límites del Sistema

# Aumentar límites para producción
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf

# Aplicar cambios
sysctl -p

Backup y Recuperación

Estrategia de Backup

#!/bin/bash
# Script de backup diario

BACKUP_DIR="/var/backups/kodechain"
DATE=$(date +%Y%m%d)

# Crear backup
tar -czf $BACKUP_DIR/node_$DATE.tar.gz ~/.kodechain/

# Mantener solo últimos 7 días
find $BACKUP_DIR -name "node_*.tar.gz" -mtime +7 -delete

Recuperación de Nodo

# Detener nodo
docker stop kodechain-validator

# Restaurar desde backup
tar -xzf /var/backups/kodechain/node_20241101.tar.gz -C /

# Reiniciar nodo
docker start kodechain-validator

Monitoreo Continuo

Health Checks

#!/bin/bash
# Health check script

# Verificar API
if curl -f http://localhost:8080/api/health > /dev/null; then
echo "✅ API healthy"
else
echo "❌ API unhealthy"
exit 1
fi

# Verificar sincronización
HEIGHT=$(curl -s http://localhost:8080/api/blockchain/height)
if [ "$HEIGHT" -gt 0 ]; then
echo "✅ Blockchain synced (height: $HEIGHT)"
else
echo "❌ Blockchain not synced"
exit 1
fi

# Verificar peers
PEERS=$(curl -s http://localhost:8080/api/p2p/peers | jq length)
if [ "$PEERS" -gt 0 ]; then
echo "✅ Connected to $PEERS peers"
else
echo "❌ No peers connected"
exit 1
fi

Alertas Automáticas

# Configurar alertas por email
MAILTO=admin@yourdomain.com

# En crontab
*/5 * * * * /path/to/health-check.sh

Escalabilidad y Clustering

Configuración Multi-Nodo

{
"cluster": {
"enabled": true,
"nodes": [
{"id": "validator-1", "host": "10.0.0.1", "port": 8080},
{"id": "validator-2", "host": "10.0.0.2", "port": 8080}
],
"load_balancer": "nginx"
}
}

Balanceo de Carga

upstream kodechain_nodes {
server validator-1:8080;
server validator-2:8080;
}

server {
listen 80;
location / {
proxy_pass http://kodechain_nodes;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}

Troubleshooting Avanzado

Diagnóstico de Problemas de Red

# Verificar conectividad P2P
netstat -tlnp | grep 30303

# Verificar tabla de enrutamiento
curl http://localhost:8080/api/p2p/routing-table

# Test de latencia con peers
curl http://localhost:8080/api/p2p/ping

Análisis de Performance

# Perfilado de CPU
go tool pprof http://localhost:8080/debug/pprof/profile

# Análisis de memoria
go tool pprof http://localhost:8080/debug/pprof/heap

# Métricas detalladas
curl http://localhost:9090/metrics

Esta configuración avanzada transforma un nodo básico en un participante robusto y confiable de la red KodeChain, capaz de manejar alta carga mientras mantiene seguridad y estabilidad.