Algoritmo de hash de bloque – Block hashing algorithm
La minería de Bitcoin utiliza una función de prueba de trabajo basada en hash. El algoritmo requiere los siguientes parámetros: una cadena de servicio, un nonce y un contador. En Bitcoin, la cadena de servicio está codificada en la estructura de datos del encabezado del bloque e incluye un campo de versión, el hash del bloque anterior, el hash raíz del árbol Merkle de todas las transacciones en el bloque, la hora actual y el objetivo del prueba de funcionamiento del trabajo.
Los mineros de Bitcoin comúnmente usan dos campos nonce:
- El campo Nonce que se incluye en el encabezado del bloque
- El campo extraNonce que es parte de la transacción de Coinbase
Cada campo incluye un parámetro de contador que es relativamente pequeño (32 bits). La función hash recorre todos los valores del campo Nonce y luego incrementa (o cambia) el campo extraNonce antes de pasar por todas las permutaciones de Nonce nuevamente. Incrementar el campo extraNonce implica volver a calcular la raíz del árbol de merkle ya que modifica el hash de la transacción de Coinbase.
Encabezado de bloque
Un encabezado de bloque contiene estos campos:
Campo | Propósito | Actualizado cuando … | Tamaño (bytes) |
---|---|---|---|
Versión | Bloquear número de versión | Actualiza el software y especifica una nueva versión | 4 4 |
hashPrevBlock | Hash de 256 bits del encabezado del bloque anterior | Entra un nuevo bloque | 32 |
hashMerkleRoot | Hash de 256 bits basado en todas las transacciones en el bloque | Una transacción es aceptada | 32 |
Hora | Marca de tiempo de bloque actual como segundos desde 1970-01-01T00: 00 UTC | Cada pocos segundos | 4 4 |
Pedacitos | Objetivo actual en formato compacto | La dificultad se ajusta | 4 4 |
Mientras tanto | Número de 32 bits (comienza en 0) | Se intenta un hash (incrementos) | 4 4 |
El cuerpo del bloque contiene las transacciones. Estos se cortan solo indirectamente a través de la raíz de Merkle. Debido a que las transacciones no se procesan directamente, la prueba de trabajo necesaria para extraer un bloque con 1 transacción requiere exactamente la misma cantidad de esfuerzo que para un bloque con 10,000 transacciones.
El formato de destino es una codificación de punto flotante que utiliza una mantisa de 3 bytes, el byte principal como exponente (donde solo se usan los 5 bits más bajos) y su base es 256.
No es posible que dos nodos trabajen en la misma raíz de Merkle porque la transacción de Coinbase es única para ese nodo, generando una salida hash diferente. Cada intento de hash realizado tiene la misma posibilidad de ganar que cualquier otro hash calculado en la red.
Endianess
Tenga en cuenta que el hash, que es un número de 256 bits, tiene muchos bytes cero iniciales cuando se almacena o imprime como una constante hexadecimal big-endian, pero tiene cero bytes finales cuando se almacena o imprime en little-endian. Por ejemplo, si se interpreta como una cadena y la dirección de cadena más baja (o inicio de) mantiene el byte significativo más bajo, es little-endian.
La mayoría de los exploradores de bloques muestran los valores hash como números big-endian; La notación para números es habitual (los dígitos iniciales son los dígitos más significativos leídos de izquierda a derecha).
Atribución
Este contenido se basa en el contenido de https://en.bitcoin.it/wiki/Block_hashing_algorithm bajo Creative Commons Attribution 3.0 . Aunque puede haber sido ampliamente revisado y actualizado, reconocemos a los autores originales.