Descripción General
Un hash es la salida de una función hash: una cadena de caracteres de tamaño fijo que representa de forma única una entrada de cualquier tamaño. En Bitcoin, los hashes se utilizan de manera generalizada: para identificar transacciones, para vincular bloques entre sí, para crear el puzzle de prueba de trabajo, y para derivar direcciones a partir de claves públicas. El hash a menudo se describe como una "huella digital" porque incluso un cambio mínimo en la entrada produce una salida completamente diferente.
Propiedades de un Buen Hash
Entrada: "Hello" → SHA-256 → 185f8db32271fe25f561a6fc938b2e26...
Entrada: "Hello." → SHA-256 → 2d8bd7d9bb5f85ba643f0110d50cb506...
Entrada: "hello" → SHA-256 → 2cf24dba5fb0a30e26e83b2ac5b9e29e...
Observaciones clave:
1. Longitud fija: Siempre 256 bits (64 caracteres hexadecimales) sin importar el tamaño de la entrada
2. Determinista: La misma entrada siempre produce el mismo hash
3. Efecto avalancha: Pequeño cambio en la entrada → hash completamente diferente
4. Unidireccional: No se puede recuperar la entrada a partir del hash
5. Resistente a colisiones: Prácticamente imposible encontrar dos entradas diferentes
que produzcan el mismo hash
Cómo Bitcoin Utiliza los Hashes
IDs de transacción (TXIDs): Cada transacción se identifica mediante el hash doble SHA-256 de sus datos serializados. Esto proporciona un identificador compacto y único para cada transacción.
Hashes de bloque: Cada bloque se identifica mediante el hash doble SHA-256 de su encabezado de 80 bytes. Este hash debe estar por debajo del objetivo actual para que el bloque sea válido (prueba de trabajo).
Vinculación de la blockchain: Cada encabezado de bloque contiene el hash del bloque anterior, creando una cadena irrompible:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Bloque N │ │ Bloque N+1 │ Bloque N+2
│ │ │ │ │ │
│ Prev: ◄──┼────│ Prev: ◄──┼────│ Prev: │
│ Hash │ │ Hash │ │ Hash │
│ │ │ │ │ │
│ Merkle │ │ Merkle │ │ Merkle │
│ Root │ │ Root │ │ Root │
└──────────┘ └──────────┘ └──────────┘
Árboles de Merkle: Los hashes de transacción se emparejan y se hashean repetidamente para formar un árbol de Merkle, con el hash raíz incluido en el encabezado del bloque.
Generación de direcciones: Las direcciones de Bitcoin se derivan hasheando las claves públicas mediante SHA-256 y RIPEMD-160.
Funciones Hash Usadas en Bitcoin
- SHA-256: Usado para minería (doble SHA-256), IDs de transacción y árboles de Merkle
- RIPEMD-160: Usado en combinación con SHA-256 para generar hashes de dirección más cortos (HASH160)
- SHA-512: Usado en HMAC-SHA512 para la derivación de claves de billetera HD
- SipHash: Usado internamente para operaciones de tabla hash para prevenir ataques DoS
Conceptos Erróneos Comunes
- Un hash no es cifrado. El cifrado es reversible con la clave correcta; el hashing es un proceso unidireccional.
- Si bien las colisiones (dos entradas con el mismo hash) son teóricamente posibles, encontrar una para SHA-256 es computacionalmente inviable con la tecnología actual.
- El término "hash" en la minería de Bitcoin se refiere a un solo intento de calcular el hash del encabezado de un bloque con un valor de nonce particular.