Saltar al contenido principal

Arquitectura

Almena Network sigue una arquitectura modular donde cada componente tiene una responsabilidad clara y se comunica a través de interfaces bien definidas.

Visión General del Sistema

┌─────────────────────────────────────────────────────┐
│ Dispositivos de Usuario │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────┐ │
│ │ Wallet │ │ Desktop │ │ CLI │ │
│ │(Titulares)│ │ (Emisores/ │ │ (Terminal) │ │
│ │ │ │ Solicitantes)│ │ │ │
│ └────┬─────┘ └──────┬───────┘ └───────┬───────┘ │
│ │ │ │ │
│ │ ┌─────┴─────┐ │ │
│ │ │ Daemon │◄───────────┘ │
│ │ │ (almenad) │ │
│ │ │ gRPC + │ │
│ │ │ libp2p │ │
│ │ └─────┬─────┘ │
└───────│────────────────│─────────────────────────────┘
│ │
│ │ P2P (mDNS, TCP+Noise+Yamux)
│ │
│ ┌────┴────┐
│ │ Otros │
│ │ Daemons │
│ └─────────┘

│ (futuro: DIDComm v2)

┌────┴────┐
│Mediador │
│(planeado)│
└─────────┘

Componentes

Daemon (almenad)

El daemon es el servicio en segundo plano principal que se ejecuta en cada nodo. Es el único componente que participa en la red P2P.

Responsabilidades:

  • Exponer API gRPC para clientes locales (desktop, CLI)
  • Gestionar conexiones P2P vía libp2p
  • Descubrir peers en la red local (mDNS)
  • Proporcionar datos de geolocalización para visualización de red

Tecnología: Rust, tonic 0.12, libp2p 0.56, tokio

Endpoints RPC actuales: Ping, GetVersion, GetSystemInfo, GetGeolocation, ListPeers

Desktop

La aplicación de escritorio es una consola de administración diseñada para Emisores (entidades que emiten credenciales) y Solicitantes (entidades que solicitan presentaciones de credenciales).

Responsabilidades:

  • Autenticar usuarios mediante código QR
  • Visualizar la red P2P en un mapa mundial interactivo
  • Controlar el ciclo de vida del daemon (iniciar/detener)
  • Proporcionar interfaz de gestión de organizaciones

Tecnología: Tauri v2, React 19, TypeScript, tonic (cliente gRPC Rust)

Arquitectura: El backend Rust de Tauri actúa como puente entre el frontend React y la API gRPC del daemon. Los componentes del frontend llaman comandos Tauri vía invoke(), que a su vez hacen llamadas gRPC al daemon.

Wallet

La wallet es una aplicación mobile-first para Titulares — individuos que poseen y gestionan su identidad descentralizada.

Responsabilidades:

  • Crear y gestionar identidades descentralizadas (DIDs)
  • Almacenar claves privadas de forma segura en el llavero del SO
  • Mostrar códigos QR de identidad para autenticación

Tecnología: Tauri v2, React 19, TypeScript

Arquitectura: Similar a Desktop pero optimizada para un viewport móvil de 390×844. Actualmente tiene un backend Rust mínimo (sin cliente gRPC aún).

CLI

El CLI proporciona una interfaz de terminal para gestión y monitoreo del daemon.

Responsabilidades:

  • Iniciar, detener y hacer ping al daemon
  • Mostrar estado del daemon en tiempo real
  • Proporcionar una alternativa basada en texto a la app de escritorio

Tecnología: Rust, ratatui 0.29, crossterm 0.28, tonic (cliente gRPC)

Patrones de Comunicación

Comunicación Local (gRPC)

Desktop, wallet y CLI se comunican con el daemon vía gRPC en la máquina local:

Cliente (Desktop/CLI) ──gRPC──► Daemon ([::1]:50051)

El archivo proto en daemon/proto/almena/daemon/v1/service.proto es la fuente única de verdad. Los clientes copian y generan código desde este archivo.

Comunicación P2P (libp2p)

Los daemons se descubren y comunican entre sí sobre la red P2P:

  • Transporte: TCP
  • Cifrado: Protocolo Noise
  • Multiplexación: Yamux
  • Descubrimiento: mDNS (solo LAN, actualmente)

Cada daemon mantiene un PeerStore — un mapa thread-safe de peers descubiertos con su estado de conexión.

Almacenamiento de Datos

Directorios de Plataforma

Cada módulo almacena datos en ubicaciones específicas de cada plataforma:

MódulomacOSLinux
Daemon~/Library/Application Support/network.almena.daemon~/.local/share/network.almena.daemon
CLI~/Library/Application Support/network.almena.cli~/.local/share/network.almena.cli

En modo desarrollo, todos los módulos usan un directorio local ./workspace/.

Modelo de Seguridad

  • Claves privadas se almacenan en el llavero del SO (nunca en archivos de texto plano)
  • Criptografía: Ed25519 (firma), X25519 (acuerdo de claves), A256GCM (cifrado)
  • Derivación de claves: Mnemónico BIP39 + derivación jerárquica BIP32
  • Cifrado de red: TLS 1.2+ para tráfico externo, protocolo Noise para P2P

Sistema de Diseño

Todas las aplicaciones frontend (desktop y wallet) comparten un sistema de diseño glassmorphism:

TokenValor
Color primario#FB923C (naranja)
Color secundario#8B5CF6 (violeta)
Fondo#0c0a09 (oscuro profundo)
Efecto glassrgba(255,255,255,0.05) + backdrop-filter: blur(12px)
Border radius8–12px
Espaciado baseunidad de 8px
Transiciones200–250ms ease-out