La dificultad de minado en Bitcoin es un parámetro dinámico que regula la velocidad a la que se generan nuevos bloques. Ajustar este valor garantiza que, independientemente de la potencia de cómputo total de la red, el tiempo medio entre bloques se mantenga cercano a 10 minutos. A continuación se describe en detalle cómo se calcula y actualiza.
1. Fundamentos de la dificultad de minado
1.1 ¿Qué representa la dificultad
La dificultad mide lo “duro” que es encontrar un hash por debajo de un cierto objetivo (target). Cuanto mayor sea la dificultad, menor será el target y menos probable será que un minero obtenga el hash válido.
1.2 Relación entre target y dificultad
La relación matemática es:
dificultad = dificultad_1_target / target_actual
donde:
- dificultad_1_target es el target de referencia que define dificultad=1 (constante fijada en el protocolo).
- target_actual se extrae del campo nBits del bloque.
2. Parámetros y formato compacto (nBits)
2.1 Estructura de nBits
El campo nBits ocupa 4 bytes:
- 1º byte: exponente (E)
- siguientes 3 bytes: mantisa (M)
El target se calcula como:
target = M × 2^(8×(E − 3))
2.2 Constante dificultad_1_target
Por definición:
dificultad_1_target = 0x00FFFF × 2^(8×(0x1D − 3))
Esto equivale a un valor máximo de target que corresponde a dificultad=1.
3. Cálculo paso a paso de la dificultad
3.1 Extraer la mantisa y el exponente
- Obtener nBits del header del bloque (4 bytes en formato little-endian).
- Convertir al formato big-endian para separar:
- Byte 1 → E
- Bytes 2–4 → M (mantisa)
3.2 Calcular el target_actual
Aplicar la fórmula:
target_actual = M × 2^(8×(E − 3))
3.3 Obtener la dificultad
Dividir la constante de referencia por el target obtenido:
dificultad = (0x00FFFF × 2^(8×(0x1D−3))) / (M × 2^(8×(E−3)))
Se suele redondear a varios decimales para facilitar su lectura.
4. Ajuste periódico cada 2016 bloques
4.1 Objetivo temporal
Cada grupo de 2016 bloques debería tardar:
2016 bloques × 10 minutos = 1.209.600 segundos (≈ 2 semanas)
4.2 Cálculo del nuevo target
- Calcular timespan_real: diferencia entre timestamp del último y primer bloque del intervalo.
- Restringir timespan_real entre 1/4 y 4× el valor objetivo:
- Mínimo = 302.400 s
- Máximo = 4.838.400 s
- Aplicar:
target_nuevo = target_viejo × (timespan_real / 1.209.600)
- Convertir target_nuevo al formato compacto para generar el nuevo nBits.
4.2.1 Límite máximo del target
El protocolo establece un target máximo, de forma que la dificultad nunca baje de 1.
5. Ejemplo práctico
- Supongamos nBits = 0x1b0404cb
- Desglose: E=0x1b=27, M=0x0404cb=263947
- target_actual = 263947 × 2^(8×(27−3))
- dificultad = (0x00FFFF × 2^(8×(29−3))) / target_actual ≈ 16307.4209
6. Recursos y referencias
Puedes consultar detalles técnicos adicionales en el whitepaper de Bitcoin y utilizar exploradores de bloques como Blockchain.com para ver valores reales de nBits y dificultad.