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.
- 1Escenarios
- 2Safety
- 3Liveness
- 4Latencia
- 5Reporte
Antes de empezar
- Node.js 20 o superior.
- Conocer safety y liveness.
Pasos
Paso 1Ejecutar escenarios
Comparar señales sin atribuirlas a una implementación real.
Simulación node tools/labs/consensus-benchmark/simulate.mjsComprueba
- — 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 .
# 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.[
{ "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 }
]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 | Qué hacer |
|---|---|---|
| Escenario no progresa | commits quedó en cero. | Conserva el fallo como pérdida de liveness; no borres el escenario. |