Dificultad para la correlación de validación de hash

En la validación de un bloque se dice que un minero tiene un bloque válido si las transacciones se pueden rastrear en la cadena y el hash del encabezado del bloque es menor que la dificultad. Me cuesta ver la relación en los bloques del mundo real que se están resolviendo.

Por ejemplo, del bloque n.º 496785 :

Dificultad ("objetivo") = 1,347,001,430,558.57 o en hexadecimal 0000000000000000000000000000000000000000000000000000001399F8AB21E

Hash extraído = 000000000000000000cf3620d570d08d1799a1cafbbfae512fdba2124665eca0

entonces me parece que el hash ahora es mayor que la dificultad, por lo que es un bloque no válido, pero obviamente este no es el caso.

También escuché que la dificultad está relacionada con la cantidad de ceros a la izquierda después del objetivo máximo, en cuyo caso puede tener sentido donde 1399F8AB21E es un número de 11 bytes y el hash después del objetivo predeterminado de 8 bytes contiene 10 bytes, que es menos que el dificultad 11 bytes de ceros.

entonces

00000000 0000000000 cf3620d570d08d1799a1cafbbfae512fdba2124665eca0
8 bytes  difficulty             some value

¿Es esto correcto? ¿Cómo funciona esto?

Respuestas (1)

No es lo mismo la dificultad que el hash de destino (objetivo en resumen).

Están inversamente relacionados, por lo que la dificultad mínima posible (de 1) da el objetivo máximo , por definición dado como ( https://en.bitcoin.it/wiki/Target ):

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Debido a que Bitcoin almacena el objetivo como un tipo de punto flotante, esto se trunca:

0x00000000FFFF00000000000000000000000000000000000000000000000000000

La dificultad actual se calcula como el objetivo máximo dividido por el objetivo actual. Por ejemplo ( https://en.bitcoin.it/wiki/Difficulty ):

0x0000000000ffff0000000000000000000000000000000000000000000000000000000000 / 0x0000000000000404CBBE00000000000000000000000000000000000000000000SETROS = 16307.420938523983

Entonces, en su ejemplo, la Dificultad = 1,347,001,430,558.57 daría el objetivo actual de:

destino_actual = 0x00000000FFFF00000000000000000000000000000000000000000000000000000 / 1,347,001,430,558.57

Si calcula esto (tenga cuidado ya que un número es hexadecimal y otro decimal), la comparación debería dar que este objetivo actual es más alto que el hash extraído de:

0x000000000000000000cf3620d570d08d1799a1cafbbfae512fdba2124665eca0

EDITAR: el cálculo con lápiz y papel me da que el objetivo actual es alrededor de:

0x000000000000000000FFFF000000000000000000000000000000000000000000

Cómo conseguí esto. 1.347.001.430.558,57 es alrededor de 1,225 * (16^10). Como el objetivo está en base 16, esto significa que dividir por 1 * (16^10) es como mover los dígitos 10 lugares a la derecha. Para obtener un resultado preciso después del cambio de dígitos, debo dividir por 1.225, pero ignoré esto en este cálculo con lápiz y papel.

EDIT2: Para ser aún más preciso, tomo 16/1.225 es alrededor de 13 ( D en hexadecimal), por lo que el objetivo es alrededor de:

0x000000000000000000D0000000000000000000000000000000000000000000000

¿ Por qué 0x00000000FFFF0000000000000000000000000000000000000000000000000000representa la versión de tipo de coma flotante truncada de 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF?