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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Nonce | un número que se cambia hasta que el hash cumple la regla | 834 |
| Dificultad | cuántos ceros seguidos debe tener el hash al principio | |
| Minar | probar nonces uno a uno hasta que el hash cumple | |
| Prueba de trabajo | el nonce que demuestra que se hicieron los intentos | |
| Intento | calcular 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
| Dificultad | Intentos medios | Intentos del laboratorio | Hash (inicio) |
|---|---|---|---|
| 1 | 16 | 15 | 053b25815c28 |
| 2 | 256 | 835 | 007f84c997a5 |
| 3 | 4096 | 7992 | 00099b1fa581 |
| 4 | 65536 | 109028 | 0000a629fed9 |
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
docker exec jupyter python3 steps/mine.pySe 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
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
docker exec jupyter python3 steps/tamper.pySe 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.