Glosario / Minería y consenso
nBits
- ¿Qué es nBits?
- nBits es el campo de cuatro bytes de cada encabezado de bloque que empaqueta el objetivo de minería en una codificación compacta, al estilo de la coma flotante, formada por un exponente y un coeficiente de tres bytes.
Bitcoin necesita un objetivo de 256 bits en un encabezado que no puede dedicarle 32 bytes, así que almacena en cuatro una versión redondeada. El primer byte es un exponente, los tres restantes son un coeficiente, y el objetivo es el coeficiente multiplicado por 256 elevado a la potencia del exponente menos tres. Cada nodo recalcula el valor que espera, así que un encabezado que declare un objetivo más fácil del que permiten las reglas se rechaza de plano.
Cómo funciona
nBits se lee como un byte de exponente seguido de un coeficiente de tres bytes, y ambos se combinan en un número completo de 256 bits.
Tome el valor que lleva el bloque génesis, 0x1d00ffff. El exponente es 0x1d, que equivale a 29, y el coeficiente es 0x00ffff, que equivale a 65.535. Por tanto, el objetivo es 65.535 multiplicado por 2 elevado a 208, un número que se escribe como ocho ceros hexadecimales, luego ffff y luego ceros hasta completar 64 dígitos. Ese es el objetivo más fácil que permite la mainnet, y es la definición de la dificultad 1.
Hay dos peculiaridades que confunden a la gente. La primera es la precisión. Un coeficiente de solo 24 bits no puede expresar un número arbitrario de 256 bits, así que el objetivo codificado siempre es un valor redondeado, y un viaje de ida y vuelta del objetivo a nBits y de nuevo al objetivo no siempre devuelve el valor de partida. La segunda es el bit de signo. Si el bit más alto del coeficiente está activado, el valor se trata como negativo, así que los codificadores desplazan el coeficiente un byte hacia abajo y aumentan el exponente para compensarlo. Por eso el valor del bloque génesis es 0x1d00ffff y no el más evidente 0x1cffff00, y por eso un byte cero a la izquierda dentro del coeficiente es normal y no un error.
En el encabezado serializado, el campo empieza en el desplazamiento de byte 72 y se escribe en little endian (el byte menos significativo primero), así que esos cuatro bytes aparecen en disco y en la red como ff ff 00 1d.
Dónde aparece
nBits circula con varios nombres distintos, y de ahí viene la mayor parte de la confusión que lo rodea.
Los exploradores de bloques lo etiquetan como "bits" y muestran el valor hexadecimal junto a una cifra de dificultad más fácil de leer. La llamada RPC getblock de Bitcoin Core lo devuelve como "bits", y la llamada RPC getblocktemplate se lo entrega al software de minería como el requisito que un encabezado candidato tiene que superar. En el código fuente es el miembro nBits de CBlockHeader, y lo convierten arith_uint256::SetCompact y GetCompact. Los pools de minería casi nunca lo muestran: Stratum envía esos mismos cuatro bytes a las máquinas dentro de una notificación de tarea, y el firmware nunca tiene que pensar en lo que significan.
Además, el campo cambia según un calendario y no de forma continua. Permanece constante durante toda una ventana de 2.016 bloques y solo toma un valor nuevo en un ajuste de dificultad, así que dos bloques minados con una hora de diferencia llevan un campo nBits idéntico, salvo que entre ellos se haya producido un ajuste.
nBits frente a objetivo de dificultad
nBits es la codificación; el objetivo de dificultad es el número que codifica. Un nodo nunca compara directamente el hash de un encabezado con nBits. Primero expande los cuatro bytes en un objetivo completo de 256 bits y después comprueba que el hash sea igual o inferior a ese valor. Tratar nBits como si fuera el propio objetivo sirve en una conversación y es un error en el código, porque dos valores de nBits que se diferencian en una sola unidad se decodifican en objetivos que difieren en una cantidad absoluta enorme.