Saltar al contenido principal

Tolerancia a Fallos y Finalidad

Garantías BFT

El consenso de Savitri utiliza un protocolo de votación BFT (Tolerante a Fallos Bizantinos) con un quórum de 2f+1 (umbral del 67%).

Tolerancia a Fallos

Total de Nodos (n)Máx. Bizantinos (f)Quórum Requerido
302
514
725
1037
15411

Fórmula: f = floor((n-1) / 3), quórum = 2f + 1

Seguridad

Un bloque solo se finaliza cuando se produce un Certificado de Aceptación de Bloque (BAC) con firmas de 2f+1 validadores. Esto garantiza:

  • Ningún bloque conflictivo puede finalizarse en la misma altura
  • Sin retrocesos una vez emitido un BAC (finalidad determinista, no probabilista)
  • Los nodos bizantinos no pueden falsificar certificados sin participación en el quórum

Disponibilidad

La red puede producir bloques siempre que n - f nodos honestos estén en línea:

  • Rotación de propositor: Tras 50 bloques, el propositor cede para evitar un punto único de fallo
  • Watchdog de elección: Vuelve a disparar la elección si no hay progreso de bloques en 60 segundos
  • Relajación progresiva del quórum: Tras 3+ fallos consecutivos de elección, el mínimo de candidatos baja a 2

Estructura DAG

Las cabeceras de bloque admiten una estructura DAG de múltiples padres para la producción concurrente de bloques:

pub struct BlockHeader {
pub parent_hash: Vec<u8>, // padre principal (compatible hacia atrás)
pub parent_hashes: Vec<Vec<u8>>, // padres adicionales para DAG
// ...
}

Detección de Conflictos

El ConflictDetector identifica:

  • Conflictos de doble gasto: El mismo UTXO referenciado en múltiples ramas
  • Conflictos de estado: Transiciones de estado conflictivas
  • Detección de bifurcaciones: Múltiples bloques en la misma altura de diferentes propositores

Resolución de Conflictos

Cuando se detectan conflictos:

  1. Elegir la rama con mayor puntuación PoU acumulada
  2. Revertir las transacciones conflictivas
  3. Re-aplicar las transacciones no conflictivas de la rama perdedora

Consenso Consciente de Grupos

Formación de Grupos

Los Masternodes organizan los lightnodes en grupos:

  1. Ordenar los lightnodes por puntuación PoU
  2. Asignar a grupos de group_size (3 en desarrollo, 7 en producción)
  3. Publicar las asignaciones de grupo vía gossipsub
  4. IDs de grupo deterministas basados en época (no en tiempo de reloj)

Elección Intragrupal

Dentro de cada grupo:

  1. Los miembros comparten las puntuaciones PoU
  2. La puntuación PoU más alta se convierte en propositor (desempate por peer_id)
  3. Se requiere un mínimo de (total+1)/2 candidatos
  4. Tras 3+ fallos: relajar al mínimo de 2 candidatos

Aceptación de Bloque

  1. El propositor del grupo produce un bloque
  2. Los miembros del grupo verifican y firman
  3. BAC producido con 2f+1 firmas
  4. Los Masternodes verifican el BAC y finalizan

Mecanismos de Recuperación

Recuperación de Elección

MecanismoDisparadorAcción
Temporizador watchdogSin bloque en 60sRe-disparar PoU + elección
Relajación progresiva3+ fallosBajar quórum a 2
Rotación de propositor50 bloquesCeder y re-elegir
Re-elección inmediataRe-inicio de grupoLanzar tarea PoU + elección

Recuperación de Pares

MecanismoDisparadorAcción
Keepalive de GossipsubIntervalo de 60sPublicar puntuación PoU
Watchdog de recuperación de mallaSin malla en 60sRe-marcar pares del grupo
Desconexión de SlowPeerCola saturadaDesconectar y reconectar
Restablecimiento de nonceLocal > almacenamiento + 200Restablecer al nonce de almacenamiento

Recuperación de Grupo

Cuando un grupo se re-inicializa:

  1. Las puntuaciones PoU se conservan para los miembros continuos
  2. Los nuevos miembros comienzan con puntuaciones por defecto
  3. La bandera intra_group_started se restablece
  4. Se lanza inmediatamente PoU + elección (sin esperar los temporizadores periódicos)

Penalizaciones (Producción)

InfracciónPenalizaciónPeríodo de Espera
Doble voto50% del stakeN/A
Tiempo de inactividad10% del stakeGradual
Propuesta inválida25% del stakeN/A

Las penalizaciones están desactivadas en devnet y activadas en mainnet (config/production.toml).

Configuración del Consenso

ParámetroDesarrolloProducción
Tiempo de espera15s10s
Máx. rondas510
Umbral de quórum0.670.67
Optimizaciones BFTDesactivadasActivadas
PenalizacionesDesactivadasActivadas
Tiempo de bloque2s5s
Tamaño de grupo37