¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Prueba de trabajo y minado

Después de esta lección: Puedo explicar por qué minar un bloque cuesta mucho trabajo y comprobarlo cuesta muy poco.

Lección de 60 min2 comandosLaboratorio de blockchain: una cadena de juguete en Python para leer, romper, minar y firmar

Añadir un bloque cuesta trabajo y comprobarlo no

La prueba de trabajo es una regla que obliga a hacer muchos intentos para añadir un bloque. Comprobar que se hicieron cuesta un solo hash.

Así, cambiar un bloque antiguo ya no es tachar un apunte. Hay que repetir ese trabajo para ese bloque y para los siguientes. Esta lección te deja medirlo.

Al final de esta lección

Nota

Puedo explicar por qué minar un bloque cuesta mucho trabajo y comprobarlo cuesta muy poco.

Palabras clave

PalabraQué significaEjemplo
Nonceun número que se cambia hasta que el hash cumple la regla834
Dificultadcuántos ceros seguidos debe tener el hash al principio
Minarprobar nonces uno a uno hasta que el hash cumple
Prueba de trabajoel nonce que demuestra que se hicieron los intentos
Intentocalcular un hash con un nonce

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un hash con ceros solo se halla probando

Un hash parece un número al azar. No hay forma de elegir unos datos para que su hash empiece por ceros.

Solo puedes probar. Añades al bloque un número, el nonce, calculas el hash, y si no cumple, cambias el nonce y repites. Cada cifra hexadecimal que exiges multiplica por 16 los intentos medios.

Ejemplo: intentos del laboratorio según la dificultad

DificultadIntentos mediosIntentos del laboratorioHash (inicio)
11615053b25815c28
2256835007f84c997a5
34096799200099b1fa581
4655361090280000a629fed9

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Qué imprime el laboratorio y en qué idioma

El script imprime en inglés: "difficulty", "nonce", "tries" y "hash". Los intentos medios son un promedio. Lo que ves en cada ejecución es suerte, aunque en el laboratorio siempre sale lo mismo.

Mira cómo sube la columna de intentos al pasar de una dificultad a la siguiente.

Mina el mismo bloque con cuatro dificultades

Comando
docker exec jupyter python3 steps/mine.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comprobar el resultado cuesta un solo hash

Quien recibe un bloque minado no repite los intentos. Calcula un hash, el del bloque con su nonce, y mira si empieza por los ceros pedidos.

Esa diferencia es la idea central: minar es caro y comprobar es barato. Todo el mundo puede comprobar, aunque pocos hayan minado.

Mina un texto y comprueba el resultado

Código: python
import hashlib

texto = "Pedido 17"
for dificultad in (1, 2, 3):
    objetivo = "0" * dificultad
    nonce = 0
    while not hashlib.sha256((texto + str(nonce)).encode()).hexdigest().startswith(objetivo):
        nonce = nonce + 1
    print("dificultad", dificultad, "nonce", nonce, "intentos", nonce + 1)

# Comprobar ese último resultado cuesta un solo hash.
hash_final = hashlib.sha256((texto + str(nonce)).encode()).hexdigest()
print("hash comprobado:", hash_final[:8], "empieza por ceros:", hash_final.startswith("000"))
# Cambia el texto por "Pedido 18" y compara los intentos.

Un error frecuente

Advertencia

Mucha gente cree que minar es resolver un problema matemático muy listo. No es así. Es probar números uno a uno, sin ningún atajo. Solo cuentan la suerte y la velocidad para calcular hashes.

Rehacer un bloque obliga a minar los siguientes

Si cambias un dato antiguo, su hash cambia y ya no cumple la dificultad. Tienes que minarlo otra vez.

Pero entonces el bloque siguiente guarda un hash anterior que ya no existe. Hay que minarlo también, y así hasta el final. Cuantos más bloques haya detrás, más caro sale.

Cambia un importe y falsea el hash

Comando
docker exec jupyter python3 steps/tamper.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos

En el cuaderno del laboratorio mina el mismo bloque con dificultad 5. Calcula cuánto tarda y compáralo con la dificultad 4.

Antes de ejecutar, escribe cuántas veces más esperas que tarde. Luego compara con lo que mides.

Sobre este laboratorio y su código: Laboratorio de blockchain: una cadena de juguete en Python para leer, romper, minar y firmar

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.