Bits
La representación compacta del objetivo en el encabezado del bloque
El campo bits contiene una representación compacta del objetivo (target).
Indica el valor por debajo del cual debe quedar el hash del bloque para que el bloque sea minado, y debe representar el valor objetivo correcto para la altura del bloque en la blockchain.
Estructura
¿Cómo representa bits el objetivo?
El campo bits tiene dos partes: un exponente (1 byte) y un coeficiente (3 bytes). El objetivo es el coeficiente desplazado hacia la izquierda por el número de bytes indicado por el exponente.
Conversión
¿Cómo convertir entre objetivo y bits?
Bits a Objetivo
Para convertir bits en un objetivo, debes desplazar el coeficiente el número de bytes especificado hacia la izquierda, según indique el exponente. Por ejemplo:
Bits: 1705dd01
coeficiente (05dd01)
------
Objetivo: 00000000000000000005dd010000000000000000000000000000000000000000
<---------------------------------------------
exponente (0x17 = 23 bytes)
Objetivo a Bits
Convertir un objetivo en un campo bits es lo contrario. Tomas los 3 primeros bytes significativos del objetivo (el coeficiente) y calculas cuántos bytes están desplazados hacia la izquierda (el exponente).
No olvides que estás buscando el primer byte significativo para el coeficiente.
El primer byte significativo del coeficiente debe estar por debajo de 80. Si no lo está, debes tomar el 00 anterior como primer byte.
Esto se debe a que Bitcoin usa una codificación personalizada para valores uint256; si el bit 00800000 está activado, indica un valor negativo. Y el objetivo no puede ser negativo.
Por ejemplo, el objetivo completo del bloque 489.888 comenzaba con el byte eb (mayor que 7f), así que fue necesario usar el byte 00 anterior, dando como resultado bits 1800eb30 (en vez de 17eb304f).
Beneficios
¿Por qué convertimos el objetivo a bits?
El campo bits ahorra espacio en el encabezado del bloque.
Así que, en lugar de almacenar el objetivo completo de 32 bytes, almacenamos una representación compacta de 4 bytes.
Propósito
¿Por qué el encabezado del bloque contiene el objetivo?
Hay dos funciones principales del campo bits:
- Es útil para averiguar rápidamente cuál era el objetivo del bloque.
- Es el nivel real de precisión que el hash del bloque debe quedar por debajo para que el bloque sea minado. Así que, aunque el valor completo del objetivo tras un recálculo tenga más precisión, es la precisión del campo bits la que el hash del bloque debe quedar por debajo.
Por ejemplo, durante el recálculo del objetivo en el bloque 40.320, este habría sido el objetivo completo:
Objetivo: 00000000654657a76a76a8000000000000000000000000000000000000000000 Pero el objetivo real que un minero necesita quedar por debajo es la cantidad de precisión que puede almacenarse en el campo bits, que es:
Objetivo: 0000000065465700000000000000000000000000000000000000000000000000 Pero, como digo, esta pérdida de precisión aquí no es gran cosa. Nunca he visto un bloque minado con un hash por debajo del objetivo truncado, pero por encima del cálculo original del objetivo.
Sin embargo, no había necesidad de que Satoshi incluyera una representación compacta del objetivo en el encabezado del bloque. Los nodos calculan los valores de objetivo internamente, así que tener el objetivo en el encabezado es redundante.
No obstante, eso es lo que Satoshi decidió hacer, probablemente por alguna conveniencia. Quitarlo implicaría un hard fork, y no valdría la pena el esfuerzo, así que por eso sigue siendo parte del encabezado del bloque hoy.
Terminología
¿Por qué se llama "bits"?
No sé por qué el campo se llama "bits". Satoshi nunca explicó la razón detrás de la elección del nombre de este campo.
Es un nombre algo incómodo, porque un "bit" es la palabra usada para la unidad de datos más pequeña (es decir, 8 bits en un byte), lo cual es un poco confuso.
Tal vez sea porque estaban almacenando algunos bits del objetivo (y no la precisión completa), así que "bits" fue un nombre rápido y fácil para el campo. Es decir, todos usamos nombres rápidos de variables en medio de la programación, y no siempre resultan ser perfectos.