Comprender la función hash

¿Puede alguien explicar en detalle los componentes del hash final que determina el ganador del bloque?

Tengo entendido que los mineros están tomando

  1. La raíz de Merkle,
  2. la marca de tiempo,
  3. El hash del bloque anterior,
  4. ¿Algún otro componente?, junto con
  5. Un nonce que los mineros tienen que adivinar para que el hash de todos estos componentes, utilizando Sha256, tenga al menos 18 ceros a la izquierda.

Mis preguntas son:

  1. ¿Tengo razón en mi entendimiento hasta ahora?

  2. ¿Alguien puede explicar cuáles son los otros componentes y en qué orden se ingresan en la función hash?

  3. Usando los datos disponibles en blockchain.info sobre cada bloque, ¿puedo recrear el hash ganador ingresando los mismos datos en una calculadora Sha256?

Gracias.

Respuestas (2)

Estás muy cerca. Como ya se ha establecido en Mesh, los mineros están procesando los siguientes datos:

  • nVersión (por ejemplo, 02000000)
  • HashPrevBlock (este hash se invierte y luego se invierten cada dos bytes)
  • HashMerkleRoot (este hash se invierte y luego se invierten cada dos bytes)
  • nTime (debe convertirse a hexadecimal, por ejemplo, 358b0553)
  • nBits (dificultad objetivo, por ejemplo, 535f0119)
  • nNonce (los datos aleatorios)

Esta información se puede encontrar en la Referencia para desarrolladores de Bitcoin o en el PDF .

Ahora, a su tercera pregunta, ¡sí se puede! ¡De hecho, acabo de crear un pequeño programa en C# para hacer esto ayer! Hay un pequeño truco, porque no puedes simplemente conectar los datos directamente a una calculadora hash y verificarlos. Primero, agrega todos los campos juntos en una sola cadena (después de que se realiza la inversión y el cambio de hash para el hash de bloque anterior y la raíz de merkle). Luego, convierte esa cadena en datos binarios. En este punto, ejecuta el doble hash SHA256 para verificar que obtiene un hash válido del bloque.

Un recurso útil para que lo compruebe es Minería de Bitcoin con lápiz y papel, así como Bitcoin Wiki . Ambos recursos tienen ejemplos de código que muestran este proceso en acción.

De la documentación del desarrollador de Bitcoin.org , un encabezado de bloque consta de:

  • Versión
  • Hash de encabezado de bloque anterior
  • raíz de merkle
  • marca de tiempo
  • campo nBits
  • mientras tanto

En ese orden. Entonces, como usted dice, el único componente que falta en su lista es la versión y el campo nBits. La versión se explica por sí misma, pero el campo nBits no lo es. Lo que hace el campo nBits es codificar el objetivo actual para el algoritmo de dificultad:

tener al menos 18 ceros a la izquierda.

No siempre 18 ceros. La cantidad de ceros iniciales cambia en función de la rapidez con la que se han encontrado bloques recientemente, para mantener el tiempo de bloqueo en un promedio de aproximadamente 10 minutos a pesar de la variación de la potencia de hash en la red. A medida que se unen más mineros, aumenta el hashrate, por lo que también lo hace la dificultad (es decir, se requieren más ceros). Otra forma de pensar en los 0 es que la salida del SHA256, como un número, debe ser menor que algún número objetivo. Ese objetivo está codificado en el campo nBits. Y sí, cualquiera puede verificar que el encabezado del bloque se convierte en un número por debajo del objetivo, así es como otros clientes verifican que los bloques sean válidos, porque SHA256 siempre produce el mismo resultado a partir de la misma entrada: es determinista, una propiedad de todos los hash útiles. funciones