¿No se supone que el objetivo de hash de Bitcoin es una potencia de 2?

Del documento técnico de Bitcoin, deduje que el hash de un bloque debe comenzar con una cierta cantidad de ceros. Y que este número de ceros se ajusta cada 2 semanas. En consecuencia, el objetivo del hash es una potencia de dos.

Requerir un cero adicional para la función hash dividirá el objetivo hash por 2.

Dicho esto, en otra pregunta sobre el intercambio (¿ Cómo se calcula la dificultad? ) parece que la dificultad se puede multiplicar por fracciones (por ejemplo, 40%).

¿Significa eso que los objetivos hash no son necesariamente potencias de 2? ¿O el objetivo está redondeado a la potencia de 2 más cercana?

Estoy un poco confundido con tu pregunta. ¿Por qué el objetivo hash sería un múltiplo de 2? Los ceros iniciales son 0000xxx, no xxx0000.
La suposición de @robert OP no es correcta, pero si lo fuera, el objetivo de hash sería una potencia de 16 (debido a la codificación hexadecimal utilizada para hash de bloque), no 2.
@chytrik En el documento técnico (Sección 4) hablan específicamente de bits (ceros o unos), no de dígitos u otro hexadecimal: "[...] el hash del bloque requiere los bits cero". Entonces, si uno se refiere al documento técnico, el objetivo sería de hecho una potencia de 2.
@Fred, ¡ah! Eso es cierto, lo había olvidado, lo siento. Cabe destacar: David Harding ha creado una página que enumera algunas 'erratas de documentos técnicos', que incluye el error de destino de hash de 'bits cero iniciales', consulte: gist.github.com/harding/...

Respuestas (2)

Contrariamente a la creencia popular, el objetivo en realidad no se basa en la cantidad de ceros iniciales. Esta es una simplificación importante que se usa para transmitir la idea general, pero en realidad no es cómo funciona el código. En cambio, el objetivo es solo un número que se ajusta por la relación entre el tiempo real entre bloques y el tiempo esperado entre bloques (con un error de un error que en realidad hace que no funcione como se esperaba). Entonces, los objetivos no son necesariamente múltiplos de 2.

Hay una advertencia adicional: la nueva dificultad solo puede ser al menos una cuarta parte y como máximo 4 veces más que la dificultad anterior. El multiplicador (la relación entre tiempos) por lo tanto debe estar entre 1/4 y 4.

Entonces, ¿básicamente no se especifica en ninguna parte, excepto en el código? Debido a que el documento técnico habla sobre la cantidad de ceros, sin dar detalles precisos de implementación...
@ Fred Sí. El documento técnico omite muchos detalles de implementación específicos que solo puede aprender leyendo el código.

Como señala la respuesta de Andrew, el 'número de ceros iniciales' es solo una simplificación, así que pensé en dar un ejemplo para ilustrar esto de manera más concreta:

Los hashes de bloque generalmente se representan en formato hexadecimal, que utiliza el conjunto de caracteres [0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f]. Pero para simplificar, podemos usar un conjunto de números de base 10 [0,1,2,3,4,5,6,7,8,9], se aplican exactamente los mismos principios.

El hash de bloque es el resultado de una operación SHA256, por lo que es un número de 256 bits, que es un número muy grande. Esto significa que la salida de la operación SHA256 será un número en el rango de 0 a 2^256. De nuevo, sin embargo, para simplificar, podemos considerar un rango de números mucho más pequeño en nuestro ejemplo, por lo que usaremos el rango de 0 a 1,000,000 en su lugar.

Ahora, imaginemos que el objetivo hash es ≤500, por lo tanto, cualquier entrada de bloque válida que proporcione una salida de 0000500o menos se consideraría un bloque válido. Imaginemos también que el objetivo hash cambia para ser ≤450para el siguiente período de dificultad, haciendo que cualquier salida de 0000450o menos sea un bloque válido.

Tenga en cuenta que estos dos objetivos "requerirían la misma cantidad de ceros a la izquierda" , pero un bloque cuyo hash 0000475solo sería válido en el período de dificultad anterior, y no en el posterior. Esto se debe a que el objetivo hash es un número específico, el número de ceros iniciales es solo una simplificación/proxy aproximado para esto.

Muy buena explicación sencilla, gracias. Me recuerda un poco a la codificación aritmética: trate todo el hash de 256 bits como un flotante (mantisa) entre [0.0 .. 1.0) y establezca el objetivo en algún valor flotante ...