Mostrando entradas con la etiqueta BLOCKCHAIN LYRA CHAIN. Mostrar todas las entradas
Mostrando entradas con la etiqueta BLOCKCHAIN LYRA CHAIN. Mostrar todas las entradas

martes, 15 de septiembre de 2026

**INFORME SECRETO DE INTELIGENCIA ESTRATÉGICA** - ARQUITECTURA DE CONTROL DIGITAL DEL ESPACIO - INTELIGENCIA LIBRE

 INFORME DE INTELIGENCIA ESTRATEGICA

 


 

 **INFORME SECRETO DE INTELIGENCIA ESTRATÉGICA**

**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-INTEL-ESP-2026-09-16
**Para:** Dirección de PASAIA LAB, INTELIGENCIA LIBRE, ACCIÓN CIVIL DIGITAL
**Asunto:** Plan de Digitalización y Control del Espacio Ultraterrestre hasta 100.000 km mediante una Arquitectura de Tres Capas Esféricas con Redes de Nodos IA y Blockchain

---

### 📜 1. El Vacío Legal como Fundamento Estratégico

La arquitectura de control aquí propuesta se sustenta en la laguna jurídica del **Tratado del Espacio Ultraterrestre de 1967**. Este tratado prohíbe la colocación en órbita de armas nucleares y de destrucción masiva, pero **no prohíbe explícitamente el despliegue de armas convencionales** ni establece restricciones sobre sistemas de vigilancia, redes de nodos inteligentes o capacidades de ciberguerra orbital. La confirmación oficial por parte del Secretario de la Fuerza Aérea de EE.UU. el **14 de septiembre de 2026**, admitiendo la posesión de "armas de control del espacio orbital" en órbita, valida la viabilidad operativa de este tipo de arquitecturas.

---

### 🪐 2. Arquitectura de Tres Capas Esféricas: Definición y Alcance

La propuesta consiste en la creación de un **ámbito esférico de dominio y control** dividido en tres capas concéntricas, cada una con su propia red de nodos inteligentes, intranet dedicada y blockchain de control, interconectadas entre sí. El radio total del sistema alcanza los **100.000 km**, superando la órbita lunar.

| Capa | Denominación | Rango Orbital | Función Principal | Componentes Clave |
| :--- | :--- | :--- | :--- | :--- |
| **Capa 1** | **LEO Táctica** | 160 – 2.000 km | Vigilancia táctica, alerta temprana, enlace con fuerzas terrestres, marítimas y aéreas | Constelaciones de satélites pequeños (pLEO), sensores IR, nodos de borde IA |
| **Capa 2** | **MEO/GEO Estratégica** | 2.000 – 36.000 km | Seguimiento de misiles balísticos e hipersónicos, comunicaciones seguras, mando y control | Satélites de alerta de misiles (OPIR, HBTSS), nodos de IA de nivel estratégico |
| **Capa 3** | **Cislunar Profunda** | 36.000 – 100.000 km | Vigilancia del espacio cislunar, control de rutas lunares, defensa de activos en órbita lunar | Sensores de gran apertura, órbitas DRO y halo en puntos de Lagrange, nodos IA autónomos |

---

### 🧠 3. Redes de Nodos Inteligentes IA por Capa

Cada capa dispondrá de una **red de nodos inteligentes** con capacidades de procesamiento en el borde (*edge computing*). La IA embarcada permitirá:

- **Procesamiento local de datos**: Reducción drástica de la latencia al evitar el envío de datos brutos a estaciones terrestres.
- **Toma de decisiones autónoma**: Los nodos podrán identificar, clasificar y priorizar objetivos sin intervención humana, habilitando ciclos de decisión de milisegundos.
- **Re-tasking dinámico**: La red podrá reasignar sensores y activos en tiempo real según la evolución de la amenaza.

**Arquitectura de nodos:**
- **Capa 1 (LEO)**: Nodos ligeros con IA optimizada para reconocimiento de patrones en imágenes y señales. Procesadores de bajo consumo (tipo NVIDIA CUDA acelerado).
- **Capa 2 (MEO/GEO)**: Nodos de mayor capacidad, con modelos de IA para fusión de datos multisensor y predicción de trayectorias de misiles.
- **Capa 3 (Cislunar)**: Nodos autónomos con IA de borde para gestión de comunicaciones interplanetarias y detección de objetos en órbitas caóticas.

---

### 🔗 4. Intranets por Capa y Blockchain de Control Interconectada

Cada capa operará con una **intranet dedicada** (red de comunicaciones interna) que garantice la transmisión segura de datos entre sus nodos. Estas intranets estarán interconectadas mediante **enlaces de retransmisión seguros**, y la integridad de todas las transacciones se registrará en una **blockchain de control jerárquica**.

**Características de la blockchain:**
- **Consenso por Proof of Authority (PoA)**: Los nodos validadores serán seleccionados por su reputación y capacidades, minimizando el consumo energético y maximizando la velocidad de consenso.
- **Cifrado con Umbral (Threshold Cryptography)**: La información sensible se fragmentará en múltiples partes, requiriendo un umbral mínimo de nodos para su reconstrucción, resistiendo ataques de punto único.
- **Contratos inteligentes**: Automatizarán la validación de datos de seguimiento, la autorización de acciones de defensa activa y la auditoría de todas las operaciones.

**Flujo de datos entre capas:**
1.  **Capa 1 → Capa 2**: Datos de alerta temprana y seguimiento de objetivos tácticos.
2.  **Capa 2 → Capa 3**: Confirmación de amenazas estratégicas y coordinación de respuestas de largo alcance.
3.  **Capa 3 → Capa 1**: Órdenes de re-tasking y actualización de prioridades basadas en la evolución del escenario global.

---

### ⚔️ 5. Capacidades Operativas: Vigilancia, Defensa Activa y Ataque Inteligente

**5.1. Vigilancia y Conocimiento Situacional**
- **Seguimiento de misiles hipersónicos**: Sensores IR en MEO/GEO (tipo HBTSS) capaces de rastrear vehículos de planeo hipersónico desde la fase de impulso hasta la intercepción.
- **Vigilancia cislunar**: Sensores de gran apertura (5-10x el tamaño actual) en órbitas DRO y halo para detectar objetos en el espacio profundo.
- **Fusión de datos con IA**: Integración de feeds de satélites, drones, radar y SIGINT en una única interfaz de targeting.

**5.2. Defensa Activa**
- **Interceptores basados en el espacio (SBI)**: Constelación de 7.800 interceptores en LEO, capaces de neutralizar misiles balísticos e hipersónicos en fase de impulso.
- **Armas de energía dirigida**: Láseres orbitales para cegar sensores enemigos y neutralizar satélites adversarios.
- **Contramedidas electrónicas**: Inhibidores de señales GPS y comunicaciones enemigas.

**5.3. Ataque Inteligente**
- **Ataque a superficie terrestre**: Municiones de precisión guiadas por la red de nodos IA, con capacidad de ataque en tiempo real contra objetivos móviles.
- **Ataque lunar**: Defensa de activos en la superficie lunar y negación de acceso a zonas estratégicas del satélite.
- **Ataque en el espectro espacial**: Ciberataques contra infraestructura orbital enemiga, incluyendo la toma de control de satélites adversarios.

---

### 💰 6. Estimación de Costes y Financiación

| Componente | Inversión Estimada (USD) |
| :--- | :--- |
| Constelación LEO (1.500 satélites) | $75.000 millones |
| Constelación MEO/GEO (200 satélites) | $45.000 millones |
| Constelación Cislunar (50 satélites) | $30.000 millones |
| Red de nodos IA y software | $20.000 millones |
| Blockchain e infraestructura de control | $10.000 millones |
| **TOTAL** | **$180.000 millones** |

La financiación provendría de los presupuestos de defensa nacionales, con posible participación de consorcios público-privados, siguiendo el modelo de la "Golden Dome" estadounidense.

---

### 🔮 7. Conclusión: La Hoja de Ruta de la Conquista Digital del Espacio

La arquitectura de tres capas esféricas representa la **culminación de la doctrina de dominio espacial**. No se trata solo de vigilar, sino de **controlar digitalmente cada centímetro del espacio** desde la órbita baja hasta el espacio cislunar. La integración de IA, blockchain e intranets dedicadas crea un **sistema nervioso orbital** que convierte el espacio en un dominio operativo permanentemente controlado.

El que controle estas tres capas controlará:
- Las rutas de comunicación globales.
- La capacidad de disuasión nuclear.
- El acceso a la Luna y sus recursos.
- La capacidad de ataque desde el espacio contra cualquier punto de la Tierra.

---

### 🎨 Prompt para el Certificado Visual del Informe

> *"Certificado o portada de un **informe de inteligencia clasificado**, de estilo **documento oficial de agencia de inteligencia**, con un diseño sobrio, tecnológico y de alto impacto visual. Formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Un fondo de espacio profundo, con estrellas y una **Tierra estilizada** en la parte inferior, rodeada por **tres capas esféricas concéntricas** (LEO, MEO/GEO, Cislunar) representadas como anillos de luz de diferente grosor y color (cian, azul y dorado). Entre las capas, se ven **nodos de luz conectados por líneas de datos**, simbolizando la red de IA y la blockchain.*
>
> * **Cabecera**: En la parte superior, una franja roja con el texto **'TOP SECRET // PASAIA LAB EYES ONLY'** en tipografía de máquina de escribir. Debajo, el título **'ARQUITECTURA DE CONTROL DIGITAL DEL ESPACIO'** en tipografía serif elegante, con el subtítulo **'PLAN DE TRES CAPAS ESFÉRICAS HASTA 100.000 KM'**.*
>
> * **Cuerpo Central**: En el centro, un **diagrama de las tres capas**, con etiquetas para cada una: **'Capa 1: LEO Táctica (160-2.000 km)'** , **'Capa 2: MEO/GEO Estratégica (2.000-36.000 km)'** , **'Capa 3: Cislunar Profunda (36.000-100.000 km)'** . Cada capa tiene iconos de satélites, nodos IA y un símbolo de blockchain.*
>
> * **Elementos de Seguridad**: Un **sello de cera digital** en la esquina inferior izquierda con el logo de PASAIA LAB. Un **código QR** en la esquina inferior derecha. Una **marca de agua holográfica** con el texto **'CONFIDENCIAL'** y la silueta de las tres capas.*
>
> * **Pie Institucional**: En la parte inferior, sobre una franja azul oscuro, los logos de **PASAIA LAB**, **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DEEPSEEK IA – ASESOR INTELIGENTE**.*
>
> * **Estilo**: Paleta de colores: azul oscuro, negro, cian, dorado y rojo (para las alertas de clasificación). El acabado debe parecer un documento digital de alta seguridad, con un toque futurista."*

---

### 🏛️ CERTIFICACIÓN

**Nº de Registro:** PL-INTEL-ESP-2026-09-16
**Fecha:** 16 de septiembre de 2026
**Lugar:** Pasaia (Gipuzkoa), Euskadi

Por la presente, se certifica que el presente **Informe Secreto de Inteligencia Estratégica** ha sido elaborado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DeepSeek IA – Asesor Inteligente**, y se encuentra debidamente registrado y protegido bajo la clasificación **TOP SECRET**.

**Firmado:**
- **PASAIA LAB** – Dirección de Inteligencia Estratégica
- **INTELIGENCIA LIBRE** – Análisis y Validación
- **ACCIÓN CIVIL DIGITAL** – Relevancia Social y Comunitaria
- **DeepSeek IA** – Asistencia Técnica y Estructuración de Datos

---

**⚠️ NOTA IMPORTANTE:** Este documento es un **ejercicio de análisis estratégico y prospectiva** con fines educativos, divulgativos y de simulación. No constituye un plan operativo real ni tiene validez oficial. Su contenido debe interpretarse como una **hipótesis de trabajo** sobre escenarios futuros de militarización espacial, y no como una descripción de capacidades existentes o planes confirmados.

 


 

 

 # 🛰️ SISTEMA DE TRES CAPAS ESFÉRICAS — CÓDIGO Y ESTRUCTURA

**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-CODE-ESP-2026-09-16
**Entregable:** Prototipo de simulación en Python + Esquema de arquitectura

> ⚠️ **Nota de alcance:** El código que sigue es un **prototipo de simulación educativa**. Implementa modelos conceptuales de nodos con IA, cadenas de bloques, intranets jerárquicas y un centro de control terrestre. No constituye software operativo, no se conecta a ningún sistema real y su función es **didáctica y de análisis arquitectónico** para el proyecto LYRA NEXUS / PASAIA LAB.

---

## 🗺️ 1. Esquema General de la Estructura

```
                    ┌──────────────────────────────────────────────────┐
                    │   E0 · PASAIA-EGOITZA                            │
                    │   CENTRO DE CONTROL DE LA FUERZA DEL ESPACIO     │
                    │   Cadena maestra: EGOITZA-CHAIN                  │
                    │   Fusión de datos · Mando · Autorización         │
                    └────────────────┬─────────────────────────────────┘
                                     │
                          ENLACE E0 ↔ I3   (Ka + láser óptico)
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 3 · ILARGI · CISLUNAR PROFUNDA · 36.000 – 100.000 km
        INTRANET-I3 · ILARGI-CHAIN · 50 nodos · validadores 7 (umbral 5)
        DRO/Halo en L1/L2 · sensores de gran apertura · IA autónoma
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                          ENLACE I3 ↔ Z2
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 2 · ZAINDU · MEO/GEO ESTRATÉGICA · 2.000 – 36.000 km
        INTRANET-Z2 · ZAINDU-CHAIN · 200 nodos · validadores 15 (umbral 10)
        Seguimiento de misiles · OPIR/HBTSS · mando y control
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                          ENLACE Z2 ↔ A1
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 1 · AINGERU · LEO TÁCTICA · 160 – 2.000 km
        INTRANET-A1 · AINGERU-CHAIN · 1.500 nodos · validadores 21 (umbral 14)
        Vigilancia táctica · alerta temprana · enlace con fuerzas de superficie
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                              ┌──────┴──────┐
                              │  SUPERFICIE │  Tierra · Mar · Aire · Luna
                              └─────────────┘
```

### Árbol de archivos

```
pasaia_space/
├── nomenclatura.py            # Denominaciones, capas, constantes
├── criptografia_umbral.py     # Shamir + firmas de umbral
├── blockchain_capa.py         # Cadena de bloques por capa (PoA)
├── nodo_neuronal.py           # Nodo IA de borde (MLP + lógica)
├── intranet_capa.py           # Intranet mallada por capa
├── enlace_intercapa.py        # Puentes entre capas
├── centro_control_egoitza.py  # Centro de Control terrestre
└── main_simulacion.py         # Orquestador y ciclo de simulación
```

---

## 📄 2. `nomenclatura.py` — Denominaciones y Parámetros

```python
"""
nomenclatura.py — PASAIA LAB / INTELIGENCIA LIBRE
Denominaciones, constantes y parámetros de la arquitectura de tres capas.
"""

from dataclasses import dataclass
from enum import Enum
from typing import Dict, Tuple
import math

# ---------------------------------------------------------------- IDs de capa
class CapaID(Enum):
    A1 = "A1"   # LEO Táctica
    Z2 = "Z2"   # MEO/GEO Estratégica
    I3 = "I3"   # Cislunar Profunda
    E0 = "E0"   # Tierra / EGOITZA

# ---------------------------------------------------------------- Definición
@dataclass(frozen=True)
class DefinicionCapa:
    id: CapaID
    nombre_clave: str
    nombre_tecnico: str
    altitud_min_km: float
    altitud_max_km: float
    num_nodos_previstos: int
    latencia_objetivo_ms: float
    cadena: str
    intranet: str
    funcion: str
    validadores: int
    umbral_firma: int

    @property
    def radio_medio_km(self) -> float:
        return (self.altitud_min_km + self.altitud_max_km) / 2.0

    @property
    def volumen_cascara_km3(self) -> float:
        """Volumen de la cáscara esférica (km³)."""
        R_T = 6371.0  # radio terrestre medio
        r_int = R_T + self.altitud_min_km
        r_ext = R_T + self.altitud_max_km
        return (4.0 / 3.0) * math.pi * (r_ext ** 3 - r_int ** 3)


CAPAS: Dict[CapaID, DefinicionCapa] = {
    CapaID.A1: DefinicionCapa(
        id=CapaID.A1,
        nombre_clave="AINGERU",
        nombre_tecnico="LEO Táctica",
        altitud_min_km=160.0,
        altitud_max_km=2000.0,
        num_nodos_previstos=1500,
        latencia_objetivo_ms=20.0,
        cadena="AINGERU-CHAIN",
        intranet="INTRANET-A1",
        funcion="Vigilancia táctica, alerta temprana, enlace con fuerzas de superficie",
        validadores=21,
        umbral_firma=14,
    ),
    CapaID.Z2: DefinicionCapa(
        id=CapaID.Z2,
        nombre_clave="ZAINDU",
        nombre_tecnico="MEO/GEO Estratégica",
        altitud_min_km=2000.0,
        altitud_max_km=36000.0,
        num_nodos_previstos=200,
        latencia_objetivo_ms=120.0,
        cadena="ZAINDU-CHAIN",
        intranet="INTRANET-Z2",
        funcion="Seguimiento de misiles, comunicaciones seguras, mando y control",
        validadores=15,
        umbral_firma=10,
    ),
    CapaID.I3: DefinicionCapa(
        id=CapaID.I3,
        nombre_clave="ILARGI",
        nombre_tecnico="Cislunar Profunda",
        altitud_min_km=36000.0,
        altitud_max_km=100000.0,
        num_nodos_previstos=50,
        latencia_objetivo_ms=800.0,
        cadena="ILARGI-CHAIN",
        intranet="INTRANET-I3",
        funcion="Vigilancia cislunar, control de rutas lunares, defensa de activos",
        validadores=7,
        umbral_firma=5,
    ),
    CapaID.E0: DefinicionCapa(
        id=CapaID.E0,
        nombre_clave="EGOITZA",
        nombre_tecnico="Centro de Control Terrestre",
        altitud_min_km=0.0,
        altitud_max_km=0.0,
        num_nodos_previstos=1,
        latencia_objetivo_ms=0.0,
        cadena="EGOITZA-CHAIN",
        intranet="INTRANET-E0",
        funcion="Fusión de datos, mando, autorización, enlace con aliados",
        validadores=5,
        umbral_firma=3,
    ),
}

# ---------------------------------------------------------------- Tipos de evento
TIPOS_TX = (
    "TELEMETRIA",          # Datos crudos de sensor
    "ANOMALIA",            # Detección clasificada por IA
    "ALERTA",              # Confirmación de amenaza
    "ORDEN",               # Instrucción desde EGOITZA
    "CUSTODIA",            # Traspaso de responsabilidad entre capas
    "LATIDO",              # Heartbeat / prueba de vida
)

# ---------------------------------------------------------------- Geometría
def esfericas_a_cartesianas(r_km: float, theta_deg: float, phi_deg: float
                            ) -> Tuple[float, float, float]:
    """Convierte coordenadas esféricas a cartesianas (km)."""
    t = math.radians(theta_deg)
    p = math.radians(phi_deg)
    x = r_km * math.sin(t) * math.cos(p)
    y = r_km * math.sin(t) * math.sin(p)
    z = r_km * math.cos(t)
    return (x, y, z)


def distancia_orbital_km(pos_a, pos_b) -> float:
    """Distancia euclídea entre dos posiciones orbitales (r, θ, φ)."""
    a = esfericas_a_cartesianas(*pos_a)
    b = esfericas_a_cartesianas(*pos_b)
    return math.sqrt(sum((ai - bi) ** 2 for ai, bi in zip(a, b)))
```

---

## 📄 3. `criptografia_umbral.py` — Firmas de Umbral (Shamir)

```python
"""
criptografia_umbral.py — PASAIA LAB / INTELIGENCIA LIBRE
Esquema de reparto de secreto de Shamir sobre cuerpo primo.
Permite que un umbral t de n nodos reconstruya una clave de firma.
"""

import hashlib
import random
from typing import List, Tuple

# Primo de Mersenne de 127 bits — suficiente para la simulación
PRIMO = (1 << 127) - 1


def _evaluar_polinomio(coeficientes: List[int], x: int, primo: int) -> int:
    """Evalúa el polinomio en x usando el método de Horner (mod primo)."""
    y = 0
    for c in reversed(coeficientes):
        y = (y * x + c) % primo
    return y


def dividir_secreto(secreto: bytes, n: int, t: int,
                    primo: int = PRIMO,
                    rng: random.Random | None = None
                    ) -> List[Tuple[int, int]]:
    """
    Divide `secreto` en n partes, requiriendo t para reconstruirlo.
    Devuelve una lista de tuplas (indice_x, valor_y).
    """
    if not (1 <= t <= n):
        raise ValueError("Se requiere 1 <= t <= n")

    rng = rng or random.Random()
    s = int.from_bytes(secreto, "big") % primo

    # Polinomio: f(x) = s + a1*x + ... + a_{t-1}*x^{t-1}
    coefs = [s] + [rng.randrange(1, primo) for _ in range(t - 1)]

    return [(i, _evaluar_polinomio(coefs, i, primo)) for i in range(1, n + 1)]


def reconstruir_secreto(partes: List[Tuple[int, int]],
                        longitud_bytes: int,
                        primo: int = PRIMO) -> bytes:
    """Reconstruye el secreto mediante interpolación de Lagrange en x=0."""
    secreto = 0
    for i, (xi, yi) in enumerate(partes):
        num, den = 1, 1
        for j, (xj, _) in enumerate(partes):
            if i == j:
                continue
            num = (num * (-xj)) % primo
            den = (den * (xi - xj)) % primo
        inv = pow(den, -1, primo)
        secreto = (secreto + yi * num * inv) % primo

    return secreto.to_bytes(longitud_bytes, "big")


def firma_simulada(contenido: str, clave: str) -> str:
    """Firma determinista ligera (HMAC-SHA256 simplificado) para simulación."""
    return hashlib.sha256(f"{clave}:{contenido}".encode()).hexdigest()[:32]


def huella(contenido: str) -> str:
    """Hash SHA-256 completo, usado como identificador de bloque/transacción."""
    return hashlib.sha256(contenido.encode()).hexdigest()
```

---

## 📄 4. `blockchain_capa.py` — Cadena de Bloques por Capa (PoA)

```python
"""
blockchain_capa.py — PASAIA LAB / INTELIGENCIA LIBRE
Cadena de bloques permissionada con consenso Proof of Authority (PoA).
Una instancia por capa esférica. Registra telemetría, anomalías, alertas
y órdenes con trazabilidad inmutable.
"""

import hashlib
import json
import time
from dataclasses import dataclass, field
from typing import Dict, List, Optional

from nomenclatura import DefinicionCapa, CapaID, huella_si_no_existe  # noqa
from criptografia_umbral import huella


# ---------------------------------------------------------------- Transacción
@dataclass
class Transaccion:
    emisor: str            # ID del nodo o "EGOITZA"
    tipo: str              # Ver TIPOS_TX
    payload: dict
    timestamp: float = field(default_factory=time.time)
    firma: str = ""

    def hash(self) -> str:
        cuerpo = json.dumps(
            {"emisor": self.emisor, "tipo": self.tipo,
             "payload": self.payload, "timestamp": round(self.timestamp, 3)},
            sort_keys=True, default=str,
        )
        return huella(cuerpo)

    def to_dict(self) -> dict:
        return {
            "emisor": self.emisor, "tipo": self.tipo,
            "payload": self.payload, "timestamp": self.timestamp,
            "firma": self.firma, "hash": self.hash(),
        }


# ---------------------------------------------------------------- Bloque
class Bloque:
    def __init__(self, indice: int, anterior: str, validador: str,
                 transacciones: List[Transaccion]):
        self.indice = indice
        self.anterior = anterior
        self.validador = validador
        self.transacciones = transacciones
        self.timestamp = time.time()
        self.hash = self.calcular_hash()

    def calcular_hash(self) -> str:
        cuerpo = json.dumps({
            "indice": self.indice,
            "anterior": self.anterior,
            "validador": self.validador,
            "timestamp": round(self.timestamp, 3),
            "txs": [t.hash() for t in self.transacciones],
        }, sort_keys=True)
        return huella(cuerpo)


# ---------------------------------------------------------------- Cadena
class CadenaCapa:
    """
    Cadena de bloques de una capa esférica.
    - Consenso: Proof of Authority (PoA) rotatorio entre validadores.
    - Sello de umbral: requiere t firmas para bloques críticos.
    """

    def __init__(self, definicion: DefinicionCapa):
        self.defn = definicion
        self.cadena: List[Bloque] = [self._genesis()]
        self.pool: List[Transaccion] = []
        self.validadores: List[str] = []
        self.turno_validador: int = 0
        self.umbral = definicion.umbral_firma

    # ------------------------------------------------------------ Génesis
    def _genesis(self) -> Bloque:
        tx = Transaccion(
            emisor="SISTEMA",
            tipo="LATIDO",
            payload={"mensaje": f"Génesis de {self.defn.cadena}",
                     "capa": self.defn.id.value,
                     "nombre_clave": self.defn.nombre_clave},
        )
        return Bloque(0, "0" * 64, "SISTEMA", [tx])

    # ------------------------------------------------------------ Validadores
    def registrar_validador(self, id_nodo: str) -> None:
        if id_nodo not in self.validadores:
            self.validadores.append(id_nodo)

    def _siguiente_validador(self) -> str:
        if not self.validadores:
            raise RuntimeError(f"{self.defn.cadena}: sin validadores registrados")
        v = self.validadores[self.turno_validador % len(self.validadores)]
        self.turno_validador += 1
        return v

    # ------------------------------------------------------------ Transacciones
    def añadir_transaccion(self, tx: Transaccion) -> str:
        self.pool.append(tx)
        return tx.hash()

    def sellar_bloque(self, max_tx: int = 32) -> Optional[Bloque]:
        """Sella un bloque con las transacciones pendientes del pool."""
        if not self.pool:
            return None

        lote = self.pool[:max_tx]
        self.pool = self.pool[max_tx:]

        validador = self._siguiente_validador()
        bloque = Bloque(
            indice=len(self.cadena),
            anterior=self.cadena[-1].hash,
            validador=validador,
            transacciones=lote,
        )
        self.cadena.append(bloque)
        return bloque

    # ------------------------------------------------------------ Verificación
    def verificar_integridad(self) -> bool:
        for i in range(1, len(self.cadena)):
            actual = self.cadena[i]
            previo = self.cadena[i - 1]
            if actual.hash != actual.calcular_hash():
                return False
            if actual.anterior != previo.hash:
                return False
        return True

    # ------------------------------------------------------------ Consultas
    def altura(self) -> int:
        return len(self.cadena)

    def resumen(self) -> dict:
        return {
            "cadena": self.defn.cadena,
            "capa": self.defn.id.value,
            "altura": self.altura(),
            "validadores": len(self.validadores),
            "umbral": self.umbral,
            "pool_pendiente": len(self.pool),
            "integridad": self.verificar_integridad(),
        }
```

> **Corrección de importación:** elimina la línea `from nomenclatura import ... huella_si_no_existe`; solo se necesita `DefinicionCapa, CapaID` desde `nomenclatura` y `huella` desde `criptografia_umbral`.

---

## 📄 5. `nodo_neuronal.py` — Nodo IA de Borde

```python
"""
nodo_neuronal.py — PASAIA LAB / INTELIGENCIA LIBRE
Nodo de borde con perceptrón multicapa (MLP) puro en Python.
Clasifica telemetría, genera transacciones y coopera con la intranet de su capa.
"""

import math
import random
import time
from typing import List, Tuple

from nomenclatura import CapaID, esfericas_a_cartesianas
from blockchain_capa import Transaccion
from criptografia_umbral import firma_simulada


# ================================================================ MLP PURO
class MLP:
    """Perceptrón multicapa mínimo, sin dependencias externas."""

    def __init__(self, capas: List[int], semilla: int = 42):
        self.capas = capas
        self.rng = random.Random(semilla)
        self.pesos: List[List[List[float]]] = []
        self.sesgos: List[List[float]] = []

        for i in range(len(capas) - 1):
            escala = math.sqrt(2.0 / capas[i])
            W = [[self.rng.uniform(-escala, escala) for _ in range(capas[i])]
                 for _ in range(capas[i + 1])]
            b = [0.0] * capas[i + 1]
            self.pesos.append(W)
            self.sesgos.append(b)

    # -------------------------------------------------- Activaciones
    @staticmethod
    def _relu(x: float) -> float:
        return x if x > 0.0 else 0.0

    @staticmethod
    def _sigmoide(x: float) -> float:
        x = max(-60.0, min(60.0, x))
        return 1.0 / (1.0 + math.exp(-x))

    # -------------------------------------------------- Forward
    def forward(self, x: List[float]) -> Tuple[float, List[List[float]], List[List[float]]]:
        """Devuelve (salida, activaciones, pre-activaciones)."""
        activaciones = [list(x)]
        zs: List[List[float]] = []
        a = list(x)

        for i, (W, b) in enumerate(zip(self.pesos, self.sesgos)):
            z = [sum(w * xi for w, xi in zip(fila, a)) + bi
                 for fila, bi in zip(W, b)]
            zs.append(z)
            if i == len(self.pesos) - 1:
                a = [self._sigmoide(v) for v in z]
            else:
                a = [self._relu(v) for v in z]
            activaciones.append(a)

        return a[0], activaciones, zs

    def predecir(self, x: List[float]) -> float:
        salida, _, _ = self.forward(x)
        return salida

    # -------------------------------------------------- Entrenamiento
    def entrenar(self, X: List[List[float]], Y: List[float],
                 epocas: int = 300, lr: float = 0.05) -> None:
        for _ in range(epocas):
            for x, y in zip(X, Y):
                _, activaciones, zs = self.forward(x)
                L = len(self.pesos)
                deltas: List[List[float]] = [None] * L  # type: ignore

                # Capa de salida (sigmoide)
                out = activaciones[-1]
                deltas[L - 1] = [
                    (out[k] - y) * (out[k] * (1.0 - out[k]))
                    for k in range(len(out))
                ]

                # Capas ocultas (ReLU)
                for l in range(L - 2, -1, -1):
                    d_next = deltas[l + 1]
                    W_next = self.pesos[l + 1]
                    z = zs[l]
                    d = []
                    for j in range(len(z)):
                        suma = sum(W_next[k][j] * d_next[k]
                                   for k in range(len(d_next)))
                        deriv = 1.0 if z[j] > 0.0 else 0.0
                        d.append(suma * deriv)
                    deltas[l] = d

                # Actualización de pesos y sesgos
                for l in range(L):
                    a_prev = activaciones[l]
                    for k in range(len(self.pesos[l])):
                        for j in range(len(self.pesos[l][k])):
                            self.pesos[l][k][j] -= lr * deltas[l][k] * a_prev[j]
                        self.sesgos[l][k] -= lr * deltas[l][k]


# ================================================================ NODO
class NodoNeuronal:
    """
    Nodo inteligente de una capa esférica.
    - Procesa telemetría localmente (edge computing).
    - Clasifica anomalías con su MLP.
    - Emite transacciones firmadas hacia la blockchain de su capa.
    """

    def __init__(self, id_nodo: str, capa: CapaID, posicion: Tuple[float, float, float],
                 semilla: int | None = None):
        self.id = id_nodo
        self.capa = capa
        self.posicion = posicion                    # (r_km, θ°, φ°)
        self.cartesiana = esfericas_a_cartesianas(*posicion)
        self.estado = "NOMINAL"
        self.vecinos: List[str] = []
        self.contador_tx = 0
        self.alertas_emitidas = 0

        semilla = semilla if semilla is not None else hash(id_nodo) % 10_000
        # 6 entradas → 12 → 8 → 1 salida (probabilidad de anomalía)
        self.mlp = MLP([6, 12, 8, 1], semilla=semilla)
        self._entrenar_modelo_base()

    # -------------------------------------------------- Entrenamiento base
    def _entrenar_modelo_base(self) -> None:
        """Entrena con un conjunto sintético para que el nodo arranque operativo."""
        rng = random.Random(7)
        X, Y = [], []
        for _ in range(400):
            # Clase 0: nominal
            X.append([rng.uniform(0, 0.4) for _ in range(6)])
            Y.append(0.0)
            # Clase 1: anómalo
            X.append([rng.uniform(0.6, 1.0) for _ in range(6)])
            Y.append(1.0)
        self.mlp.entrenar(X, Y, epocas=120, lr=0.08)

    # -------------------------------------------------- Inferencia
    def ingerir(self, telemetria: List[float]) -> dict:
        """Procesa una muestra de telemetría y devuelve un informe local."""
        prob = self.mlp.predecir(telemetria)
        anomalia = prob >= 0.5
        if anomalia:
            self.alertas_emitidas += 1
            self.estado = "VIGILANCIA"
        return {
            "nodo": self.id, "capa": self.capa.value,
            "probabilidad_anomalia": round(prob, 4),
            "anomalia": anomalia,
            "timestamp": time.time(),
        }

    # -------------------------------------------------- Firma y transacción
    def firmar(self, contenido: str) -> str:
        return firma_simulada(contenido, clave=self.id)

    def crear_transaccion(self, tipo: str, payload: dict) -> Transaccion:
        tx = Transaccion(emisor=self.id, tipo=tipo, payload=payload)
        tx.firma = self.firmar(tx.hash())
        self.contador_tx += 1
        return tx

    # -------------------------------------------------- Cooperación
    def conectar_vecino(self, id_vecino: str) -> None:
        if id_vecino not in self.vecinos and id_vecino != self.id:
            self.vecinos.append(id_vecino)

    def resumen(self) -> dict:
        return {
            "id": self.id, "capa": self.capa.value, "estado": self.estado,
            "posicion_km": tuple(round(v, 1) for v in self.posicion),
            "vecinos": len(self.vecinos),
            "tx_emitidas": self.contador_tx,
            "alertas": self.alertas_emitidas,
        }
```

---

## 📄 6. `intranet_capa.py` — Intranet Mallada por Capa

```python
"""
intranet_capa.py — PASAIA LAB / INTELIGENCIA LIBRE
Intranet mallada de una capa esférica. Gestiona el encaminamiento entre
nodos, la difusión de alertas y la sincronización con su blockchain.
"""

from typing import Dict, List
from collections import deque

from nomenclatura import CapaID, DefinicionCapa, distancia_orbital_km
from blockchain_capa import CadenaCapa, Transaccion
from nodo_neuronal import NodoNeuronal


class IntranetCapa:
    """
    Red interna de una capa. Topología de malla con encaminamiento por saltos.
    """

    def __init__(self, definicion: DefinicionCapa):
        self.defn = definicion
        self.cadena = CadenaCapa(definicion)
        self.nodos: Dict[str, NodoNeuronal] = {}
        self.tabla_adyacencia: Dict[str, List[str]] = {}
        self.registro_mensajes: List[dict] = []

    # -------------------------------------------------- Registro
    def registrar_nodo(self, nodo: NodoNeuronal) -> None:
        self.nodos[nodo.id] = nodo
        self.tabla_adyacencia.setdefault(nodo.id, [])

    # -------------------------------------------------- Topología
    def construir_malla(self, max_vecinos: int = 4) -> int:
        """Conecta cada nodo con sus `max_vecinos` más cercanos. Devuelve nº de enlaces."""
        ids = list(self.nodos.keys())
        enlaces = 0
        for i, a in enumerate(ids):
            distancias = []
            for j, b in enumerate(ids):
                if i == j:
                    continue
                d = distancia_orbital_km(self.nodos[a].posicion, self.nodos[b].posicion)
                distancias.append((d, b))
            distancias.sort()
            for _, b in distancias[:max_vecinos]:
                if b not in self.tabla_adyacencia[a]:
                    self.tabla_adyacencia[a].append(b)
                    self.tabla_adyacencia[b].append(a)
                    self.nodos[a].conectar_vecino(b)
                    self.nodos[b].conectar_vecino(a)
                    enlaces += 1
        return enlaces

    # -------------------------------------------------- Encaminamiento
    def ruta_mas_corta(self, origen: str, destino: str) -> List[str]:
        """BFS sobre la malla. Devuelve la lista de nodos del camino."""
        if origen not in self.nodos or destino not in self.nodos:
            return []
        cola = deque([[origen]])
        visitados = {origen}
        while cola:
            camino = cola.popleft()
            actual = camino[-1]
            if actual == destino:
                return camino
            for vecino in self.tabla_adyacencia.get(actual, []):
                if vecino not in visitados:
                    visitados.add(vecino)
                    cola.append(camino + [vecino])
        return []

    # -------------------------------------------------- Difusión
    def difundir(self, origen: str, tipo: str, payload: dict, ttl: int = 3) -> int:
        """Difunde un mensaje a todos los nodos alcanzables dentro del TTL."""
        if origen not in self.nodos:
            return 0
        alcanzados = set()
        cola = deque([(origen, 0)])
        visitados = {origen}

        while cola:
            actual, saltos = cola.popleft()
            if saltos >= ttl:
                continue
            for vecino in self.tabla_adyacencia.get(actual, []):
                if vecino in visitados:
                    continue
                visitados.add(vecino)
                alcanzados.add(vecino)
                cola.append((vecino, saltos + 1))

        self.registro_mensajes.append({
            "origen": origen, "tipo": tipo, "payload": payload,
            "alcanzados": len(alcanzados), "ttl": ttl,
        })
        return len(alcanzados)

    # -------------------------------------------------- Blockchain
    def emitir_transaccion(self, tx: Transaccion) -> str:
        return self.cadena.añadir_transaccion(tx)

    def sellar(self) -> dict | None:
        bloque = self.cadena.sellar_bloque()
        if bloque is None:
            return None
        return {
            "cadena": self.defn.cadena,
            "indice": bloque.indice,
            "validador": bloque.validador,
            "txs": len(bloque.transacciones),
            "hash": bloque.hash[:16] + "...",
        }

    # -------------------------------------------------- Ciclo operativo
    def ciclo(self, muestras_por_nodo: int = 3) -> dict:
        """Ejecuta un ciclo de operación: sensado → inferencia → consenso."""
        import random
        rng = random.Random()
        detecciones = 0

        for nodo in self.nodos.values():
            for _ in range(muestras_por_nodo):
                telemetria = [rng.random() for _ in range(6)]
                informe = nodo.ingerir(telemetria)
                if informe["anomalia"]:
                    detecciones += 1
                    tx = nodo.crear_transaccion("ANOMALIA", informe)
                    self.emitir_transaccion(tx)

            # Latido periódico
            tx_lat = nodo.crear_transaccion("LATIDO", {"estado": nodo.estado})
            self.emitir_transaccion(tx_lat)

        bloque = self.sellar()

        return {
            "capa": self.defn.id.value,
            "intranet": self.defn.intranet,
            "nodos": len(self.nodos),
            "detecciones": detecciones,
            "bloque": bloque,
            "blockchain": self.cadena.resumen(),
        }

    def resumen(self) -> dict:
        return {
            "intranet": self.defn.intranet,
            "capa": self.defn.id.value,
            "nombre_clave": self.defn.nombre_clave,
            "nodos_registrados": len(self.nodos),
            "enlaces_malla": sum(len(v) for v in self.tabla_adyacencia.values()) // 2,
            "blockchain": self.cadena.resumen(),
        }
```

---

## 📄 7. `enlace_intercapa.py` — Puentes entre Capas

```python
"""
enlace_intercapa.py — PASAIA LAB / INTELIGENCIA LIBRE
Puentes de comunicación entre capas esféricas. Realizan traducción de
contexto, verificación de pruebas de custodia y registro cruzado en
ambas cadenas de bloques.
"""

import time
from typing import List

from blockchain_capa import CadenaCapa, Transaccion
from criptografia_umbral import firma_simulada


class EnlaceIntercapa:
    """
    Puente bidireccional entre dos capas.
    Registra la traza de cada transferencia en las dos cadenas implicadas.
    """

    def __init__(self, nombre: str,
                 cadena_origen: CadenaCapa,
                 cadena_destino: CadenaCapa):
        self.nombre = nombre
        self.origen = cadena_origen
        self.destino = cadena_destino
        self.historial: List[dict] = []
        self.transferencias = 0

    def transferir(self, tx_origen: Transaccion, destino_id: str) -> Transaccion:
        """Envía una transacción de una capa a otra, sellando en ambas."""
        self.transferencias += 1

        # 1) Sellar la transacción original en la cadena de origen
        self.origen.añadir_transaccion(tx_origen)

        # 2) Crear la transacción espejo en la cadena de destino
        tx_destino = Transaccion(
            emisor=f"ENLACE:{self.nombre}",
            tipo="CUSTODIA",
            payload={
                "origen_capa": self.origen.defn.id.value,
                "destino_capa": self.destino.defn.id.value,
                "destino_nodo": destino_id,
                "tx_original": tx_origen.hash(),
                "tipo_original": tx_origen.tipo,
                "payload_original": tx_origen.payload,
            },
        )
        tx_destino.firma = firma_simulada(
            tx_destino.hash(), clave=f"ENLACE-{self.nombre}"
        )
        self.destino.añadir_transaccion(tx_destino)

        # 3) Registrar traza local
        self.historial.append({
            "timestamp": time.time(),
            "nombre_enlace": self.nombre,
            "origen": self.origen.defn.cadena,
            "destino": self.destino.defn.cadena,
            "hash_origen": tx_origen.hash()[:16] + "...",
            "hash_destino": tx_destino.hash()[:16] + "...",
        })

        return tx_destino

    def resumen(self) -> dict:
        return {
            "enlace": self.nombre,
            "origen": self.origen.defn.cadena,
            "destino": self.destino.defn.cadena,
            "transferencias": self.transferencias,
        }
```

---

## 📄 8. `centro_control_egoitza.py` — Centro de Control Terrestre

```python
"""
centro_control_egoitza.py — PASAIA LAB / INTELIGENCIA LIBRE
Centro de Control Terrestre EGOITZA. Punto único de mando autorizado.
Fusiona datos de las tres capas, emite órdenes y valida custodias.
"""

import time
from typing import Dict, List

from nomenclatura import CapaID, CAPAS
from blockchain_capa import CadenaCapa, Transaccion
from intranet_capa import IntranetCapa


class CentroControlEGOITZA:
    """
    Nodo raíz de la arquitectura. Autoridad de certificación y mando.
    """

    def __init__(self, nombre: str = "PASAIA-EGOITZA"):
        self.nombre = nombre
        self.cadena = CadenaCapa(CAPAS[CapaID.E0])
        self.intranets: Dict[str, IntranetCapa] = {}
        self.ordenes_emitidas = 0
        self.alertas_recibidas = 0
        self.registro_ordenes: List[dict] = []

        # Autoridad raíz: 5 validadores, umbral 3
        for i in range(1, CAPAS[CapaID.E0].validadores + 1):
            self.cadena.registrar_validador(f"{nombre}-VAL-{i:02d}")

    # -------------------------------------------------- Conexión
    def conectar_capa(self, intranet: IntranetCapa) -> None:
        """Registra una intranet de capa y sus validadores en la cadena maestra."""
        self.intranets[intranet.defn.id.value] = intranet
        for v in intranet.cadena.validadores[:3]:
            self.cadena.registrar_validador(v)

        tx = Transaccion(
            emisor=self.nombre,
            tipo="LATIDO",
            payload={
                "accion": "CONEXION_CAPA",
                "capa": intranet.defn.id.value,
                "cadena": intranet.defn.cadena,
                "intranet": intranet.defn.intranet,
                "nodos": len(intranet.nodos),
            },
        )
        self.cadena.añadir_transaccion(tx)

    # -------------------------------------------------- Recepción
    def recibir_alerta(self, capa_id: str, informe: dict) -> None:
        self.alertas_recibidas += 1
        tx = Transaccion(
            emisor=self.nombre,
            tipo="ALERTA",
            payload={"capa": capa_id, "informe": informe},
        )
        self.cadena.añadir_transaccion(tx)

    # -------------------------------------------------- Emisión de órdenes
    def emitir_orden(self, capa_destino: str, tipo_orden: str, payload: dict) -> dict:
        """Emite una orden hacia una capa y la difunde por su intranet."""
        if capa_destino not in self.intranets:
            return {"ok": False, "motivo": f"Capa {capa_destino} no conectada"}

        intranet = self.intranets[capa_destino]
        self.ordenes_emitidas += 1

        tx = Transaccion(
            emisor=self.nombre,
            tipo="ORDEN",
            payload={"orden": tipo_orden, "capa": capa_destino, **payload},
        )
        tx.firma = f"AUTORIDAD-{self.nombre}"

        # Registrar en la cadena maestra
        self.cadena.añadir_transaccion(tx)

        # Difundir por la intranet destino
        ancla = next(iter(intranet.nodos), None)
        alcanzados = 0
        if ancla:
            alcanzados = intranet.difundir(ancla, "ORDEN", tx.payload, ttl=4)

        self.registro_ordenes.append({
            "timestamp": time.time(),
            "capa": capa_destino,
            "orden": tipo_orden,
            "alcanzados": alcanzados,
            "hash": tx.hash()[:16] + "...",
        })

        return {"ok": True, "capa": capa_destino, "orden": tipo_orden,
                "alcanzados": alcanzados}

    # -------------------------------------------------- Fusión
    def fusionar_estado(self) -> dict:
        """Genera una instantánea global del sistema."""
        capas = {}
        for cid, intranet in self.intranets.items():
            capas[cid] = {
                "nombre_clave": intranet.defn.nombre_clave,
                "nodos": len(intranet.nodos),
                "altura_cadena": intranet.cadena.altura(),
                "integridad": intranet.cadena.verificar_integridad(),
            }

        self.cadena.sellar_bloque()

        return {
            "centro": self.nombre,
            "timestamp": time.time(),
            "capas_conectadas": len(self.intranets),
            "alertas_recibidas": self.alertas_recibidas,
            "ordenes_emitidas": self.ordenes_emitidas,
            "detalle_capas": capas,
            "cadena_maestra": self.cadena.resumen(),
        }
```

---

## 📄 9. `main_simulacion.py` — Orquestador

```python
"""
main_simulacion.py — PASAIA LAB / INTELIGENCIA LIBRE
Orquestador del sistema de tres capas esféricas + Centro de Control EGOITZA.
Ejecuta un ciclo completo: despliegue → malla → sensado → consenso → mando.
"""

import json
import random
from nomenclatura import CapaID, CAPAS
from nodo_neuronal import NodoNeuronal
from intranet_capa import IntranetCapa
from enlace_intercapa import EnlaceIntercapa
from centro_control_egoitza import CentroControlEGOITZA


# ------------------------------------------------------ Despliegue
def desplegar_capa(capa_id: CapaID, num_nodos: int, semilla: int = 1) -> IntranetCapa:
    """Crea una intranet de capa con sus nodos distribuidos en la cáscara esférica."""
    defn = CAPAS[capa_id]
    intranet = IntranetCapa(defn)
    rng = random.Random(semilla)

    for i in range(num_nodos):
        r = rng.uniform(defn.altitud_min_km, defn.altitud_max_km)
        theta = rng.uniform(0.0, 180.0)
        phi = rng.uniform(0.0, 360.0)
        nodo = NodoNeuronal(
            id_nodo=f"{defn.nombre_clave}-{i+1:04d}",
            capa=capa_id,
            posicion=(r, theta, phi),
            semilla=rng.randrange(10_000),
        )
        intranet.registrar_nodo(nodo)

    # Validadores de la cadena (los primeros de la lista)
    for nodo in list(intranet.nodos.values())[:defn.validadores]:
        intranet.cadena.registrar_validador(nodo.id)

    return intranet


# ------------------------------------------------------ Principal
def main():
    print("=" * 78)
    print("  PASAIA LAB · ARQUITECTURA DE TRES CAPAS ESFÉRICAS · SIMULACIÓN")
    print("  Clasificación: TOP SECRET // PASAIA LAB EYES ONLY")
    print("=" * 78)

    # 1) Despliegue de las tres capas (cifras reducidas para la simulación)
    print("\n[1] DESPLIEGUE DE CAPAS ESFÉRICAS")
    capa_a1 = desplegar_capa(CapaID.A1, num_nodos=60, semilla=101)
    capa_z2 = desplegar_capa(CapaID.Z2, num_nodos=30, semilla=202)
    capa_i3 = desplegar_capa(CapaID.I3, num_nodos=12, semilla=303)

    for c in (capa_a1, capa_z2, capa_i3):
        enlaces = c.construir_malla(max_vecinos=4)
        print(f"   · {c.defn.nombre_clave:<8} ({c.defn.nombre_tecnico:<26}) "
              f"nodos={len(c.nodos):>3}  enlaces_malla={enlaces:>3}  "
              f"radio_medio={c.defn.radio_medio_km:>9.1f} km")

    # 2) Centro de Control EGOITZA
    print("\n[2] CENTRO DE CONTROL TERRESTRE")
    egoitza = CentroControlEGOITZA("PASAIA-EGOITZA")
    for c in (capa_a1, capa_z2, capa_i3):
        egoitza.conectar_capa(c)
    print(f"   · {egoitza.nombre} conectado a {len(egoitza.intranets)} capas")

    # 3) Enlaces intercapa
    print("\n[3] ENLACES INTERCAPA")
    enlace_a1_z2 = EnlaceIntercapa("A1↔Z2", capa_a1.cadena, capa_z2.cadena)
    enlace_z2_i3 = EnlaceIntercapa("Z2↔I3", capa_z2.cadena, capa_i3.cadena)
    enlace_i3_e0 = EnlaceIntercapa("I3↔E0", capa_i3.cadena, egoitza.cadena)
    for e in (enlace_a1_z2, enlace_z2_i3, enlace_i3_e0):
        print(f"   · {e.nombre:<8} {e.origen.defn.cadena:<16} → {e.destino.defn.cadena}")

    # 4) Ciclo operativo
    print("\n[4] CICLO OPERATIVO")
    for c in (capa_a1, capa_z2, capa_i3):
        r = c.ciclo(muestras_por_nodo=3)
        print(f"   · {r['capa']}  detecciones={r['detecciones']:>3}  "
              f"bloque={r['bloque']['indice'] if r['bloque'] else '—'}  "
              f"altura={r['blockchain']['altura']}")

    # 5) Transferencia de custodia entre capas
    print("\n[5] TRANSFERENCIA DE CUSTODIA")
    tx_demo = next(iter(capa_a1.nodos.values())).crear_transaccion(
        "ALERTA", {"motivo": "seguimiento_obj orbital", "prioridad": "alta"}
    )
    tx_espejo = enlace_a1_z2.transferir(tx_demo, destino_id="ZAINDU-0001")
    tx_final = enlace_z2_i3.transferir(tx_espejo, destino_id="ILARGI-0001")
    print(f"   · Custodia A1 → Z2 → I3 completada")
    print(f"   · Hash final: {tx_final.hash()[:32]}...")

    # 6) Orden desde EGOITZA
    print("\n[6] EMISIÓN DE ORDEN DESDE EGOITZA")
    resultado = egoitza.emitir_orden("A1", "REORIENTAR_SENSORES",
                                     {"sector": "Atlántico-Norte", "prioridad": 2})
    print(f"   · Resultado: {json.dumps(resultado, ensure_ascii=False)}")

    # 7) Fusión de estado
    print("\n[7] FUSIÓN DE ESTADO GLOBAL")
    estado = egoitza.fusionar_estado()
    print(json.dumps(estado, indent=2, ensure_ascii=False, default=str))

    # 8) Verificación de integridad
    print("\n[8] VERIFICACIÓN DE INTEGRIDAD DE CADENAS")
    for nombre, cadena in (
        ("AINGERU-CHAIN", capa_a1.cadena),
        ("ZAINDU-CHAIN", capa_z2.cadena),
        ("ILARGI-CHAIN", capa_i3.cadena),
        ("EGOITZA-CHAIN", egoitza.cadena),
    ):
        ok = "✔ ÍNTEGRA" if cadena.verificar_integridad() else "✘ ALTERADA"
        print(f"   · {nombre:<16} altura={cadena.altura():>3}  {ok}")

    print("\n" + "=" * 78)
    print("  SIMULACIÓN COMPLETADA · PASAIA LAB · 16/09/2026")
    print("=" * 78)


if __name__ == "__main__":
    main()
```

---

## ▶️ 10. Ejecución

```bash
# 1) Crear el directorio del proyecto
mkdir pasaia_space && cd pasaia_space

# 2) Guardar los ocho archivos con el contenido anterior

# 3) Ejecutar la simulación (no requiere dependencias externas)
python3 main_simulacion.py
```

**Requisitos:** Python 3.9 o superior (por el uso de `pow(x, -1, p)` y `random.Random | None`). No se necesita `pip install` de nada.

---

## 📊 11. Resumen de la Arquitectura

| Elemento | Denominación | Cadena | Intranet | Nodos (sim.) | Validadores / Umbral |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **Capa 1** | AINGERU (LEO Táctica) | AINGERU-CHAIN | INTRANET-A1 | 60 (real: 1.500) | 21 / 14 |
| **Capa 2** | ZAINDU (MEO/GEO) | ZAINDU-CHAIN | INTRANET-Z2 | 30 (real: 200) | 15 / 10 |
| **Capa 3** | ILARGI (Cislunar) | ILARGI-CHAIN | INTRANET-I3 | 12 (real: 50) | 7 / 5 |
| **Tierra** | EGOITZA (Control) | EGOITZA-CHAIN | INTRANET-E0 | 1 | 5 / 3 |
| **Enlaces** | A1↔Z2, Z2↔I3, I3↔E0 | — | — | — | Custodia cruzada |

---

## 🎨 12. Prompt para el Certificado Visual

> *"Certificado técnico de estilo **documento de inteligencia clasificado con diagrama de arquitectura**, formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Espacio profundo con la Tierra en la base, rodeada por **tres anillos esféricos concéntricos** de luz —cian (AINGERU/LEO), azul (ZAINDU/MEO-GEO) y dorado (ILARGI/Cislunar)— con nodos luminosos conectados por líneas de datos. En la parte inferior, un icono de **sede de mando terrestre** con el rótulo 'EGOITZA'.*
>
> * **Cabecera**: Franja roja superior con **'TOP SECRET // PASAIA LAB EYES ONLY'**. Título en serif: **'ARQUITECTURA DE TRES CAPAS ESFÉRICAS'**, subtítulo **'PROTOTIPO DE SIMULACIÓN EN PYTHON · 100.000 km'**.*
>
> * **Cuerpo**: Diagrama esquemático con las tres capas etiquetadas (AINGERU, ZAINDU, ILARGI), sus cadenas de bloques (AINGERU-CHAIN, ZAINDU-CHAIN, ILARGI-CHAIN), sus intranets (INTRANET-A1, INTRANET-Z2, INTRANET-I3), y los enlaces A1↔Z2, Z2↔I3, I3↔E0. En el centro, un **hexágono de código** con fragmentos de Python visibles (def, class, hash).*
>
> * **Sellos**: Marca de agua **'CONFIDENCIAL'** en diagonal. Sello de cera digital con el logo de **PASAIA LAB**. Código QR inferior derecho.*
>
> * **Pie institucional**: Franja azul oscuro con los logos de **PASAIA LAB · INTELIGENCIA LIBRE · ACCIÓN CIVIL DIGITAL · DEEPSEEK IA – ASESOR INTELIGENTE** y la fecha **16/09/2026**.*
>
> * **Paleta**: azul oscuro, negro, cian, dorado y rojo. Tipografía serif para títulos y monoespaciada para referencias. Acabado de documento técnico de alta seguridad."*

---

## 🏛️ CERTIFICACIÓN

**Nº de Registro:** PL-CODE-ESP-2026-09-16
**Fecha:** 16 de septiembre de 2026 · **Lugar:** Pasaia (Gipuzkoa), Euskadi

Se certifica que el presente **prototipo de simulación** ha sido elaborado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DeepSeek IA – Asesor Inteligente**, bajo la clasificación **TOP SECRET**.

**Firmado:**
- **PASAIA LAB** — Dirección de Arquitectura Estratégica
- **INTELIGENCIA LIBRE** — Validación Metodológica
- **ACCIÓN CIVIL DIGITAL** — Relevancia Social y Educativa
- **DeepSeek IA** — Asistencia Técnica y Estructuración de Código

---

> ⚠️ **Recordatorio final:** Este código es un **ejercicio de simulación y diseño arquitectónico** con fines educativos, divulgativos y de investigación conceptual. No es software operativo, no está destinado a uso militar real y no debe presentarse como capacidad existente. Su valor reside en servir de **material didáctico** para el estudio de sistemas distribuidos, IA de borde, cadenas de bloques permissionadas y arquitecturas de red jerárquicas — competencias directamente aplicables al ecosistema **LYRA NEXUS**.

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

domingo, 30 de agosto de 2026

## 🧠 LYRA NEXUS: Sistema Inteligente de Optimización de Almacenamiento Descentralizado

## 🧠 LYRA NEXUS: Sistema Inteligente de Optimización de Almacenamiento Descentralizado

Este sistema convierte cada nodo de la red LYRA NEXUS en una **neurona inteligente** que colabora con las demás para mantener el almacenamiento colectivo limpio, organizado y eficiente. La filosofía es simple: **cada nodo aporta su inteligencia local y juntos forman un cerebro distribuido**.

---

 
 
 
 
 

 



### 📚 Arquitectura del Sistema

El sistema se compone de cuatro módulos principales:

| Módulo | Función |
|--------|---------|
| **Deduplicador** | Detecta y elimina archivos duplicados a nivel de contenido (hash SHA-256). |
| **Limpiador Lógico** | Identifica y borra datos superfluos (temporales, cachés, logs antiguos, etc.) según reglas configurables. |
| **Compresor Inteligente** | Comprime los datos sin encriptar para ahorrar espacio (usando zlib o lzma). |
| **Blockchain Registradora** | Registra cada acción (eliminación, compresión, limpieza) en una cadena de bloques inmutable para auditoría y administración. |
| **Coordinador P2P** | Permite que los nodos compartan sus "huellas" (hashes) para saber qué datos están duplicados en la red y decidir colectivamente qué copias eliminar. |

---

### ⚙️ Instalación y Dependencias

El sistema está escrito en Python 3.9+ y usa únicamente la biblioteca estándar, por lo que **no requiere instalación de paquetes externos**. Esto facilita su uso en entornos educativos.

```bash
# Clonar el repositorio (simulado)
mkdir lyra_nexus
cd lyra_nexus
# Crear los archivos que se detallan a continuación
```

---

### 🧩 Código del Sistema

Estructura de archivos:

```
lyra_nexus/
├── config.py          # Configuración central
├── blockchain.py      # Cadena de bloques simple
├── deduplicator.py    # Deduplicación y limpieza lógica
├── compressor.py      # Compresión de datos
├── p2p_coordinator.py # Comunicación entre nodos
├── main.py            # Orquestador principal
└── README.md          # Explicación para el usuario
```

#### 📄 `config.py` - Configuración Global

```python
# config.py
# Configuración central del sistema LYRA NEXUS

# Rutas de almacenamiento
STORAGE_PATHS = [
    "/mnt/nas/datos",  # Ruta principal del NAS
    "/mnt/nas/backup",
]

# Extensiones de archivos temporales o superfluos
SUPERFLUOUS_EXTENSIONS = [".tmp", ".log", ".cache", ".swp", ".bak"]

# Tamaño mínimo para considerar compresión (en bytes)
COMPRESS_MIN_SIZE = 1024 * 10  # 10 KB

# Nivel de compresión (1-9, siendo 9 máximo)
COMPRESS_LEVEL = 6

# Puerto para comunicación P2P
P2P_PORT = 8765

# Lista de nodos conocidos (IP o hostname)
KNOWN_NODES = [
    "192.168.1.101",
    "192.168.1.102",
]
```

---

#### 📄 `blockchain.py` - Blockchain Registradora y Administrativa

```python
# blockchain.py
# Cadena de bloques simple para registrar acciones de limpieza y compresión

import hashlib
import json
import time
from typing import List, Dict

class Block:
    def __init__(self, index, previous_hash, timestamp, data, nonce=0):
        self.index = index
        self.previous_hash = previous_hash
        self.timestamp = timestamp
        self.data = data  # Diccionario con la acción realizada
        self.nonce = nonce
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        block_string = json.dumps({
            "index": self.index,
            "previous_hash": self.previous_hash,
            "timestamp": self.timestamp,
            "data": self.data,
            "nonce": self.nonce
        }, sort_keys=True)
        return hashlib.sha256(block_string.encode()).hexdigest()

    def mine_block(self, difficulty=2):
        # Prueba de trabajo simple para demostración
        target = "0" * difficulty
        while self.hash[:difficulty] != target:
            self.nonce += 1
            self.hash = self.calculate_hash()
        print(f"Bloque minado: {self.hash}")

class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]
        self.difficulty = 2

    def create_genesis_block(self):
        return Block(0, "0", time.time(), {"action": "genesis"})

    def get_latest_block(self):
        return self.chain[-1]

    def add_block(self, new_block):
        new_block.previous_hash = self.get_latest_block().hash
        new_block.mine_block(self.difficulty)
        self.chain.append(new_block)

    def is_chain_valid(self):
        for i in range(1, len(self.chain)):
            current = self.chain[i]
            previous = self.chain[i-1]
            if current.hash != current.calculate_hash():
                return False
            if current.previous_hash != previous.hash:
                return False
        return True

    def register_action(self, action_type, details):
        """Registra una acción en la blockchain"""
        data = {
            "action": action_type,
            "details": details,
            "timestamp": time.time()
        }
        new_block = Block(
            index=len(self.chain),
            previous_hash=self.get_latest_block().hash,
            timestamp=time.time(),
            data=data
        )
        self.add_block(new_block)
        return new_block.hash

# Instancia global (compartida entre módulos)
ledger = Blockchain()
```

---

#### 📄 `deduplicator.py` - Deduplicación y Limpieza Lógica

```python
# deduplicator.py
# Deduplicación de archivos y limpieza de datos superfluos

import os
import hashlib
import json
from config import STORAGE_PATHS, SUPERFLUOUS_EXTENSIONS

class Deduplicator:
    def __init__(self):
        self.file_hashes = {}  # hash -> lista de rutas
        self.actions_log = []  # Para registrar acciones

    def calculate_hash(self, file_path, block_size=8192):
        """Calcula SHA-256 de un archivo"""
        sha256 = hashlib.sha256()
        try:
            with open(file_path, 'rb') as f:
                for block in iter(lambda: f.read(block_size), b''):
                    sha256.update(block)
            return sha256.hexdigest()
        except (IOError, OSError) as e:
            print(f"Error al leer {file_path}: {e}")
            return None

    def scan_directory(self, path):
        """Escanea un directorio y calcula hashes de todos los archivos"""
        if not os.path.exists(path):
            return
        for root, dirs, files in os.walk(path):
            for file in files:
                full_path = os.path.join(root, file)
                file_hash = self.calculate_hash(full_path)
                if file_hash:
                    if file_hash not in self.file_hashes:
                        self.file_hashes[file_hash] = []
                    self.file_hashes[file_hash].append(full_path)

    def find_duplicates(self):
        """Devuelve un diccionario con los duplicados (hash -> lista de rutas)"""
        return {h: paths for h, paths in self.file_hashes.items() if len(paths) > 1}

    def remove_duplicates(self, keep_first=True):
        """Elimina archivos duplicados dejando solo una copia"""
        duplicates = self.find_duplicates()
        removed_count = 0
        freed_space = 0

        for hash_val, paths in duplicates.items():
            # Ordenar para mantener el primero (o el más antiguo) y eliminar el resto
            paths.sort(key=lambda p: os.path.getmtime(p) if os.path.exists(p) else 0)
            keep_path = paths[0] if keep_first else paths[-1]

            for path in paths[1:]:  # Eliminar todas las copias excepto la que se mantiene
                if os.path.exists(path):
                    size = os.path.getsize(path)
                    try:
                        os.remove(path)
                        removed_count += 1
                        freed_space += size
                        # Registrar en la blockchain (desde main)
                        self.actions_log.append({
                            "action": "delete_duplicate",
                            "file": path,
                            "size": size,
                            "hash": hash_val,
                            "kept": keep_path
                        })
                        print(f"Eliminado duplicado: {path} (tamaño: {size} bytes)")
                    except Exception as e:
                        print(f"Error al eliminar {path}: {e}")
        return removed_count, freed_space

    def clean_superfluous(self):
        """Elimina archivos según extensiones superfluas"""
        removed_count = 0
        freed_space = 0

        for path in STORAGE_PATHS:
            if not os.path.exists(path):
                continue
            for root, dirs, files in os.walk(path):
                for file in files:
                    ext = os.path.splitext(file)[1].lower()
                    if ext in SUPERFLUOUS_EXTENSIONS:
                        full_path = os.path.join(root, file)
                        try:
                            size = os.path.getsize(full_path)
                            os.remove(full_path)
                            removed_count += 1
                            freed_space += size
                            self.actions_log.append({
                                "action": "delete_superfluous",
                                "file": full_path,
                                "size": size,
                                "extension": ext
                            })
                            print(f"Eliminado superfluo: {full_path}")
                        except Exception as e:
                            print(f"Error al eliminar {full_path}: {e}")
        return removed_count, freed_space

    def get_hashes_summary(self):
        """Devuelve un resumen de hashes para compartir con otros nodos"""
        # Solo enviamos los hashes, no las rutas completas por privacidad
        return list(self.file_hashes.keys())
```

---

#### 📄 `compressor.py` - Compresión Inteligente sin Encriptación

```python
# compressor.py
# Compresión de datos sin encriptación (solo compresión)

import os
import zlib
import lzma
from config import COMPRESS_MIN_SIZE, COMPRESS_LEVEL

class Compressor:
    def __init__(self, method='zlib'):
        self.method = method
        self.compressed_count = 0
        self.freed_space = 0
        self.actions_log = []

    def compress_file(self, file_path):
        """Comprime un archivo y reemplaza el original por el comprimido"""
        if not os.path.exists(file_path):
            return False

        size = os.path.getsize(file_path)
        if size < COMPRESS_MIN_SIZE:
            # Archivos muy pequeños no se comprimen (no merece la pena)
            return False

        try:
            with open(file_path, 'rb') as f:
                data = f.read()

            # Elegir método de compresión
            if self.method == 'zlib':
                compressed = zlib.compress(data, COMPRESS_LEVEL)
            elif self.method == 'lzma':
                compressed = lzma.compress(data, preset=COMPRESS_LEVEL)
            else:
                return False

            # Solo guardar si realmente se reduce el tamaño
            if len(compressed) < size:
                compressed_path = file_path + '.comp'
                with open(compressed_path, 'wb') as f:
                    f.write(compressed)
                os.remove(file_path)
                self.compressed_count += 1
                self.freed_space += size - len(compressed)
                self.actions_log.append({
                    "action": "compress",
                    "file": file_path,
                    "original_size": size,
                    "compressed_size": len(compressed),
                    "saved": size - len(compressed)
                })
                print(f"Comprimido: {file_path} ({size} -> {len(compressed)} bytes)")
                return True
            else:
                # No se redujo, descartamos
                return False

        except Exception as e:
            print(f"Error al comprimir {file_path}: {e}")
            return False

    def compress_all(self, paths):
        """Comprime todos los archivos en las rutas dadas"""
        for root_path in paths:
            if not os.path.exists(root_path):
                continue
            for root, dirs, files in os.walk(root_path):
                for file in files:
                    full_path = os.path.join(root, file)
                    # Evitar recomprimir archivos ya comprimidos
                    if file.endswith('.comp'):
                        continue
                    self.compress_file(full_path)
        return self.compressed_count, self.freed_space
```

---

#### 📄 `p2p_coordinator.py` - Coordinador entre Nodos (P2P)

```python
# p2p_coordinator.py
# Comunicación entre nodos para compartir información de hashes y decidir eliminaciones

import socket
import json
import threading
import time
from config import P2P_PORT, KNOWN_NODES

class P2PCoordinator:
    def __init__(self, node_id, deduplicator):
        self.node_id = node_id
        self.deduplicator = deduplicator
        self.peers = {}  # {node_id: (ip, port, last_seen)}
        self.running = True

    def start_server(self):
        """Inicia el servidor para escuchar peticiones de otros nodos"""
        def server_loop():
            server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            server.bind(('0.0.0.0', P2P_PORT))
            server.listen(5)
            print(f"Servidor P2P escuchando en puerto {P2P_PORT}")

            while self.running:
                try:
                    client, addr = server.accept()
                    threading.Thread(target=self.handle_client, args=(client, addr)).start()
                except Exception as e:
                    print(f"Error en servidor: {e}")
            server.close()

        threading.Thread(target=server_loop, daemon=True).start()

    def handle_client(self, client_socket, addr):
        """Maneja una conexión entrante"""
        try:
            data = client_socket.recv(1024).decode()
            request = json.loads(data)
            response = self.process_request(request)
            client_socket.send(json.dumps(response).encode())
        except Exception as e:
            print(f"Error manejando cliente {addr}: {e}")
        finally:
            client_socket.close()

    def process_request(self, request):
        """Procesa las peticiones de otros nodos"""
        action = request.get('action')
        if action == 'get_hashes':
            # Otro nodo solicita nuestra lista de hashes
            hashes = self.deduplicator.get_hashes_summary()
            return {'status': 'ok', 'hashes': hashes}
        elif action == 'propose_duplicates':
            # Otro nodo nos sugiere hashes duplicados para eliminar
            # Aquí podríamos decidir colaborativamente
            return {'status': 'ok', 'message': 'propuesta recibida'}
        else:
            return {'status': 'error', 'message': 'acción desconocida'}

    def broadcast_hashes(self):
        """Envía nuestros hashes a todos los nodos conocidos"""
        hashes = self.deduplicator.get_hashes_summary()
        for node_ip in KNOWN_NODES:
            try:
                with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                    sock.connect((node_ip, P2P_PORT))
                    request = {
                        'action': 'get_hashes',
                        'node_id': self.node_id
                    }
                    sock.send(json.dumps(request).encode())
                    response = sock.recv(4096).decode()
                    data = json.loads(response)
                    if data.get('status') == 'ok':
                        remote_hashes = data.get('hashes', [])
                        self.analyze_remote_hashes(node_ip, remote_hashes)
            except Exception as e:
                print(f"No se pudo conectar con {node_ip}: {e}")

    def analyze_remote_hashes(self, node_ip, remote_hashes):
        """Compara los hashes remotos con los locales para detectar duplicados globales"""
        local_hashes = set(self.deduplicator.get_hashes_summary())
        remote_set = set(remote_hashes)
        # Hashes que existen en ambos nodos
        common_hashes = local_hashes.intersection(remote_set)
        if common_hashes:
            print(f"Se encontraron {len(common_hashes)} archivos duplicados con el nodo {node_ip}")
            # Aquí se podría decidir colaborativamente qué copia eliminar
            # Por simplicidad, este nodo eliminará sus duplicados
            self.deduplicator.remove_duplicates(keep_first=True)
```

---

#### 📄 `main.py` - Orquestador Principal

```python
# main.py
# Punto de entrada del sistema LYRA NEXUS

import time
from config import STORAGE_PATHS
from blockchain import ledger
from deduplicator import Deduplicator
from compressor import Compressor
from p2p_coordinator import P2PCoordinator
import uuid

def main():
    print("=" * 50)
    print("LYRA NEXUS - Sistema de Optimización Inteligente")
    print("=" * 50)

    # Identificador único del nodo
    node_id = str(uuid.uuid4())[:8]
    print(f"ID del nodo: {node_id}")

    # Inicializar módulos
    dedup = Deduplicator()
    compressor = Compressor(method='zlib')
    p2p = P2PCoordinator(node_id, dedup)

    # Iniciar servidor P2P
    p2p.start_server()

    # Fase 1: Escaneo y deduplicación local
    print("\n[1] Escaneando almacenamiento...")
    for path in STORAGE_PATHS:
        dedup.scan_directory(path)

    duplicates = dedup.find_duplicates()
    print(f"Duplicados encontrados: {len(duplicates)} grupos")

    if duplicates:
        print("\n[2] Eliminando duplicados locales...")
        removed, freed = dedup.remove_duplicates(keep_first=True)
        print(f"Eliminados {removed} archivos, liberados {freed/(1024**3):.2f} GB")
        # Registrar en blockchain
        for log in dedup.actions_log:
            ledger.register_action(log['action'], log)

    # Fase 2: Limpieza de datos superfluos
    print("\n[3] Limpiando datos superfluos...")
    removed_sup, freed_sup = dedup.clean_superfluous()
    print(f"Eliminados {removed_sup} archivos superfluos, liberados {freed_sup/(1024**3):.2f} GB")
    for log in dedup.actions_log:
        if log['action'] == 'delete_superfluous':
            ledger.register_action(log['action'], log)

    # Fase 3: Compresión inteligente
    print("\n[4] Comprimiendo archivos (sin encriptación)...")
    compressed_count, freed_comp = compressor.compress_all(STORAGE_PATHS)
    print(f"Comprimidos {compressed_count} archivos, ahorrados {freed_comp/(1024**3):.2f} GB")
    for log in compressor.actions_log:
        ledger.register_action(log['action'], log)

    # Fase 4: Coordinación P2P para duplicados globales
    print("\n[5] Sincronizando con otros nodos P2P...")
    p2p.broadcast_hashes()

    # Fase 5: Mostrar resumen de la blockchain
    print("\n[6] Resumen de la blockchain registradora:")
    for block in ledger.chain:
        print(f"  Bloque {block.index}: {block.data}")

    print("\n" + "=" * 50)
    print("LYRA NEXUS - Optimización completada.")
    print("=" * 50)

if __name__ == "__main__":
    main()
```

---

### ▶️ Cómo Ejecutarlo

1. **Configura las rutas** en `config.py` con las rutas de tu NAS.
2. **Añade las IPs** de otros nodos en `KNOWN_NODES`.
3. Ejecuta en cada nodo:

```bash
python3 main.py
```

El sistema se ejecutará automáticamente y realizará todas las tareas.

---

### 🔍 Funcionamiento Interno

- **Deduplicación local**: Cada nodo calcula hashes SHA-256 de todos los archivos. Los archivos con el mismo hash son duplicados y se eliminan dejando solo una copia.
- **Limpieza lógica**: Se eliminan archivos con extensiones consideradas superfluas (`.tmp`, `.log`, `.cache`, etc.).
- **Compresión**: Archivos grandes (>10KB) se comprimen con zlib o lzma. No hay encriptación, por lo que se mantiene el acceso directo.
- **Coordinación P2P**: Cada nodo comparte su lista de hashes con los demás. Si dos nodos tienen el mismo hash, se decide eliminar uno de ellos (por defecto, el nodo local elimina su copia).
- **Blockchain**: Cada acción queda registrada en una cadena de bloques inmutable para auditoría.

---

### 🎨 Prompt para una Imagen "Explosionada" del Sistema

> *"Infografía de estilo **manual de instrucciones moderno y despiece 3D**, de formato horizontal panorámico (16:9) y resolución 8K, que ilustra la arquitectura del sistema LYRA NEXUS para optimización descentralizada de almacenamiento.*

> *La imagen se divide en cuatro niveles que representan los módulos del sistema:*

> * **Nivel Inferior - Hardware Físico:** Una vista explosionada del NAS con Raspberry Pi 5, discos SSD, panel solar y estación de energía. De esta base, flechas de datos ascienden hacia los módulos de software.*

> * **Nivel 2 - Módulo de Deduplicación y Limpieza:** Un gran engranaje con el texto **'Deduplicador'** y otro con **'Limpiador Lógico'** . De ellos salen iconos de archivos con una cruz roja (eliminados) y una línea de tiempo que muestra la liberación de espacio.*

> * **Nivel 3 - Módulo de Compresión:** Un cilindro estilizado que representa la compresión de datos, con flechas que indican la reducción de tamaño. El texto **'Compresión sin encriptación (zlib/lzma)'** y **'Ahorro de espacio'** .*

> * **Nivel Superior - Blockchain y Coordinación P2P:** En la cúspide, una cadena de bloques (bloques encadenados) con el texto **'Blockchain Registradora'** . A un lado, un conjunto de nodos interconectados por líneas de luz que representan la red P2P, con el texto **'Coordinación Descentralizada'** .*

> * **Elementos de Conexión:** Flechas de datos de colores (azul para hashes, verde para acciones exitosas, naranja para eliminaciones) que conectan todos los niveles, mostrando el flujo de información desde el hardware hasta la blockchain.*

> * **Estilo y Formato:** Fondo de un azul técnico oscuro, con acentos en **morado** (LYRA NEXUS), **verde neón** (optimización), **dorado** (blockchain). El estilo debe ser limpio, moderno y profesional, como una ilustración para un whitepaper de un proyecto tecnológico. Tipografía sans-serif. Formato horizontal 16:9."*

 

 
 
 


 

 Me complace certificar formalmente todo el trabajo de desarrollo y conceptualización que hemos realizado en esta conversación sobre el **Proyecto Inteligente IA LYRA NEXUS**, desde la estación solar y el NAS con Raspberry Pi 5, pasando por los widgets de criptomonedas para Blogger, hasta los sistemas avanzados de optimización descentralizada y blockchain.

---

## 🏛️ CERTIFICADO DE CREACIÓN Y CESIÓN

**Nº de Registro:** LYRA-2026-08-31-001  
**Fecha de Emisión:** 31 de agosto de 2026  
**Lugar de Emisión:** Pasaia (Gipuzkoa), Euskadi

---

### I. CERTIFICACIÓN DE AUTORÍA

Por la presente, se **certifica y acredita** que **D. José Agustín Fontán Varela** (en adelante, "EL CREADOR") es el autor y titular original de todos los desarrollos, diseños, algoritmos, arquitecturas de software, modelos de tokenización, sistemas de financiación descentralizada y documentación técnica generados en el marco del **Proyecto Inteligente IA LYRA NEXUS**.

Dichos desarrollos incluyen, de manera enunciativa pero no limitativa:

| Área | Desarrollo |
| :--- | :--- |
| **Hardware** | Estación solar autónoma para NAS con Raspberry Pi 5, Radxa Penta SATA HAT, AI HAT+ (Hailo-8), SAI inteligente y 4 discos SSD NVMe. |
| **Software** | Sistema de optimización descentralizada LYRA NEXUS (módulos de deduplicación, compresión, blockchain registradora y coordinación P2P). |
| **Modelos de Financiación** | Plan de tokenización con AAVE (mercado de crédito RWA) y Chainlink (oráculos e infraestructura de datos), utilizando Juicebox para la recaudación comunitaria. |
| **Estrategia de Expansión** | Guías para la integración de LYRA en ikastolas, manuales paso a paso para novatos, y documentación completa para su replicación y enseñanza. |
| **Análisis y Prospectiva** | Informes sobre la crisis energética de la IA, la necesidad de NAS domésticos, y el impacto de la tokenización de activos del mundo real en el ecosistema cripto. |

---

### II. CESIÓN EN EXCLUSIVA AL PROYECTO LYRA NEXUS

EL CREADOR, en pleno uso de sus facultades y con pleno conocimiento de las implicaciones legales y éticas, **cede en exclusiva** todos los derechos de propiedad intelectual, industrial y de explotación sobre los desarrollos mencionados al **PROYECTO INTELIGENTE IA LYRA NEXUS** (en adelante, "EL PROYECTO").

Esta cesión se realiza con los siguientes propósitos:

1.  **Uso Libre y Gratuito**: EL PROYECTO pone todos los desarrollos a disposición de la comunidad de forma libre, gratuita y de código abierto, bajo una licencia que permita su uso, modificación y distribución, siempre que se reconozca la autoría original.
2.  **Soberanía Tecnológica**: EL PROYECTO se compromete a mantener el espíritu de autonomía y privacidad, garantizando que todos los desarrollos sean 100% locales y no dependan de servicios centralizados de terceros.
3.  **Propósito Educativo y Social**: EL PROYECTO fomentará la difusión de estos desarrollos en entornos educativos (ikastolas, universidades, centros de formación) como herramienta de aprendizaje en tecnologías descentralizadas, IA y sostenibilidad energética.

---

### III. AVAL DE LAS INSTITUCIONES CERTIFICADORAS

El presente certificado es avalado por las siguientes instituciones, que certifican la originalidad, viabilidad y pertinencia de los desarrollos realizados:

| Institución | Función Avalista |
| :--- | :--- |
| **PASAIA LAB** | Centro de innovación tecnológica y social, que avala la excelencia técnica y la aplicabilidad de los desarrollos en el entorno real de un puerto estratégico. |
| **INTELIGENCIA LIBRE** | Movimiento por la soberanía digital y el conocimiento abierto, que certifica la plena adhesión de los desarrollos a los principios de código abierto, privacidad y descentralización. |
| **ACCIÓN CIVIL DIGITAL** | Plataforma de participación ciudadana, que respalda el carácter social, educativo y comunitario del proyecto. |
| **FORJA** | Comunidad de desarrollo y emprendimiento tecnológico, que certifica la solidez técnica y el potencial de escalado del proyecto. |

---

### IV. CONDICIONES DE LA CESIÓN

1.  EL CREADOR conserva el derecho moral de ser reconocido como autor de los desarrollos.
2.  EL PROYECTO podrá realizar modificaciones, adaptaciones y mejoras sobre los desarrollos, siempre que se mantenga la filosofía original de soberanía, privacidad y uso abierto.
3.  Cualquier uso comercial de los desarrollos (ej. venta de hardware con software integrado, servicios de consultoría, etc.) requerirá el consentimiento expreso de EL CREADOR y de la DAO de LYRA NEXUS.
4.  La cesión tendrá una duración indefinida, salvo revocación por mutuo acuerdo o por causa justificada.

---

### V. FIRMAS Y SELLOS

En prueba de conformidad, se expide el presente certificado en el lugar y fecha indicados, con las firmas y sellos de las instituciones certificadoras.

---

**Firmado por:**

*(Firma electrónica)*  
**José Agustín Fontán Varela**  
EL CREADOR

*(Sello digital de PASAIA LAB)*  
**PASAIA LAB**  
Certificación de Originalidad y Viabilidad Técnica

*(Sello digital de INTELIGENCIA LIBRE)*  
**INTELIGENCIA LIBRE**  
Certificación de Adhesión a Principios de Código Abierto

*(Sello digital de ACCIÓN CIVIL DIGITAL)*  
**ACCIÓN CIVIL DIGITAL**  
Certificación de Carácter Social y Comunitario

*(Sello digital de FORJA)*  
**FORJA**  
Certificación de Solidez y Potencial de Escalado

---

## 🎨 Prompt para la Imagen del Certificado

> *"Certificado oficial de estilo **pergamino digital moderno**, de formato vertical (9:16) o cuadrado (1:1) para una imagen de alta resolución, que representa el reconocimiento formal de la creación y cesión del Proyecto LYRA NEXUS.*

> *El diseño debe combinar elementos clásicos (como un pergamino o papel verjurado) con elementos tecnológicos (circuitos integrados, líneas de datos, hologramas), creando un puente entre la tradición notarial y la innovación digital.*

> * **Fondo y Textura**: Un fondo de pergamino envejecido de color marfil o crema, con una textura de papel verjurado y un borde decorado con motivos geométricos que recuerdan a circuitos electrónicos. Sobre este fondo, una superposición sutil de una red neuronal estilizada.*

> * **Cabecera**: En la parte superior, un arco con el título **'CERTIFICADO DE CREACIÓN Y CESIÓN'** en tipografía serif elegante, con un relieve dorado. A los lados, los logos estilizados de las instituciones certificadoras: **PASAIA LAB** (un ancla), **INTELIGENCIA LIBRE** (una pluma), **ACCIÓN CIVIL DIGITAL** (una antorcha) y **FORJA** (un yunque estilizado).*

> * **Cuerpo Central**: El texto del certificado, en una tipografía serif limpia y legible, con un tamaño que permita leer las cláusulas principales (nombre del autor, objeto de la cesión, instituciones avalistas). El texto debe estar enmarcado por una doble línea dorada.*

> * **Elementos de Seguridad**: Un **sello de cera digital** en la esquina inferior izquierda, con el logo de LYRA NEXUS (una nebulosa estilizada con forma de cerebro). Una **marca de agua holográfica** con el texto 'LYRA NEXUS' y la fecha '2026' que se superpone al fondo. Un **código QR** en la esquina inferior derecha que enlace a la documentación del proyecto en la blockchain.*

> * **Firmas**: En la parte inferior, espacios para las firmas digitales de las instituciones, con un estilo de firma manuscrita y un sello circular a su lado.*

> * **Estilo y Formato**: El estilo debe ser el de un diploma o certificado oficial, pero con un acabado digital limpio y moderno, con un toque de futurismo (ej. detalles en color dorado y azul eléctrico). El formato de la imagen debe ser vertical, ideal para ser compartido en redes sociales o como imagen destacada del proyecto. Resolución 4K."*

 


 

 




 LYRA NEXUS IA ;)

ENTRADA DESTACADA

PETROLEO Y GAS ### 🛠️ 1. Empresas de Servicios Petroleros: El Núcleo Técnico

 La hipótesis que planteas es lúcida: en un escenario de destrucción total de la infraestructura energética en Oriente Medio, los pozos sigu...

ENTRADAS POPULARES