Glosario / Referencia para desarrolladores
OP_HASH160
- ¿Qué es OP_HASH160?
- OP_HASH160 aplica SHA-256 al elemento de la cima de la pila y luego RIPEMD-160 a ese resultado, y deja un hash de 20 bytes, la misma huella digital que lleva dentro toda dirección que empieza por 1 o por 3.
Un byte, 0xa9, que hace las veces de dos de las funciones hash más estudiadas de la criptografía. La combinación reduce un resultado de 32 bytes a 20 y protege frente a una debilidad en cualquiera de los dos algoritmos, a costa de aproximadamente 80 bits de resistencia a colisiones en lugar de 128. Es la razón de que una dirección de bitcoin sea lo bastante corta como para leerla en voz alta por teléfono.
Cómo funciona
OP_HASH160 desapila un elemento de cualquier longitud y apila exactamente 20 bytes, y el mismo valor de entrada siempre produce el mismo hash.
Las dos funciones proceden de linajes de diseño sin relación entre sí. RIPEMD-160 lo publicó en 1996 un equipo académico europeo que trabajaba abiertamente; SHA-256 salió de la NSA y el NIST lo estandarizó en 2001. Encadenarlas fue una elección conservadora. Una ruptura estructural de una de ellas seguiría dejando a la otra entre un atacante y una falsificación útil, y en tres décadas ninguna se ha roto de un modo que amenace esta construcción.
La reducción de tamaño no es cosmética. Ahorrar doce bytes en cada salida importaba cuando el objetivo era mantener pequeño un registro público global y permanente, y por eso el script de bloqueo clásico mide 25 bytes y no 37.
Veinte bytes tienen, eso sí, un techo. Encontrar dos valores de entrada que compartan un hash de 160 bits requiere del orden de 2 elevado a 80 operaciones en lugar de 2 elevado a 128, lo que resulta cómodo cuando solo usted elige la clave cuyo hash se calcula y mucho menos cómodo cuando una contraparte ayuda a elegir el script que el hash fija. Ese razonamiento es exactamente la razón por la que SegWit trasladó los compromisos de script a un único SHA-256 de 32 bytes en P2WSH y mantuvo la forma más corta para las salidas de una sola clave.
Dónde aparece
OP_HASH160 vive en dos plantillas de script, y su resultado vive dentro de casi todas las direcciones que usted ha copiado alguna vez.
Las salidas heredadas (legacy) lo ejecutan sobre una clave pública. Las salidas pay-to-script-hash lo ejecutan sobre un script de canje. En ambos casos, la dirección que usted ve es ese hash de 20 bytes con un byte de versión delante, 0x00 para las direcciones que empiezan por 1 y 0x05 para las que empiezan por 3, envuelto en una suma de comprobación Base58Check. Las salidas SegWit nativas de una sola clave llevan los mismos 20 bytes sin ningún opcode (código de operación), porque las reglas de ese tipo de salida están incorporadas en el validador en lugar de escribirse como script.
Taproot rompió la costumbre. Una salida cuya dirección empieza por bc1p fija una clave pública de 32 bytes sin ningún paso de hash intermedio, así que una dirección Taproot no contiene ningún hash160 en ninguna parte.
Esta es también la razón práctica por la que funciona comprobar una dirección en la pantalla de una billetera de hardware. Dos direcciones que difieren en cualquier punto producen dos hash sin relación entre sí, así que una dirección reemplazada no puede parecer casi correcta; comparar unos pocos caracteres del principio y del final en el dispositivo con lo que muestra su computadora basta para detectar el malware de portapapeles.
OP_HASH160 frente a SHA-256
SHA-256 es una función hash; OP_HASH160 es una instrucción que casualmente la llama una vez. La función aparece por todo bitcoin sin que intervenga ningún script: la prueba de trabajo calcula con ella dos veces el hash de un encabezado de bloque, los identificadores de las transacciones son una doble aplicación de ella y los árboles de Merkle se construyen con ella. El opcode solo existe dentro del Script de Bitcoin, solo se ejecuta mientras se gasta una salida y siempre produce 20 bytes, no 32. La composición que realiza, RIPEMD-160 de SHA-256, es lo bastante común como para tener nombre propio en el código de las billeteras, hash160, que conviene reconocer al recorrer la lista de funciones de una biblioteca.