Saltar al contenido
TrautsLablab

Fixture determinista

Banco de consenso BFT

Separar safety, liveness, recuperación y latencia en escenarios controlados.

Duración
30–45 min
Nivel
Intermedio BFT
Pasos
1
Versión
2.0.44-alpha.4

Modelo mental

Una mediana menor no compensa una violación de safety; las métricas necesitan semántica y condiciones.

  1. 1Escenarios
  2. 2Safety
  3. 3Liveness
  4. 4Latencia
  5. 5Reporte

Antes de empezar

  • Node.js 20 o superior.
  • Conocer safety y liveness.

Pasos

  1. Paso 1Ejecutar escenarios

    Comparar señales sin atribuirlas a una implementación real.

    Simulación
    node tools/labs/consensus-benchmark/simulate.mjs

    Comprueba

    • — Safety violations=0.
    • — Todos recuperan liveness.
    • — La salida declara fixture pedagógico.

    Evidencia esperada

    JSON por escenario.

El código del laboratorio

Estos son los archivos que ejecutan los pasos, tal como están en el repositorio .

tools/labs/consensus-benchmark/runbook.md
# Consensus benchmark fixture

Version: `2.0.44-alpha.4`

Run `node tools/labs/consensus-benchmark/simulate.mjs`. The fixture compares recovery and latency signals under three deterministic scenarios. It is a pedagogy harness, not a performance claim about HotStuff or any production implementation.

Record safety violations, committed views, recovery views and median latency. No network sockets or external nodes are used.
tools/labs/consensus-benchmark/scenarios.json
[
  { "name": "healthy", "views": 3, "commits": 3, "latenciesMs": [42, 46, 44], "safetyViolations": 0 },
  { "name": "byzantine-leader", "views": 5, "commits": 2, "latenciesMs": [91, 86], "safetyViolations": 0 },
  { "name": "packet-loss", "views": 6, "commits": 2, "latenciesMs": [128, 119], "safetyViolations": 0 }
]
tools/labs/consensus-benchmark/simulate.mjs
import { readFileSync } from 'node:fs';

const scenarios = JSON.parse(readFileSync(new URL('./scenarios.json', import.meta.url), 'utf8'));
const report = scenarios.map((scenario) => ({
  ...scenario,
  medianLatencyMs: [...scenario.latenciesMs].sort((a, b) => a - b)[Math.floor(scenario.latenciesMs.length / 2)],
  recoveryViews: scenario.views - scenario.commits,
  live: scenario.commits > 0,
}));
const summary = {
  fixture: 'pedagogical-not-a-protocol-benchmark',
  safetyPreserved: report.every((scenario) => scenario.safetyViolations === 0),
  livenessRecovered: report.every((scenario) => scenario.live),
  scenarios: report,
};
console.log(JSON.stringify(summary, null, 2));
if (!summary.safetyPreserved || !summary.livenessRecovered) process.exit(1);

Criterios de aceptación

  • El script pasa.
  • Safety y liveness se reportan por separado.
  • No se presenta la latencia como benchmark real.

Limpieza

Limpiar: No se genera estado persistente.

Si algo falla

Síntoma, causa probable y cómo corregirlo
SíntomaCausaQué hacer
Escenario no progresacommits quedó en cero.Conserva el fallo como pérdida de liveness; no borres el escenario.