Dificultad

¿Qué es la dificultad en Bitcoin?

Ilustración que muestra la dificultad controlando el tiempo que tarda en añadirse un nuevo bloque a la blockchain.
Dificultad (ejemplo):
138.955.357.012.247,30
Altura: 952.333

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.

Diagrama que muestra un eje y entre 1 y 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:

Diagrama que muestra el número 50 en un eje y entre 1 y 100.

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:

Diagrama que muestra el número 20 en un eje y entre 1 y 100.

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:

Diagrama que muestra un número usado para controlar la altura del objetivo en un eje y entre 1 y 100.

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:

Diagrama que muestra cómo diferentes valores de dificultad pueden ajustar el valor objetivo en un eje y entre 1 y 100.

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:

Diagrama que muestra un hash de bloque intentando quedar por debajo de un valor objetivo.

Y como los mineros pueden generar miles de números (hashes) por segundo, bitcoin usa números extremadamente grandes para el objetivo:

Diagrama que muestra un eje y entre 1 y un número muy grande.

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:

Diagrama que muestra el objetivo muy bajo en relación con la escala del eje y.

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.

Diagrama que muestra el objetivo y el intervalo en hexadecimal.

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):

Ícono de herramienta Conversor de Números

Convertidor de Números

Convierte un número entre distintas bases (binaria, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
Objetivo del bloque 100.000
Hexadecimal000000000004864c000000000000000000000000000000000000000000000000
Decimal1861311314983800126815643622927230076368334845814253369901973504
Hash del bloque 100.000
Hexadecimal000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Decimal1533267872647776902154320487930659211795065581998445848740226310

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:

Diagrama que muestra el objetivo y el intervalo en hexadecimal.
El objetivo es hexadecimal, pero se almacena en un formato compacto dentro de la cabecera del bloque llamado bits.

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?

Dificultad

y la dificultad.>Convierta entre un

0x
0x
0 bytes
0d

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:

Ícono de herramienta Conversor de Números

Convertidor de Números

Convierte un número entre distintas bases (binaria, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
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.

Ícono de herramienta Conversor de Números

Convertidor de Números

Convierte un número entre distintas bases (binaria, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
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:

Ícono de herramienta Conversor de Números

Convertidor de Números

Convierte un número entre distintas bases (binaria, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
objetivo = 1861311315012765306929610463010191006516769515973403833769533170
hash = 1533267872647776902154320487930659211795065581998445848740226310

Sí, ese hash 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:

Captura de pantalla que muestra el resultado de un comando 'getdifficulty' en el cliente Bitcoin Core.
  • 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.

Recursos