¿Eso demostró que para cada bloque siempre hay un valor nonce que hará que el hash del bloque comience por n conteo de 0?

Perdón por la pregunta obvia, pero estoy buscando una prueba matemática.

El encabezado del bloque se calcula como una concatenación de los siguientes valores.

  • Versión
  • hashAnteriorBloquear
  • hashMerkleRoot
  • marca de tiempo
  • bits
  • Nonce (número de 32 bits)

Los primeros 5 parámetros son estáticos para cada bloque. Miner solo intenta averiguar el valor de Nonce, de modo que Hash (Block_header) comenzará con una cierta cantidad de ceros.

¿Está probado que para cada combinación de Version, hashPrevBlock, hashMerkleRoot, timeStamp y Bits hay un valor Nonce, que hará que el hash del bloque comience con un cierto número de ceros?

En caso afirmativo, ¿puede compartir algún artículo que explique esa prueba?

hashMerkleRoot no es estático, ya que se calcula a partir del conjunto de transacciones incluidas en el bloque, que puede variar. El minero es libre de organizarlos como quiera, con la única restricción de que la primera transacción debe ser la base de monedas.
Las probabilidades de que cualquier nonce produzca un bloque válido son minúsculas. La gran mayoría de los bloques no se pueden minar. Los mineros tienen que intentar extraer miles de millones de bloques antes de tener éxito en extraer uno.
32 bits nonce + tal vez algunos bits en la marca de tiempo que puede cambiar con la esperanza de obtener un hash con 9.5 bytes de ceros al frente (19 hex-ceros) es muy poco probable (a partir de la tasa de dificultad de junio de 2020). Por lo tanto, debe cambiar su raíz de Merkle. Simplemente cambie las transacciones dentro del bloque (agregue, elimine o reorganice o modifique el tx de coinbase)
Parte del requisito de una función hash criptográfica segura es que la salida debe ser impredecible y, por lo tanto, no debería ser posible decir mucho con certeza sobre lo que puede y no puede suceder. Es abrumadoramente probable que se pueda minar cada bloque, como se explica en la respuesta. Pero si hubiera una prueba matemática de que siempre es posible, sería una indicación de que SHA256 es demasiado predecible y que no deberíamos usarlo.

Respuestas (2)

Las funciones hash criptográficas son resistentes a colisiones y los resúmenes producidos por SHA-256 se distribuyen de manera aproximadamente uniforme . Esto sugiere que si el espacio de entrada a la función hash es de magnitudes más grandes que el espacio de proyección de una función hash, esperaríamos que se pueda alcanzar cada valor del espacio de proyección.

El encabezado del bloque es de 80 bytes y el espacio de resumen de SHA-256 es de 32 bytes (256 bits). De los 80 bytes del encabezado del bloque, la versión no está restringida en 29 de 32 bits , el nonce es un valor arbitrario de 4 bytes, la raíz de Merkle es un resumen de 256 bits derivado de un enorme espacio de combinación, la marca de tiempo es bastante flexible : limitado a un rango de marca de tiempo de Unix de aproximadamente 3 h/10 800 segundos (~ 13 bits), solo se corrigen el hash de bloque anterior y la declaración de dificultad. Entonces, antes de contar la raíz de Merkle, los mineros podrían generar hasta 74 bits de entropía en el encabezado del bloque.

La raíz de Merkle se deriva del conjunto de transacciones que un minero elige incluir en su bloque de Bitcoin. El minero no solo puede elegir arbitrariamente el contenido y el orden de las transacciones (válidas), sino que también cada minero se paga a sí mismo en la transacción de base de monedas de su candidato de bloque. Dado que pagar a diferentes direcciones da como resultado diferentes transacciones de base de monedas, cada minero está trabajando en un conjunto de transacciones único cuyas raíces Merkle hacen que cualquier superposición entre los candidatos de bloque de diferentes mineros sea astronómicamente improbable. Además, partes de la entrada de la transacción de coinbase se pueden elegir arbitrariamente (el " extranonce" y la mayor parte del script de entrada restante de 2 a 100 bytes de la transacción de coinbase) brinda a los mineros una forma de agregar fácilmente más entropía al conjunto de candidatos de bloque que están evaluando. Además, los mineros actualizan la composición de transacción de su candidato de bloque cada vez que hay más transacciones nuevas pagan tasas de tarifas más altas Incluso si no hubiera transacciones para agregar en el bloque, los mineros podrían simplemente generar una dirección diferente para pagar por su uso en Coinbase después de agotar el espacio nonce y extranonce.

Dado el poder conjunto de todas las órdenes de transacción posibles, el espacio de direcciones de Bitcoin y el script de entrada de 100 bytes en suma superan con creces el tamaño de resumen de 32 bytes de SHA-256d, diría que la raíz de Merkle proporciona un total de 32 bytes. bytes de entropía.

En suma, eso les da a los mineros ~41 bytes de datos de entrada arbitrarios para producir un resumen de 32 bytes, es decir, un espacio de entrada 2 72 más grande que el espacio de proyección. Mientras tanto, un bloque solo está restringido a la dificultad actual, que es significativamente menor que 2 224 (la dificultad de requerir un hash de bloque 000…0).

Si bien esto no cumple con los requisitos de una prueba matemática rigurosa, supongo que los mineros no tienen que preocuparse por quedarse sin posibles candidatos para el bloque. Por lo tanto, es solo cuestión de tiempo hasta que alguien logre crear un nuevo bloque válido.

También vea esta pregunta estrechamente relacionada aquí: ¿ Cómo podemos estar seguros de que se encontrará un nuevo bloque? .

¡Lindo! Gracias, @Murch, tiene más sentido ahora. La respuesta agradable y detallada, gracias. Una pregunta más. Si quiero jugar con esto, cualquier forma de conectarme al grupo de transacciones no aprobadas y tratar de componer el bloque yo mismo (usando programas locales personalizados), en lugar de usar las herramientas de minería estándar de bitcoins. Cualquier API o algo similar para obtener transacciones no aprobadas.
Creo que puedes estar buscando getrawmempool . Sin embargo, no estoy seguro acerca de los programas para construir bloques a partir de eso. ¿Supongo que algún controlador minero podría funcionar?

Version, hashPrevBlock, Bits (una representación de la dificultad actual) son estáticos para el bloque actual, timeStamp es una representación de Unix de la hora actual, el minero también puede cambiarlo para cambiar el blockheader (hasta 2 horas en el futuro)