Saltar al contenido
Finance & Banking
Evolution Program
Inicio / modules / 18-blockchain-y-dlt-para-instituciones-financieras / solutions

Solución de referencia — Laboratorio 1: cadena didáctica

Material docente.

Por qué el encadenamiento no basta

El encadenamiento hace que manipular sin recalcular sea detectable. No hace nada contra recalcular todo.

manipular la tx del bloque 40
  → cambia la raíz de Merkle del 40
  → cambia el resumen del 40
  → el bloque 41 apunta a un resumen que ya no existe
  → DETECTADO en la validación

recalcular los bloques 40 a 100
  → todos los resúmenes vuelven a encajar
  → la validación pasa
  → NO detectado

La inmutabilidad viene de el coste de rehacer más que otros tengan la versión original. Ninguna de las dos la aporta el encadenamiento.

La prueba que el laboratorio busca

def test_reescribir_la_cadena_entera_no_se_detecta(cadena):
    cadena.bloques[40].transacciones[0].importe = 999_999
    assert not cadena.validar()          # se detecta

    cadena.recalcular_desde(40)
    assert cadena.validar()              # ya NO se detecta

Una prueba que solo comprueba la primera afirmación deja al estudiante con la idea equivocada. La segunda es la que enseña.

Medición del coste

sin coste de producción
  rehacer 60 bloques:        0,004 s

con coste de producción (dificultad didáctica)
  rehacer 60 bloques:       18,3 s

  → el coste no hace imposible la reescritura:
    la hace CARA, y esa es toda la diferencia

En una red real, el coste se compara con el beneficio del ataque. Es el mismo razonamiento de la clase 6.

El número de orden

def aplicar(self, tx: Transaccion) -> None:
    esperado = self.ordenes.get(tx.origen, 0)
    if tx.orden != esperado:
        raise TransaccionInvalida(f"orden {tx.orden}, esperado {esperado}")
    self.ordenes[tx.origen] = esperado + 1

Sin esas tres líneas, la misma transacción firmada se reenvía y se ejecuta dos veces. Es la idempotencia de la Parte 17, clase 8, resuelta en el protocolo.

Instantáneas

cada 1 000 bloques se guarda el estado completo
reconstruir el estado del bloque 3 456:
  cargar la instantánea del 3 000
  reejecutar 456 bloques
  → coste acotado y previsible

Sin instantáneas, reconstruir un estado antiguo exige reejecutar desde el génesis, y ese coste crece sin límite (clase 4).

Errores que se penalizan

Error Por qué
Probar solo la manipulación detectada Deja la idea equivocada
Validar sin recalcular la raíz La manipulación pasa
Sin número de orden La transacción se repite
Sin instantáneas El coste de consulta histórica no está acotado
Presentar la cadena como segura Es didáctica y hay que decirlo

Límites