Dificultad
¿Qué es la dificultad en Bitcoin?
La dificultad es un número que representa lo difícil que es para los mineros añadir nuevos bloques de transacciones a la blockchain.
Se ajusta cada 2 semanas para garantizar que, en promedio, se tarde 10 minutos en añadir nuevos bloques a la blockchain.
¿Por qué es importante la dificultad?
La dificultad garantiza que los bloques de transacciones se añadan a la blockchain en intervalos regulares durante la minería, incluso a medida que más mineros se unen a la red.
Si la dificultad se mantuviera igual, con el tiempo cada vez tardaría menos en añadirse nuevos bloques a la blockchain a medida que nuevos mineros se incorporaran a la red.
Así que los ajustes de dificultad hacen que la blockchain se actualice de forma constante.
¿Cuándo cambia la dificultad?
La dificultad se ajusta cada 2.016 bloques (aproximadamente cada 2 semanas).
En ese intervalo, cada nodo toma el tiempo esperado para que se minen los últimos 2.016 bloques (2016 × 10 minutos) y lo divide por el tiempo real que tomó:
esperado / real
20160 / real
Si los mineros consiguieron resolver cada bloque más rápido de lo esperado; digamos, 9 minutos por bloque, obtendrías un número como este:
20160 / 18144 = 1,11
Cada nodo usa entonces ese número para ajustar la dificultad de los próximos 2.016 bloques:
dificultad x 1,11 = nueva dificultad
- Si el número es mayor que 1 (los bloques se minaron más rápido de lo esperado), la dificultad sube.
- Si el número es menor que 1 (los bloques se minaron más lentamente de lo esperado), la dificultad baja.
Y eso es todo. Todos los mineros de la red bitcoin trabajan ahora con esa nueva dificultad durante los próximos 2.016 bloques.
La dificultad solo se ajusta por un factor de 4 como máximo (es decir, un multiplicador no mayor que 4 ni menor que 0,25). Eso evita cambios bruscos de un período de dificultad al siguiente.
¿Cómo controla la dificultad el tiempo entre bloques?
Bien, empezaré con un ejemplo simple y lo iré ampliando desde ahí.
1. Ejemplo simple
Supongamos que te doy un intervalo de números del 1 al 100.
Ahora supongamos que puedes generar aleatoriamente un número entre 1 y 100 una vez por minuto, y que tu objetivo es generar un número por debajo de mi número objetivo.
Entonces, digamos que fijo el objetivo en 50:
Como solo puedes generar un número una vez por minuto, eso debería tardar, en promedio, 2 minutos en encontrar un número por debajo de ese valor objetivo.
Pero eso es demasiado fácil. Entonces, digamos que bajo el objetivo a 20, lo que significa que solo podrás generar un número ganador 1/5 de las veces, o una vez cada 5 minutos:

Cuanto más bajo es el objetivo, más difícil resulta generar un número ganador.
Así que, como puedes ver, puedo usar la altura del objetivo para controlar cuánto tarda en encontrarse un número ganador (dependiendo de cuántos números puedas generar por minuto, claro).
No será exactamente 5 minutos cada vez, porque podrías tener suerte en el primer intento. Sin embargo, a largo plazo, da una media de intervalos de 5 minutos.
Entonces, ¿qué es la dificultad?
En lugar de decirte el valor objetivo directamente, podría darte el objetivo dividiendo el intervalo de números por un nuevo número:
Ese nuevo número es la dificultad, y se usa para modificar la altura del objetivo.
Aquí está la ecuación para establecer el objetivo usando la dificultad:
objetivo = objetivo máximo / dificultad
Así que ahora puedo usar ese valor de dificultad para ayudarme a definir el objetivo en cualquier nivel que quiera:
Por lo tanto, uso la dificultad para controlar el objetivo, que a su vez controla cuánto tarda en generarse un número ganador por debajo del objetivo.
- La dificultad es básicamente otra forma de representar el objetivo actual.
- Cuanto mayor es la dificultad, menor es el objetivo.
2. Ejemplo de Bitcoin
La dificultad en bitcoin funciona exactamente de la misma manera: se usa para definir un valor objetivo, y los mineros siguen generando números (haciendo hash de sus bloques candidatos) con la esperanza de encontrar un hash de bloque por debajo del valor objetivo:
Y como los mineros pueden generar miles de números (hashes) por segundo, bitcoin usa números extremadamente grandes para el objetivo:
Y dado que ahora hay miles de mineros intentando encontrar números ganadores, para garantizar que se encuentre un número ganador cada 10 minutos (en lugar de cada pocos segundos), el intervalo de números exitosos termina siendo absolutamente minúsculo:

Aunque ese número de dificultad parezca grande, el objetivo sigue siendo absurdamente difícil de superar. Es como una lotería.
Números hexadecimales
Como estos números objetivo son tan grandes, normalmente los mostramos en formato hexadecimal, más corto.
Por eso los hashes de bloque se ven así: 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Pero, aunque contenga letras, sigue siendo un número. Así que el objetivo es un valor hexadecimal, y los mineros intentan obtener un hash de bloque hexadecimal por debajo del objetivo.
De hecho, puedes convertir fácilmente entre hexadecimal y números "normales" (es decir, números decimales):
Conversor de Números
| Hexadecimal | 000000000004864c000000000000000000000000000000000000000000000000 |
|---|---|
| Decimal | 1861311314983800126815643622927230076368334845814253369901973504 |
| Hexadecimal | 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506 |
|---|---|
| Decimal | 1533267872647776902154320487930659211795065581998445848740226310 |
Así que por eso normalmente ves el hash y el objetivo como conjuntos de números y letras: están en hexadecimal en lugar de decimal (que es lo que los humanos conocemos mejor).
Recuerda: tanto esos números decimales como los hexadecimales tienen el mismo valor, y puedes convertir fácilmente entre ambos.
Curiosamente, la dificultad normalmente se da en formato decimal, mientras que los hashes de bloque y los objetivos se muestran en hexadecimal:
Pero, como dije, ambos son números, así que aún puedes trabajar con ellos si los conviertes al mismo formato.
¿Cómo calculas la dificultad?
La dificultad se calcula dividiendo el valor máximo posible del objetivo por el objetivo del bloque actual.
El objetivo máximo es el objetivo que se definió para el primer bloque:
objetivo máximo = 0x00000000ffff0000000000000000000000000000000000000000000000000000
Entonces, para calcular la dificultad del bloque 100.000, por ejemplo, solo necesitamos averiguar cuál era el objetivo de ese bloque:
objetivo = 0x000000000004864c000000000000000000000000000000000000000000000000
Ahora, si convertimos ambos valores a decimal y los dividimos, obtenemos la dificultad:
Conversor de Números
dificultad = objetivo máximo / objetivo
dificultad = 0x00000000ffff...0000 / 0x000000000004864c...0000
dificultad = 26959535291011309493156476344723991336010898738574164086137773096960 / 1861311314983800126815643622927230076368334845814253369901973504
dificultad = 14484,162361
Así que, como puedes ver, la dificultad es solo una representación de cuánto se ha alejado el objetivo actual de su valor máximo posible.
Internamente en Bitcoin, lo que realmente se ajusta es el objetivo. Así que la dificultad es solo una forma de representar ese cambio.
¿Cómo calculas el objetivo a partir de la dificultad?
La dificultad se calcula a partir del objetivo. Sin embargo, siempre puedes trabajar al revés y calcular el objetivo a partir de la dificultad, si lo prefieres.
Vamos a usar la dificultad para calcular el objetivo del bloque 100.000.
Vamos a hacerlo usando números decimales (en su mayoría), porque son más fáciles de entender.
Aquí está la dificultad:
bitcoin-cli getblockheader 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
{
"hash" : "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506",
...
"height" : 100000,
...
"difficulty" : 14484.16236123,
...
}
Maravilloso.
Ahora anotemos la ecuación que usaremos para encontrar el objetivo:
objetivo = objetivo máximo / dificultad
Dejemos el objetivo máximo y la dificultad listos para introducirlos en la ecuación.
objetivo máximo = 0x00000000ffff0000000000000000000000000000000000000000000000000000
dificultad = 14484,162361
- El objetivo máximo es un valor fijo; es el objetivo inicial que se definió para el primer bloque.
- El prefijo 0x se usa para indicar valores hexadecimales (el 0x no forma parte del número). La presencia de letras en el valor suele ser una pista (aunque no siempre).
- Tomé la dificultad de la información de la cabecera del bloque mostrada arriba.
El objetivo máximo está en formato hexadecimal, así que vamos a convertirlo a decimal.
Conversor de Números
objetivo máximo = 26959535291011309493156476344723991336010898738574164086137773096960
Ahora podemos simplemente introducir esos números en la ecuación y listo:
objetivo = objetivo máximo / dificultad
objetivo = 26959535291011309493156476344723991336010898738574164086137773096960 / 14484,162361
objetivo = 1861311315012765306929610463010191006516769515973403833769533170
Listo.
Así que, cuando el minero intentaba resolver el bloque 100.000, quería obtener un hash para su bloque candidato por debajo de 1861311315012765306929610463010191006516769515973403833769533170.
Comprobando los resultados
Vamos a comparar ese valor objetivo con el hash que obtuvo para el bloque, para comprobar que realmente tuvo éxito (es decir, que su hash quedó por debajo del objetivo):
objetivo = 1861311315012765306929610463010191006516769515973403833769533170
hash = 0x000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Ah, sí, el hash está en formato hexadecimal. Vamos a convertirlo de hexadecimal a decimal otra vez para poder comparar ambos números:
Conversor de Números
objetivo = 1861311315012765306929610463010191006516769515973403833769533170
hash = 1533267872647776902154320487930659211795065581998445848740226310
Sí, ese hash sí es menor que el objetivo, así que el bloque puede añadirse a la blockchain.
¿Dónde puedo encontrar la dificultad actual?
Puedes encontrar la dificultad actual usando el comando bitcoin-cli getdifficulty:
- La dificultad actual también puede encontrarse con
bitcoin-cli getmininginfo. - Aquí hay un gráfico que muestra el cambio de la dificultad a lo largo del tiempo: blockchain.com/explorer/charts/difficulty
Resumen
El objetivo es la verdadera barra de limbo que los hashes de bloque deben quedar por debajo para que se añada un nuevo bloque a la blockchain.
La dificultad es solo una medida de cuánto se ha movido el objetivo desde su valor inicial. O, dicho de otro modo, de cuánto más difícil es minar un bloque en comparación con cuando comenzó la blockchain.